@sebastienrousseau/dotfiles 0.2.481 → 0.2.499
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.
- package/docs/ARCHITECTURE.md +29 -196
- package/docs/COMPLIANCE.md +10 -10
- package/docs/COPYRIGHT +3 -4
- package/docs/OPERATIONS.md +38 -65
- package/docs/PLAN.md +3 -3
- package/docs/PR_DESCRIPTION.md +85 -84
- package/docs/ROADMAP.md +11 -11
- package/docs/ROADMAP_legacy.md +556 -0
- package/docs/SECURITY_CHECKLIST.md +1 -1
- package/docs/TASK.md +4 -4
- package/docs/WALKTHROUGH.md +33 -152
- package/package.json +17 -5
- package/scripts/backup.sh +142 -0
- package/scripts/banner.sh +20 -0
- package/scripts/benchmark.sh +20 -0
- package/scripts/build.sh +41 -0
- package/scripts/clean.sh +31 -0
- package/scripts/compile.sh +54 -0
- package/scripts/copy.sh +108 -0
- package/scripts/{tools/detect-collisions.py → detect-collisions.py} +1 -1
- package/scripts/doctor.sh +79 -0
- package/scripts/dotfiles.sh +63 -0
- package/scripts/download.sh +35 -0
- package/scripts/help.sh +57 -0
- package/scripts/lock-configs.sh +57 -0
- package/scripts/package.sh +46 -0
- package/scripts/ssh.sh +55 -0
- package/scripts/teleport.sh +23 -0
- package/scripts/{tests/test-aliases.sh → test-aliases.sh} +3 -3
- package/scripts/test_smoke.sh +88 -0
- package/scripts/unpack.sh +28 -0
- package/scripts/{diagnostics/verify_state.sh → verify_state.sh} +21 -21
- package/templates/projects/go/README.md +0 -4
- package/templates/projects/node/README.md +0 -4
- package/templates/projects/python/README.md +0 -4
- package/templates/projects/python/pyproject.toml +0 -15
- package/CHANGELOG.md +0 -285
- package/LICENSE +0 -1283
- package/README.md +0 -315
- package/docs/ALIASES.md +0 -128
- package/docs/FEATURES.md +0 -166
- package/docs/FONTS.md +0 -147
- package/docs/INSTALL.md +0 -119
- package/docs/KEYS.md +0 -40
- package/docs/KEY_ROTATION.md +0 -219
- package/docs/LEGACY_ROADMAP.md +0 -142
- package/docs/NEOVIM_IDE_GUIDE.md +0 -52
- package/docs/README.md +0 -269
- package/docs/REPO_AUDIT.md +0 -23
- package/docs/SCREENSHOTS.md +0 -116
- package/docs/SECRETS.md +0 -76
- package/docs/SECURITY.md +0 -30
- package/docs/TESTING.md +0 -190
- package/docs/TOOLS.md +0 -146
- package/docs/TROUBLESHOOTING.md +0 -112
- package/docs/UTILS.md +0 -105
- package/docs/WSL2_NIX_TROUBLESHOOTING.md +0 -723
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -101
- package/docs/adr/ADR-002-shell-performance.md +0 -121
- package/docs/adr/ADR-003-security-first.md +0 -140
- package/docs/adr/ADR-004-cli-architecture.md +0 -157
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -89
- package/docs/adr/ADR-006-shell-selection.md +0 -115
- package/docs/adr/README.md +0 -33
- package/docs/themes/README.md +0 -20
- package/dot_config/aider/aider.conf.yml +0 -32
- package/dot_config/alacritty/alacritty.toml.tmpl +0 -483
- package/dot_config/ansible/ansible.cfg.tmpl +0 -11
- package/dot_config/atuin/config.toml +0 -23
- package/dot_config/bat/config +0 -8
- package/dot_config/brave-flags.conf.tmpl +0 -7
- package/dot_config/btop/btop.conf +0 -16
- package/dot_config/btop/themes/tokyonight.theme +0 -34
- package/dot_config/bun/bunfig.toml.tmpl +0 -33
- package/dot_config/claude/mcp_servers.json +0 -49
- package/dot_config/clippy.toml +0 -55
- package/dot_config/containers/containers.conf +0 -14
- package/dot_config/curl/dot_curlrc +0 -18
- package/dot_config/dlv/config.yml +0 -39
- package/dot_config/docker/config.json.tmpl +0 -15
- package/dot_config/dotfiles/boot/README.md +0 -11
- package/dot_config/dotfiles/grub/README.md +0 -11
- package/dot_config/dotfiles/lock/README.md +0 -11
- package/dot_config/dotfiles/versions.env.tmpl +0 -19
- package/dot_config/duf/duf.conf +0 -6
- package/dot_config/duti/defaults.duti +0 -5
- package/dot_config/emoji/emoji.txt +0 -34
- package/dot_config/fastfetch/config.jsonc +0 -28
- package/dot_config/firefox/user.js +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -44
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -661
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/config.tmpl +0 -77
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf.tmpl +0 -11
- package/dot_config/go/aliases.sh +0 -61
- package/dot_config/go/env.sh +0 -24
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -305
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -66
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -309
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -21
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/ice/README.md +0 -13
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
- package/dot_config/just/justfile +0 -104
- package/dot_config/k9s/config.yaml.tmpl +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -517
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -23
- package/dot_config/lsd/config.yaml +0 -19
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -41
- package/dot_config/mongosh/mongoshrc.js +0 -67
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/nvim/init.lua +0 -4
- package/dot_config/nvim/lazy-lock.json +0 -27
- package/dot_config/nvim/lua/config/autocmds.lua +0 -63
- package/dot_config/nvim/lua/config/keymaps.lua +0 -87
- package/dot_config/nvim/lua/config/lazy.lua +0 -34
- package/dot_config/nvim/lua/config/options.lua +0 -48
- package/dot_config/nvim/lua/plugins/coding.lua +0 -234
- package/dot_config/nvim/lua/plugins/dap.lua +0 -201
- package/dot_config/nvim/lua/plugins/editor.lua +0 -59
- package/dot_config/nvim/lua/plugins/git.lua +0 -9
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -221
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -17
- package/dot_config/nvim/lua/plugins/rust.lua +0 -33
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -32
- package/dot_config/nvim/lua/plugins/ui.lua +0 -537
- package/dot_config/nvim/snippets/all.lua +0 -9
- package/dot_config/nvim/snippets/python.lua +0 -16
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/pypoetry/config.toml.tmpl +0 -6
- package/dot_config/pyrightconfig.json.tmpl +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/shell/00-container-detect.sh +0 -53
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -95
- package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
- package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -10
- package/dot_config/shell/90-theme-switch.sh +0 -70
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -35
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -23
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -119
- package/dot_config/shell/README.md +0 -267
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -124
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl.tmpl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -181
- package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -123
- package/dot_config/waybar/style.css +0 -8
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -236
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/yarn/yarnrc.yml.tmpl +0 -36
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zellij/config.kdl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -13
- package/dot_config/zsh/dot_zshenv +0 -6
- package/dot_config/zsh/dot_zshrc.tmpl +0 -199
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -5
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -123
- package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +0 -9
- package/dot_local/bin/executable_ai_core +0 -130
- package/dot_local/bin/executable_b64 +0 -59
- package/dot_local/bin/executable_dot +0 -178
- package/dot_local/bin/executable_dot_completion +0 -55
- package/dot_local/bin/executable_epoch +0 -62
- package/dot_local/bin/executable_extract +0 -108
- package/dot_local/bin/executable_git-ai-commit +0 -160
- package/dot_local/bin/executable_git-ai-diff +0 -154
- package/dot_local/bin/executable_hash +0 -123
- package/dot_local/bin/executable_hex +0 -79
- package/dot_local/bin/executable_ip +0 -37
- package/dot_local/bin/executable_jsonv +0 -54
- package/dot_local/bin/executable_jwt +0 -78
- package/dot_local/bin/executable_kill-port +0 -59
- package/dot_local/bin/executable_lorem +0 -103
- package/dot_local/bin/executable_regex +0 -96
- package/dot_local/bin/executable_tmux-sessionizer +0 -187
- package/dot_local/bin/executable_tour +0 -137
- package/dot_local/bin/executable_update +0 -108
- package/dot_local/bin/executable_uuid +0 -57
- package/dot_local/bin/executable_yamlv +0 -39
- package/dot_local/bin/executable_zig-install +0 -89
- package/dot_local/bin/voice_ops +0 -7
- package/dot_local/share/bash-completion/completions/dot +0 -54
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/install.sh +0 -255
- package/scripts/ci/validate-ci-config.sh +0 -222
- package/scripts/demo/record.sh +0 -41
- package/scripts/diagnostics/benchmark.sh +0 -201
- package/scripts/diagnostics/doctor.sh +0 -115
- package/scripts/diagnostics/drift-dashboard.sh +0 -26
- package/scripts/diagnostics/health.sh +0 -356
- package/scripts/diagnostics/history-analysis.sh +0 -77
- package/scripts/diagnostics/security-score.sh +0 -392
- package/scripts/dot/commands/appearance.sh +0 -63
- package/scripts/dot/commands/core.sh +0 -130
- package/scripts/dot/commands/diagnostics.sh +0 -100
- package/scripts/dot/commands/meta.sh +0 -117
- package/scripts/dot/commands/restore.sh +0 -209
- package/scripts/dot/commands/secrets.sh +0 -81
- package/scripts/dot/commands/security.sh +0 -73
- package/scripts/dot/commands/tools.sh +0 -228
- package/scripts/dot/lib/utils.sh +0 -72
- package/scripts/fonts/install-nerd-fonts.sh +0 -59
- package/scripts/fonts/patch-fonts.sh +0 -34
- package/scripts/ops/chezmoi-apply.sh +0 -42
- package/scripts/ops/chezmoi-diff.sh +0 -14
- package/scripts/ops/chezmoi-remove.sh +0 -43
- package/scripts/ops/chezmoi-update.sh +0 -16
- package/scripts/ops/heal.sh +0 -466
- package/scripts/ops/health-check.sh +0 -380
- package/scripts/ops/rollback.sh +0 -531
- package/scripts/ops/teleport.sh +0 -32
- package/scripts/secrets/age-init.sh +0 -69
- package/scripts/secrets/create-secrets-file.sh +0 -44
- package/scripts/secrets/encrypt-ssh-key.sh +0 -42
- package/scripts/security/backup.sh +0 -17
- package/scripts/security/dns-doh.sh +0 -29
- package/scripts/security/encryption-check.sh +0 -39
- package/scripts/security/enforce-policies.sh +0 -339
- package/scripts/security/firewall.sh +0 -34
- package/scripts/security/lock-configs.sh +0 -57
- package/scripts/security/lock-screen.sh +0 -33
- package/scripts/security/manage-secrets.sh +0 -415
- package/scripts/security/telemetry-kill.sh +0 -28
- package/scripts/security/usb-safety.sh +0 -29
- package/scripts/tests/README.md +0 -241
- package/scripts/tests/benchmark.sh +0 -91
- package/scripts/tests/framework/assertions.sh +0 -283
- package/scripts/tests/framework/mocks.sh +0 -201
- package/scripts/tests/framework/test_runner.sh +0 -189
- package/scripts/tests/integration/test_install.sh +0 -237
- package/scripts/tests/performance/benchmark_runner.sh +0 -156
- package/scripts/tests/performance/regression_check.sh +0 -73
- package/scripts/tests/performance/stress_test.sh +0 -65
- package/scripts/tests/test-docker.sh +0 -48
- package/scripts/tests/unit/test_ai_aliases.sh +0 -158
- package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
- package/scripts/tests/unit/test_backup.sh +0 -227
- package/scripts/tests/unit/test_case_functions.sh +0 -238
- package/scripts/tests/unit/test_cd_aliases.sh +0 -367
- package/scripts/tests/unit/test_dot_cli.sh +0 -217
- package/scripts/tests/unit/test_encode64.sh +0 -67
- package/scripts/tests/unit/test_environment.sh +0 -78
- package/scripts/tests/unit/test_extract.sh +0 -163
- package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
- package/scripts/tests/unit/test_genpass.sh +0 -298
- package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
- package/scripts/tests/unit/test_installers.sh +0 -172
- package/scripts/tests/unit/test_keygen.sh +0 -68
- package/scripts/tests/unit/test_logging.sh +0 -96
- package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
- package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
- package/scripts/tests/unit/test_prependpath.sh +0 -66
- package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
- package/scripts/tests/unit/test_rd.sh +0 -230
- package/scripts/tests/unit/test_security_fixes.sh +0 -130
- package/scripts/tests/unit/test_security_scripts.sh +0 -87
- package/scripts/tests/unit/test_template_validation.sh +0 -238
- package/scripts/tests/unit/test_utility_functions.sh +0 -144
- package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
- package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
- package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
- package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
- package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
- package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
- package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
- package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
- package/scripts/tests/unit/test_zipf.sh +0 -76
- package/scripts/theme/apply-gnome-theme.sh +0 -297
- package/scripts/theme/install-boot-logo.sh +0 -61
- package/scripts/theme/install-catppuccin-themes.sh +0 -346
- package/scripts/theme/install-cursors.sh +0 -24
- package/scripts/theme/install-file-icons.sh +0 -25
- package/scripts/theme/install-grub-theme.sh +0 -51
- package/scripts/theme/install-lock-icon.sh +0 -29
- package/scripts/theme/switch.sh +0 -250
- package/scripts/theme/wallpaper-rotate.sh +0 -82
- package/scripts/theme/wallpaper-sync.sh +0 -42
- package/scripts/tools/cmatrix.sh +0 -20
- package/scripts/tools/emoji-picker.sh +0 -45
- package/scripts/tools/figlet-banner.sh +0 -17
- package/scripts/tools/log-rotate.sh +0 -29
- package/scripts/tools/lolcat-wrap.sh +0 -18
- package/scripts/tools/pipes.sh +0 -47
- package/scripts/tuning/linux.sh +0 -175
- package/scripts/tuning/macos.sh +0 -46
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Universal archive extraction
|
|
3
|
-
# Usage: extract <file> [destination]
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
if [[ $# -lt 1 ]]; then
|
|
8
|
-
echo "Usage: extract <file> [destination]"
|
|
9
|
-
echo "Supported formats: tar, tar.gz, tar.bz2, tar.xz, tar.zst, gz, bz2, xz, zst, zip, rar, 7z, deb, rpm"
|
|
10
|
-
exit 1
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
FILE="$1"
|
|
14
|
-
DEST="${2:-.}"
|
|
15
|
-
|
|
16
|
-
if [[ ! -f "$FILE" ]]; then
|
|
17
|
-
echo "Error: File not found: $FILE"
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
# Create destination if needed
|
|
22
|
-
mkdir -p "$DEST"
|
|
23
|
-
|
|
24
|
-
echo "Extracting: $FILE"
|
|
25
|
-
|
|
26
|
-
case "$FILE" in
|
|
27
|
-
*.tar.bz2|*.tbz2)
|
|
28
|
-
tar xjf "$FILE" -C "$DEST"
|
|
29
|
-
;;
|
|
30
|
-
*.tar.gz|*.tgz)
|
|
31
|
-
tar xzf "$FILE" -C "$DEST"
|
|
32
|
-
;;
|
|
33
|
-
*.tar.xz|*.txz)
|
|
34
|
-
tar xJf "$FILE" -C "$DEST"
|
|
35
|
-
;;
|
|
36
|
-
*.tar.zst|*.tzst)
|
|
37
|
-
tar --zstd -xf "$FILE" -C "$DEST"
|
|
38
|
-
;;
|
|
39
|
-
*.tar)
|
|
40
|
-
tar xf "$FILE" -C "$DEST"
|
|
41
|
-
;;
|
|
42
|
-
*.bz2)
|
|
43
|
-
bunzip2 -k "$FILE"
|
|
44
|
-
;;
|
|
45
|
-
*.gz)
|
|
46
|
-
gunzip -k "$FILE"
|
|
47
|
-
;;
|
|
48
|
-
*.xz)
|
|
49
|
-
unxz -k "$FILE"
|
|
50
|
-
;;
|
|
51
|
-
*.zst)
|
|
52
|
-
unzstd -k "$FILE"
|
|
53
|
-
;;
|
|
54
|
-
*.zip|*.jar|*.war|*.ear)
|
|
55
|
-
unzip -q "$FILE" -d "$DEST"
|
|
56
|
-
;;
|
|
57
|
-
*.rar)
|
|
58
|
-
if command -v unrar >/dev/null 2>&1; then
|
|
59
|
-
unrar x "$FILE" "$DEST/"
|
|
60
|
-
elif command -v 7z >/dev/null 2>&1; then
|
|
61
|
-
7z x "$FILE" -o"$DEST"
|
|
62
|
-
else
|
|
63
|
-
echo "Error: unrar or 7z required for .rar files"
|
|
64
|
-
exit 1
|
|
65
|
-
fi
|
|
66
|
-
;;
|
|
67
|
-
*.7z)
|
|
68
|
-
if command -v 7z >/dev/null 2>&1; then
|
|
69
|
-
7z x "$FILE" -o"$DEST"
|
|
70
|
-
else
|
|
71
|
-
echo "Error: 7z required for .7z files"
|
|
72
|
-
exit 1
|
|
73
|
-
fi
|
|
74
|
-
;;
|
|
75
|
-
*.deb)
|
|
76
|
-
if command -v dpkg-deb >/dev/null 2>&1; then
|
|
77
|
-
dpkg-deb -x "$FILE" "$DEST"
|
|
78
|
-
elif command -v ar >/dev/null 2>&1; then
|
|
79
|
-
cd "$DEST" && ar x "$FILE"
|
|
80
|
-
else
|
|
81
|
-
echo "Error: dpkg-deb or ar required for .deb files"
|
|
82
|
-
exit 1
|
|
83
|
-
fi
|
|
84
|
-
;;
|
|
85
|
-
*.rpm)
|
|
86
|
-
if command -v rpm2cpio >/dev/null 2>&1; then
|
|
87
|
-
cd "$DEST" && rpm2cpio "$FILE" | cpio -idmv
|
|
88
|
-
else
|
|
89
|
-
echo "Error: rpm2cpio required for .rpm files"
|
|
90
|
-
exit 1
|
|
91
|
-
fi
|
|
92
|
-
;;
|
|
93
|
-
*.Z)
|
|
94
|
-
uncompress "$FILE"
|
|
95
|
-
;;
|
|
96
|
-
*.lzma)
|
|
97
|
-
unlzma -k "$FILE"
|
|
98
|
-
;;
|
|
99
|
-
*.lz4)
|
|
100
|
-
lz4 -d "$FILE"
|
|
101
|
-
;;
|
|
102
|
-
*)
|
|
103
|
-
echo "Error: Unknown archive format: $FILE"
|
|
104
|
-
exit 1
|
|
105
|
-
;;
|
|
106
|
-
esac
|
|
107
|
-
|
|
108
|
-
echo "Extracted to: $DEST"
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# git-ai-commit - Generate commit messages using AI
|
|
3
|
-
# Managed by chezmoi - https://github.com/sebastienrousseau/dotfiles
|
|
4
|
-
#
|
|
5
|
-
# Usage: git ai-commit [--provider <provider>] [--edit]
|
|
6
|
-
# --provider: claude, gemini, sgpt, ollama (auto-detected if not specified)
|
|
7
|
-
# --edit: Open editor to modify the generated message before committing
|
|
8
|
-
|
|
9
|
-
set -euo pipefail
|
|
10
|
-
|
|
11
|
-
# Colors
|
|
12
|
-
RED='\033[0;31m'
|
|
13
|
-
GREEN='\033[0;32m'
|
|
14
|
-
YELLOW='\033[1;33m'
|
|
15
|
-
BLUE='\033[0;34m'
|
|
16
|
-
NC='\033[0m'
|
|
17
|
-
|
|
18
|
-
EDIT_MODE=false
|
|
19
|
-
PROVIDER=""
|
|
20
|
-
|
|
21
|
-
# Parse arguments
|
|
22
|
-
while [[ $# -gt 0 ]]; do
|
|
23
|
-
case $1 in
|
|
24
|
-
--provider|-p)
|
|
25
|
-
PROVIDER="$2"
|
|
26
|
-
shift 2
|
|
27
|
-
;;
|
|
28
|
-
--edit|-e)
|
|
29
|
-
EDIT_MODE=true
|
|
30
|
-
shift
|
|
31
|
-
;;
|
|
32
|
-
--help|-h)
|
|
33
|
-
echo "Usage: git ai-commit [--provider <provider>] [--edit]"
|
|
34
|
-
echo ""
|
|
35
|
-
echo "Options:"
|
|
36
|
-
echo " --provider, -p AI provider: claude, gemini, sgpt, ollama, aider"
|
|
37
|
-
echo " --edit, -e Open editor to modify generated message"
|
|
38
|
-
echo ""
|
|
39
|
-
echo "Environment:"
|
|
40
|
-
echo " GIT_AI_PROVIDER Default AI provider"
|
|
41
|
-
exit 0
|
|
42
|
-
;;
|
|
43
|
-
*)
|
|
44
|
-
echo -e "${RED}Unknown option: $1${NC}"
|
|
45
|
-
exit 1
|
|
46
|
-
;;
|
|
47
|
-
esac
|
|
48
|
-
done
|
|
49
|
-
|
|
50
|
-
# Auto-detect provider if not specified
|
|
51
|
-
detect_provider() {
|
|
52
|
-
if [[ -n "${GIT_AI_PROVIDER:-}" ]]; then
|
|
53
|
-
echo "$GIT_AI_PROVIDER"
|
|
54
|
-
elif command -v claude >/dev/null 2>&1; then
|
|
55
|
-
echo "claude"
|
|
56
|
-
elif command -v aider >/dev/null 2>&1; then
|
|
57
|
-
echo "aider"
|
|
58
|
-
elif command -v gemini >/dev/null 2>&1; then
|
|
59
|
-
echo "gemini"
|
|
60
|
-
elif command -v sgpt >/dev/null 2>&1; then
|
|
61
|
-
echo "sgpt"
|
|
62
|
-
elif command -v ollama >/dev/null 2>&1; then
|
|
63
|
-
echo "ollama"
|
|
64
|
-
else
|
|
65
|
-
echo ""
|
|
66
|
-
fi
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
PROVIDER="${PROVIDER:-$(detect_provider)}"
|
|
70
|
-
|
|
71
|
-
if [[ -z "$PROVIDER" ]]; then
|
|
72
|
-
echo -e "${RED}Error: No AI provider found. Install claude, gemini, sgpt, aider, or ollama.${NC}"
|
|
73
|
-
exit 1
|
|
74
|
-
fi
|
|
75
|
-
|
|
76
|
-
# Check if there are staged changes
|
|
77
|
-
if ! git diff --cached --quiet; then
|
|
78
|
-
DIFF=$(git diff --cached --stat)
|
|
79
|
-
DIFF_CONTENT=$(git diff --cached)
|
|
80
|
-
else
|
|
81
|
-
echo -e "${YELLOW}No staged changes. Stage changes with 'git add' first.${NC}"
|
|
82
|
-
exit 1
|
|
83
|
-
fi
|
|
84
|
-
|
|
85
|
-
echo -e "${BLUE}Generating commit message using ${PROVIDER}...${NC}"
|
|
86
|
-
|
|
87
|
-
# Prompt for commit message generation
|
|
88
|
-
PROMPT="Generate a concise, conventional commit message for the following git diff.
|
|
89
|
-
|
|
90
|
-
Rules:
|
|
91
|
-
1. Use conventional commits format: type(scope): description
|
|
92
|
-
2. Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore
|
|
93
|
-
3. Keep the first line under 72 characters
|
|
94
|
-
4. Add a blank line and bullet points for details if needed
|
|
95
|
-
5. Focus on WHAT changed and WHY, not HOW
|
|
96
|
-
|
|
97
|
-
Diff summary:
|
|
98
|
-
$DIFF
|
|
99
|
-
|
|
100
|
-
Diff content:
|
|
101
|
-
$DIFF_CONTENT
|
|
102
|
-
|
|
103
|
-
Return ONLY the commit message, no explanations or markdown formatting."
|
|
104
|
-
|
|
105
|
-
# Generate message based on provider
|
|
106
|
-
case "$PROVIDER" in
|
|
107
|
-
claude)
|
|
108
|
-
MESSAGE=$(echo "$PROMPT" | claude --print 2>/dev/null || echo "")
|
|
109
|
-
;;
|
|
110
|
-
aider)
|
|
111
|
-
MESSAGE=$(echo "$PROMPT" | aider --message "$PROMPT" --no-git --yes 2>/dev/null | tail -20 || echo "")
|
|
112
|
-
;;
|
|
113
|
-
gemini)
|
|
114
|
-
MESSAGE=$(echo "$PROMPT" | gemini 2>/dev/null || echo "")
|
|
115
|
-
;;
|
|
116
|
-
sgpt)
|
|
117
|
-
MESSAGE=$(sgpt "$PROMPT" 2>/dev/null || echo "")
|
|
118
|
-
;;
|
|
119
|
-
ollama)
|
|
120
|
-
MODEL="${OLLAMA_MODEL:-llama3.2}"
|
|
121
|
-
MESSAGE=$(echo "$PROMPT" | ollama run "$MODEL" 2>/dev/null || echo "")
|
|
122
|
-
;;
|
|
123
|
-
*)
|
|
124
|
-
echo -e "${RED}Unknown provider: $PROVIDER${NC}"
|
|
125
|
-
exit 1
|
|
126
|
-
;;
|
|
127
|
-
esac
|
|
128
|
-
|
|
129
|
-
# Clean up the message
|
|
130
|
-
MESSAGE=$(echo "$MESSAGE" | sed 's/^```[a-z]*//g' | sed 's/```$//g' | sed '/^$/d' | head -20)
|
|
131
|
-
|
|
132
|
-
if [[ -z "$MESSAGE" ]]; then
|
|
133
|
-
echo -e "${RED}Failed to generate commit message.${NC}"
|
|
134
|
-
exit 1
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
echo -e "${GREEN}Generated commit message:${NC}"
|
|
138
|
-
echo "---"
|
|
139
|
-
echo "$MESSAGE"
|
|
140
|
-
echo "---"
|
|
141
|
-
|
|
142
|
-
if [[ "$EDIT_MODE" == "true" ]]; then
|
|
143
|
-
# Create temp file for editing
|
|
144
|
-
TMPFILE=$(mktemp)
|
|
145
|
-
echo "$MESSAGE" > "$TMPFILE"
|
|
146
|
-
${EDITOR:-vim} "$TMPFILE"
|
|
147
|
-
MESSAGE=$(cat "$TMPFILE")
|
|
148
|
-
rm -f "$TMPFILE"
|
|
149
|
-
fi
|
|
150
|
-
|
|
151
|
-
# Confirm and commit
|
|
152
|
-
echo ""
|
|
153
|
-
read -p "Commit with this message? [Y/n] " -n 1 -r
|
|
154
|
-
echo
|
|
155
|
-
if [[ $REPLY =~ ^[Yy]$ ]] || [[ -z $REPLY ]]; then
|
|
156
|
-
git commit -m "$MESSAGE"
|
|
157
|
-
echo -e "${GREEN}Committed successfully!${NC}"
|
|
158
|
-
else
|
|
159
|
-
echo -e "${YELLOW}Commit cancelled.${NC}"
|
|
160
|
-
fi
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# git-ai-diff - AI-powered diff analysis and review
|
|
3
|
-
# Managed by chezmoi - https://github.com/sebastienrousseau/dotfiles
|
|
4
|
-
#
|
|
5
|
-
# Usage: git ai-diff [<commit>] [--provider <provider>]
|
|
6
|
-
# <commit>: Compare against this commit (default: HEAD)
|
|
7
|
-
# --provider: claude, gemini, sgpt, ollama (auto-detected if not specified)
|
|
8
|
-
|
|
9
|
-
set -euo pipefail
|
|
10
|
-
|
|
11
|
-
# Colors
|
|
12
|
-
RED='\033[0;31m'
|
|
13
|
-
GREEN='\033[0;32m'
|
|
14
|
-
YELLOW='\033[1;33m'
|
|
15
|
-
BLUE='\033[0;34m'
|
|
16
|
-
CYAN='\033[0;36m'
|
|
17
|
-
NC='\033[0m'
|
|
18
|
-
|
|
19
|
-
PROVIDER=""
|
|
20
|
-
TARGET="HEAD"
|
|
21
|
-
STAGED_ONLY=false
|
|
22
|
-
|
|
23
|
-
# Parse arguments
|
|
24
|
-
while [[ $# -gt 0 ]]; do
|
|
25
|
-
case $1 in
|
|
26
|
-
--provider|-p)
|
|
27
|
-
PROVIDER="$2"
|
|
28
|
-
shift 2
|
|
29
|
-
;;
|
|
30
|
-
--staged|-s)
|
|
31
|
-
STAGED_ONLY=true
|
|
32
|
-
shift
|
|
33
|
-
;;
|
|
34
|
-
--help|-h)
|
|
35
|
-
echo "Usage: git ai-diff [<commit>] [--provider <provider>] [--staged]"
|
|
36
|
-
echo ""
|
|
37
|
-
echo "Options:"
|
|
38
|
-
echo " <commit> Compare against this commit (default: HEAD)"
|
|
39
|
-
echo " --provider, -p AI provider: claude, gemini, sgpt, ollama, aider"
|
|
40
|
-
echo " --staged, -s Review only staged changes"
|
|
41
|
-
echo ""
|
|
42
|
-
echo "Environment:"
|
|
43
|
-
echo " GIT_AI_PROVIDER Default AI provider"
|
|
44
|
-
exit 0
|
|
45
|
-
;;
|
|
46
|
-
-*)
|
|
47
|
-
echo -e "${RED}Unknown option: $1${NC}"
|
|
48
|
-
exit 1
|
|
49
|
-
;;
|
|
50
|
-
*)
|
|
51
|
-
TARGET="$1"
|
|
52
|
-
shift
|
|
53
|
-
;;
|
|
54
|
-
esac
|
|
55
|
-
done
|
|
56
|
-
|
|
57
|
-
# Auto-detect provider if not specified
|
|
58
|
-
detect_provider() {
|
|
59
|
-
if [[ -n "${GIT_AI_PROVIDER:-}" ]]; then
|
|
60
|
-
echo "$GIT_AI_PROVIDER"
|
|
61
|
-
elif command -v claude >/dev/null 2>&1; then
|
|
62
|
-
echo "claude"
|
|
63
|
-
elif command -v aider >/dev/null 2>&1; then
|
|
64
|
-
echo "aider"
|
|
65
|
-
elif command -v gemini >/dev/null 2>&1; then
|
|
66
|
-
echo "gemini"
|
|
67
|
-
elif command -v sgpt >/dev/null 2>&1; then
|
|
68
|
-
echo "sgpt"
|
|
69
|
-
elif command -v ollama >/dev/null 2>&1; then
|
|
70
|
-
echo "ollama"
|
|
71
|
-
else
|
|
72
|
-
echo ""
|
|
73
|
-
fi
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
PROVIDER="${PROVIDER:-$(detect_provider)}"
|
|
77
|
-
|
|
78
|
-
if [[ -z "$PROVIDER" ]]; then
|
|
79
|
-
echo -e "${RED}Error: No AI provider found. Install claude, gemini, sgpt, aider, or ollama.${NC}"
|
|
80
|
-
exit 1
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
# Get the diff
|
|
84
|
-
if [[ "$STAGED_ONLY" == "true" ]]; then
|
|
85
|
-
DIFF=$(git diff --cached)
|
|
86
|
-
DIFF_STAT=$(git diff --cached --stat)
|
|
87
|
-
CONTEXT="staged changes"
|
|
88
|
-
else
|
|
89
|
-
DIFF=$(git diff "$TARGET")
|
|
90
|
-
DIFF_STAT=$(git diff "$TARGET" --stat)
|
|
91
|
-
CONTEXT="changes compared to $TARGET"
|
|
92
|
-
fi
|
|
93
|
-
|
|
94
|
-
if [[ -z "$DIFF" ]]; then
|
|
95
|
-
echo -e "${YELLOW}No changes to review.${NC}"
|
|
96
|
-
exit 0
|
|
97
|
-
fi
|
|
98
|
-
|
|
99
|
-
echo -e "${BLUE}Analyzing ${CONTEXT} using ${PROVIDER}...${NC}"
|
|
100
|
-
echo ""
|
|
101
|
-
echo -e "${CYAN}Changed files:${NC}"
|
|
102
|
-
echo "$DIFF_STAT"
|
|
103
|
-
echo ""
|
|
104
|
-
|
|
105
|
-
# Prompt for diff analysis
|
|
106
|
-
PROMPT="You are an expert code reviewer. Analyze the following git diff and provide:
|
|
107
|
-
|
|
108
|
-
1. **Summary**: Brief overview of what changed (2-3 sentences)
|
|
109
|
-
2. **Key Changes**: Bullet points of important modifications
|
|
110
|
-
3. **Potential Issues**: Any bugs, security issues, or code smells you notice
|
|
111
|
-
4. **Suggestions**: Improvements or best practices to consider
|
|
112
|
-
5. **Risk Level**: Low/Medium/High with brief justification
|
|
113
|
-
|
|
114
|
-
Be concise but thorough. Focus on actionable feedback.
|
|
115
|
-
|
|
116
|
-
Diff:
|
|
117
|
-
\`\`\`diff
|
|
118
|
-
$DIFF
|
|
119
|
-
\`\`\`"
|
|
120
|
-
|
|
121
|
-
# Generate analysis based on provider
|
|
122
|
-
case "$PROVIDER" in
|
|
123
|
-
claude)
|
|
124
|
-
ANALYSIS=$(echo "$PROMPT" | claude --print 2>/dev/null || echo "")
|
|
125
|
-
;;
|
|
126
|
-
aider)
|
|
127
|
-
ANALYSIS=$(aider --message "$PROMPT" --no-git --yes 2>/dev/null | tail -50 || echo "")
|
|
128
|
-
;;
|
|
129
|
-
gemini)
|
|
130
|
-
ANALYSIS=$(echo "$PROMPT" | gemini 2>/dev/null || echo "")
|
|
131
|
-
;;
|
|
132
|
-
sgpt)
|
|
133
|
-
ANALYSIS=$(sgpt "$PROMPT" 2>/dev/null || echo "")
|
|
134
|
-
;;
|
|
135
|
-
ollama)
|
|
136
|
-
MODEL="${OLLAMA_MODEL:-llama3.2}"
|
|
137
|
-
ANALYSIS=$(echo "$PROMPT" | ollama run "$MODEL" 2>/dev/null || echo "")
|
|
138
|
-
;;
|
|
139
|
-
*)
|
|
140
|
-
echo -e "${RED}Unknown provider: $PROVIDER${NC}"
|
|
141
|
-
exit 1
|
|
142
|
-
;;
|
|
143
|
-
esac
|
|
144
|
-
|
|
145
|
-
if [[ -z "$ANALYSIS" ]]; then
|
|
146
|
-
echo -e "${RED}Failed to analyze diff.${NC}"
|
|
147
|
-
exit 1
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
echo -e "${GREEN}=== AI Code Review ===${NC}"
|
|
151
|
-
echo ""
|
|
152
|
-
echo "$ANALYSIS"
|
|
153
|
-
echo ""
|
|
154
|
-
echo -e "${GREEN}=== End Review ===${NC}"
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Hash calculator (MD5, SHA1, SHA256, SHA512)
|
|
3
|
-
# Usage: hash [algorithm] <string|file>
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
usage() {
|
|
8
|
-
echo "Usage: hash [OPTIONS] [INPUT]"
|
|
9
|
-
echo ""
|
|
10
|
-
echo "Algorithms:"
|
|
11
|
-
echo " -m, --md5 MD5 hash"
|
|
12
|
-
echo " -1, --sha1 SHA-1 hash"
|
|
13
|
-
echo " -2, --sha256 SHA-256 hash (default)"
|
|
14
|
-
echo " -5, --sha512 SHA-512 hash"
|
|
15
|
-
echo " -a, --all Show all hashes"
|
|
16
|
-
echo ""
|
|
17
|
-
echo "Options:"
|
|
18
|
-
echo " -f, --file Hash file contents"
|
|
19
|
-
echo " -c, --check Verify hash (input: hash to verify)"
|
|
20
|
-
echo " -h, --help Show this help"
|
|
21
|
-
echo ""
|
|
22
|
-
echo "Examples:"
|
|
23
|
-
echo " hash 'hello' # SHA256 of string"
|
|
24
|
-
echo " hash -m 'hello' # MD5 of string"
|
|
25
|
-
echo " hash -f myfile.txt # SHA256 of file"
|
|
26
|
-
echo " hash -a 'hello' # All hashes"
|
|
27
|
-
echo " hash -c abc123 'hello' # Verify hash"
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
ALGO="sha256"
|
|
31
|
-
FILE_MODE=false
|
|
32
|
-
CHECK_MODE=false
|
|
33
|
-
ALL_MODE=false
|
|
34
|
-
|
|
35
|
-
while [[ $# -gt 0 ]]; do
|
|
36
|
-
case "$1" in
|
|
37
|
-
-m|--md5) ALGO="md5"; shift ;;
|
|
38
|
-
-1|--sha1) ALGO="sha1"; shift ;;
|
|
39
|
-
-2|--sha256) ALGO="sha256"; shift ;;
|
|
40
|
-
-5|--sha512) ALGO="sha512"; shift ;;
|
|
41
|
-
-a|--all) ALL_MODE=true; shift ;;
|
|
42
|
-
-f|--file) FILE_MODE=true; shift ;;
|
|
43
|
-
-c|--check) CHECK_MODE=true; EXPECTED="$2"; shift 2 ;;
|
|
44
|
-
-h|--help) usage; exit 0 ;;
|
|
45
|
-
-*) echo "Unknown option: $1"; usage; exit 1 ;;
|
|
46
|
-
*) break ;;
|
|
47
|
-
esac
|
|
48
|
-
done
|
|
49
|
-
|
|
50
|
-
# Get hash command based on algorithm
|
|
51
|
-
get_hash_cmd() {
|
|
52
|
-
local algo="$1"
|
|
53
|
-
case "$algo" in
|
|
54
|
-
md5)
|
|
55
|
-
if command -v md5sum >/dev/null 2>&1; then echo "md5sum"
|
|
56
|
-
elif command -v md5 >/dev/null 2>&1; then echo "md5 -q"
|
|
57
|
-
else echo "openssl md5 -r"; fi
|
|
58
|
-
;;
|
|
59
|
-
sha1)
|
|
60
|
-
if command -v sha1sum >/dev/null 2>&1; then echo "sha1sum"
|
|
61
|
-
elif command -v shasum >/dev/null 2>&1; then echo "shasum -a 1"
|
|
62
|
-
else echo "openssl sha1 -r"; fi
|
|
63
|
-
;;
|
|
64
|
-
sha256)
|
|
65
|
-
if command -v sha256sum >/dev/null 2>&1; then echo "sha256sum"
|
|
66
|
-
elif command -v shasum >/dev/null 2>&1; then echo "shasum -a 256"
|
|
67
|
-
else echo "openssl sha256 -r"; fi
|
|
68
|
-
;;
|
|
69
|
-
sha512)
|
|
70
|
-
if command -v sha512sum >/dev/null 2>&1; then echo "sha512sum"
|
|
71
|
-
elif command -v shasum >/dev/null 2>&1; then echo "shasum -a 512"
|
|
72
|
-
else echo "openssl sha512 -r"; fi
|
|
73
|
-
;;
|
|
74
|
-
esac
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
compute_hash() {
|
|
78
|
-
local algo="$1"
|
|
79
|
-
local input="$2"
|
|
80
|
-
local cmd=$(get_hash_cmd "$algo")
|
|
81
|
-
|
|
82
|
-
if $FILE_MODE; then
|
|
83
|
-
$cmd "$input" | awk '{print $1}'
|
|
84
|
-
else
|
|
85
|
-
echo -n "$input" | $cmd | awk '{print $1}'
|
|
86
|
-
fi
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
# Get input
|
|
90
|
-
if [[ $# -gt 0 ]]; then
|
|
91
|
-
INPUT="$1"
|
|
92
|
-
else
|
|
93
|
-
read -r INPUT
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
# Validate file mode
|
|
97
|
-
if $FILE_MODE && [[ ! -f "$INPUT" ]]; then
|
|
98
|
-
echo "Error: File not found: $INPUT"
|
|
99
|
-
exit 1
|
|
100
|
-
fi
|
|
101
|
-
|
|
102
|
-
if $ALL_MODE; then
|
|
103
|
-
echo "MD5: $(compute_hash md5 "$INPUT")"
|
|
104
|
-
echo "SHA1: $(compute_hash sha1 "$INPUT")"
|
|
105
|
-
echo "SHA256: $(compute_hash sha256 "$INPUT")"
|
|
106
|
-
echo "SHA512: $(compute_hash sha512 "$INPUT")"
|
|
107
|
-
elif $CHECK_MODE; then
|
|
108
|
-
COMPUTED=$(compute_hash "$ALGO" "$INPUT")
|
|
109
|
-
EXPECTED_LOWER=$(echo "$EXPECTED" | tr '[:upper:]' '[:lower:]')
|
|
110
|
-
COMPUTED_LOWER=$(echo "$COMPUTED" | tr '[:upper:]' '[:lower:]')
|
|
111
|
-
|
|
112
|
-
if [[ "$EXPECTED_LOWER" == "$COMPUTED_LOWER" ]]; then
|
|
113
|
-
echo "✓ Hash matches"
|
|
114
|
-
exit 0
|
|
115
|
-
else
|
|
116
|
-
echo "✗ Hash mismatch"
|
|
117
|
-
echo " Expected: $EXPECTED"
|
|
118
|
-
echo " Got: $COMPUTED"
|
|
119
|
-
exit 1
|
|
120
|
-
fi
|
|
121
|
-
else
|
|
122
|
-
compute_hash "$ALGO" "$INPUT"
|
|
123
|
-
fi
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Hex viewer/converter
|
|
3
|
-
# Usage: hex <file> | hex -e <string> | hex -d <hex>
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
usage() {
|
|
8
|
-
echo "Usage: hex [OPTIONS] [INPUT]"
|
|
9
|
-
echo ""
|
|
10
|
-
echo "Options:"
|
|
11
|
-
echo " -e, --encode Convert string to hex"
|
|
12
|
-
echo " -d, --decode Convert hex to string"
|
|
13
|
-
echo " -c, --color Colorize output"
|
|
14
|
-
echo " -n, --length N Bytes per line (default: 16)"
|
|
15
|
-
echo " -h, --help Show this help"
|
|
16
|
-
echo ""
|
|
17
|
-
echo "Examples:"
|
|
18
|
-
echo " hex file.bin # View file in hex"
|
|
19
|
-
echo " hex -e 'hello' # String to hex"
|
|
20
|
-
echo " hex -d '68656c6c6f' # Hex to string"
|
|
21
|
-
echo " cat file | hex # View stdin in hex"
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
MODE="view"
|
|
25
|
-
COLOR=false
|
|
26
|
-
BYTES_PER_LINE=16
|
|
27
|
-
|
|
28
|
-
while [[ $# -gt 0 ]]; do
|
|
29
|
-
case "$1" in
|
|
30
|
-
-e|--encode) MODE="encode"; shift ;;
|
|
31
|
-
-d|--decode) MODE="decode"; shift ;;
|
|
32
|
-
-c|--color) COLOR=true; shift ;;
|
|
33
|
-
-n|--length) BYTES_PER_LINE="$2"; shift 2 ;;
|
|
34
|
-
-h|--help) usage; exit 0 ;;
|
|
35
|
-
-*) echo "Unknown option: $1"; usage; exit 1 ;;
|
|
36
|
-
*) break ;;
|
|
37
|
-
esac
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
case "$MODE" in
|
|
41
|
-
encode)
|
|
42
|
-
INPUT="${1:-}"
|
|
43
|
-
[[ -z "$INPUT" ]] && read -r INPUT
|
|
44
|
-
echo -n "$INPUT" | xxd -p | tr -d '\n'
|
|
45
|
-
echo
|
|
46
|
-
;;
|
|
47
|
-
|
|
48
|
-
decode)
|
|
49
|
-
INPUT="${1:-}"
|
|
50
|
-
[[ -z "$INPUT" ]] && read -r INPUT
|
|
51
|
-
# Remove spaces and newlines
|
|
52
|
-
INPUT=$(echo "$INPUT" | tr -d ' \n')
|
|
53
|
-
echo "$INPUT" | xxd -r -p
|
|
54
|
-
echo
|
|
55
|
-
;;
|
|
56
|
-
|
|
57
|
-
view)
|
|
58
|
-
if [[ $# -gt 0 ]] && [[ -f "$1" ]]; then
|
|
59
|
-
INPUT_FILE="$1"
|
|
60
|
-
else
|
|
61
|
-
INPUT_FILE="-"
|
|
62
|
-
fi
|
|
63
|
-
|
|
64
|
-
if command -v xxd >/dev/null 2>&1; then
|
|
65
|
-
if $COLOR && command -v bat >/dev/null 2>&1; then
|
|
66
|
-
xxd -c "$BYTES_PER_LINE" "$INPUT_FILE" | bat --language=xxd --style=plain
|
|
67
|
-
else
|
|
68
|
-
xxd -c "$BYTES_PER_LINE" "$INPUT_FILE"
|
|
69
|
-
fi
|
|
70
|
-
elif command -v hexdump >/dev/null 2>&1; then
|
|
71
|
-
hexdump -C "$INPUT_FILE"
|
|
72
|
-
elif command -v od >/dev/null 2>&1; then
|
|
73
|
-
od -A x -t x1z -v "$INPUT_FILE"
|
|
74
|
-
else
|
|
75
|
-
echo "Error: xxd, hexdump, or od required"
|
|
76
|
-
exit 1
|
|
77
|
-
fi
|
|
78
|
-
;;
|
|
79
|
-
esac
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Show public and local IP addresses
|
|
3
|
-
# Usage: ip [--json]
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
JSON_OUTPUT=false
|
|
8
|
-
[[ "${1:-}" == "--json" ]] && JSON_OUTPUT=true
|
|
9
|
-
|
|
10
|
-
# Get public IP
|
|
11
|
-
get_public_ip() {
|
|
12
|
-
curl -s --max-time 5 https://api.ipify.org 2>/dev/null ||
|
|
13
|
-
curl -s --max-time 5 https://ifconfig.me 2>/dev/null ||
|
|
14
|
-
curl -s --max-time 5 https://icanhazip.com 2>/dev/null ||
|
|
15
|
-
echo "unavailable"
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
# Get local IP
|
|
19
|
-
get_local_ip() {
|
|
20
|
-
if command -v ip >/dev/null 2>&1; then
|
|
21
|
-
ip route get 1 2>/dev/null | awk '{print $7; exit}'
|
|
22
|
-
elif command -v ifconfig >/dev/null 2>&1; then
|
|
23
|
-
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1
|
|
24
|
-
else
|
|
25
|
-
hostname -I 2>/dev/null | awk '{print $1}' || echo "unavailable"
|
|
26
|
-
fi
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
PUBLIC_IP=$(get_public_ip)
|
|
30
|
-
LOCAL_IP=$(get_local_ip)
|
|
31
|
-
|
|
32
|
-
if $JSON_OUTPUT; then
|
|
33
|
-
echo "{\"public\": \"$PUBLIC_IP\", \"local\": \"$LOCAL_IP\"}"
|
|
34
|
-
else
|
|
35
|
-
echo "Public IP: $PUBLIC_IP"
|
|
36
|
-
echo "Local IP: $LOCAL_IP"
|
|
37
|
-
fi
|