@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,77 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
histfile="${HISTFILE:-$HOME/.zsh_history}"
|
|
5
|
-
db="${DOTFILES_HISTORY_DB:-$HOME/.local/share/dotfiles/history.sqlite}"
|
|
6
|
-
|
|
7
|
-
if [[ ! -f "$histfile" ]]; then
|
|
8
|
-
echo "History file not found: $histfile" >&2
|
|
9
|
-
exit 1
|
|
10
|
-
fi
|
|
11
|
-
|
|
12
|
-
if ! command -v python3 >/dev/null; then
|
|
13
|
-
echo "python3 not found. Falling back to hstats if available." >&2
|
|
14
|
-
if command -v hstats >/dev/null; then
|
|
15
|
-
hstats
|
|
16
|
-
exit 0
|
|
17
|
-
fi
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
mkdir -p "$(dirname "$db")"
|
|
22
|
-
|
|
23
|
-
python3 - "$histfile" "$db" <<'PY'
|
|
24
|
-
import sys
|
|
25
|
-
import sqlite3
|
|
26
|
-
import re
|
|
27
|
-
from pathlib import Path
|
|
28
|
-
|
|
29
|
-
histfile = Path(sys.argv[1])
|
|
30
|
-
db = Path(sys.argv[2])
|
|
31
|
-
|
|
32
|
-
conn = sqlite3.connect(db)
|
|
33
|
-
cur = conn.cursor()
|
|
34
|
-
cur.execute("CREATE TABLE IF NOT EXISTS history (ts INTEGER, cmd TEXT)")
|
|
35
|
-
cur.execute("DELETE FROM history")
|
|
36
|
-
|
|
37
|
-
pattern = re.compile(r"^: (\d+):\d+;(.*)$")
|
|
38
|
-
|
|
39
|
-
with histfile.open("r", encoding="utf-8", errors="ignore") as f:
|
|
40
|
-
for line in f:
|
|
41
|
-
line = line.rstrip("\n")
|
|
42
|
-
m = pattern.match(line)
|
|
43
|
-
if not m:
|
|
44
|
-
continue
|
|
45
|
-
ts = int(m.group(1))
|
|
46
|
-
cmd = m.group(2).strip()
|
|
47
|
-
if not cmd:
|
|
48
|
-
continue
|
|
49
|
-
cur.execute("INSERT INTO history (ts, cmd) VALUES (?, ?)", (ts, cmd))
|
|
50
|
-
|
|
51
|
-
conn.commit()
|
|
52
|
-
|
|
53
|
-
print("=== History Analysis ===")
|
|
54
|
-
|
|
55
|
-
print("\nTop commands:")
|
|
56
|
-
for row in cur.execute("""
|
|
57
|
-
SELECT substr(cmd, 1, instr(cmd || ' ', ' ') - 1) AS base, COUNT(*)
|
|
58
|
-
FROM history
|
|
59
|
-
GROUP BY base
|
|
60
|
-
ORDER BY COUNT(*) DESC
|
|
61
|
-
LIMIT 15
|
|
62
|
-
"""):
|
|
63
|
-
print(f"{row[1]:>6} {row[0]}")
|
|
64
|
-
|
|
65
|
-
print("\nTop directories (cd):")
|
|
66
|
-
for row in cur.execute("""
|
|
67
|
-
SELECT trim(substr(cmd, 4)) AS dir, COUNT(*)
|
|
68
|
-
FROM history
|
|
69
|
-
WHERE cmd LIKE 'cd %'
|
|
70
|
-
GROUP BY dir
|
|
71
|
-
ORDER BY COUNT(*) DESC
|
|
72
|
-
LIMIT 10
|
|
73
|
-
"""):
|
|
74
|
-
print(f"{row[1]:>6} {row[0]}")
|
|
75
|
-
|
|
76
|
-
conn.close()
|
|
77
|
-
PY
|
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Security Score Assessment
|
|
3
|
-
# Usage: dot security-score [--verbose|-v] [--json]
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
# Colors
|
|
8
|
-
RED='\033[0;31m'
|
|
9
|
-
GREEN='\033[0;32m'
|
|
10
|
-
YELLOW='\033[1;33m'
|
|
11
|
-
BLUE='\033[0;34m'
|
|
12
|
-
CYAN='\033[0;36m'
|
|
13
|
-
NC='\033[0m'
|
|
14
|
-
|
|
15
|
-
# Parse arguments
|
|
16
|
-
VERBOSE=false
|
|
17
|
-
JSON_OUTPUT=false
|
|
18
|
-
while [[ $# -gt 0 ]]; do
|
|
19
|
-
case "$1" in
|
|
20
|
-
--verbose | -v)
|
|
21
|
-
VERBOSE=true
|
|
22
|
-
shift
|
|
23
|
-
;;
|
|
24
|
-
--json)
|
|
25
|
-
JSON_OUTPUT=true
|
|
26
|
-
shift
|
|
27
|
-
;;
|
|
28
|
-
*) shift ;;
|
|
29
|
-
esac
|
|
30
|
-
done
|
|
31
|
-
|
|
32
|
-
# Scoring
|
|
33
|
-
TOTAL_POINTS=0
|
|
34
|
-
MAX_POINTS=0
|
|
35
|
-
declare -A CATEGORY_SCORES
|
|
36
|
-
|
|
37
|
-
add_points() {
|
|
38
|
-
local category="$1"
|
|
39
|
-
local points="$2"
|
|
40
|
-
local max="$3"
|
|
41
|
-
local description="$4"
|
|
42
|
-
# $5 is status (pass/fail/partial) - used for icon selection below
|
|
43
|
-
|
|
44
|
-
TOTAL_POINTS=$((TOTAL_POINTS + points))
|
|
45
|
-
MAX_POINTS=$((MAX_POINTS + max))
|
|
46
|
-
CATEGORY_SCORES["$category"]=$((${CATEGORY_SCORES[$category]:-0} + points))
|
|
47
|
-
|
|
48
|
-
if ! $JSON_OUTPUT && $VERBOSE; then
|
|
49
|
-
local icon
|
|
50
|
-
if [[ $points -eq $max ]]; then
|
|
51
|
-
icon="${GREEN}✓${NC}"
|
|
52
|
-
elif [[ $points -gt 0 ]]; then
|
|
53
|
-
icon="${YELLOW}◐${NC}"
|
|
54
|
-
else
|
|
55
|
-
icon="${RED}✗${NC}"
|
|
56
|
-
fi
|
|
57
|
-
printf " $icon %-40s %d/%d pts\n" "$description" "$points" "$max"
|
|
58
|
-
fi
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
print_header() {
|
|
62
|
-
if ! $JSON_OUTPUT; then
|
|
63
|
-
echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
64
|
-
echo -e "${CYAN} Security Score Assessment${NC}"
|
|
65
|
-
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
|
|
66
|
-
fi
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
section() {
|
|
70
|
-
if ! $JSON_OUTPUT; then
|
|
71
|
-
echo -e "\n${BLUE}▸ $1${NC}"
|
|
72
|
-
echo "───────────────────────────────────────────────"
|
|
73
|
-
fi
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
# === Security Checks ===
|
|
77
|
-
|
|
78
|
-
check_encryption() {
|
|
79
|
-
section "Encryption (30 pts max)"
|
|
80
|
-
|
|
81
|
-
# Age encryption tool
|
|
82
|
-
if command -v age >/dev/null 2>&1; then
|
|
83
|
-
add_points "encryption" 5 5 "Age encryption installed" "pass"
|
|
84
|
-
else
|
|
85
|
-
add_points "encryption" 0 5 "Age encryption installed" "fail"
|
|
86
|
-
fi
|
|
87
|
-
|
|
88
|
-
# Age key exists
|
|
89
|
-
if [[ -f "${HOME}/.config/chezmoi/key.txt" ]]; then
|
|
90
|
-
add_points "encryption" 5 5 "Age encryption key present" "pass"
|
|
91
|
-
|
|
92
|
-
# Check key permissions
|
|
93
|
-
local perms
|
|
94
|
-
perms=$(stat -c "%a" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null || stat -f "%OLp" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null)
|
|
95
|
-
if [[ "$perms" == "600" ]]; then
|
|
96
|
-
add_points "encryption" 5 5 "Key file permissions (600)" "pass"
|
|
97
|
-
else
|
|
98
|
-
add_points "encryption" 2 5 "Key file permissions (600)" "partial"
|
|
99
|
-
fi
|
|
100
|
-
else
|
|
101
|
-
add_points "encryption" 0 10 "Age encryption configured" "fail"
|
|
102
|
-
fi
|
|
103
|
-
|
|
104
|
-
# SOPS available
|
|
105
|
-
if command -v sops >/dev/null 2>&1; then
|
|
106
|
-
add_points "encryption" 5 5 "SOPS secrets manager" "pass"
|
|
107
|
-
else
|
|
108
|
-
add_points "encryption" 0 5 "SOPS secrets manager" "fail"
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
# GPG available
|
|
112
|
-
if command -v gpg >/dev/null 2>&1 && gpg --list-secret-keys 2>/dev/null | grep -q sec; then
|
|
113
|
-
add_points "encryption" 10 10 "GPG keys configured" "pass"
|
|
114
|
-
elif command -v gpg >/dev/null 2>&1; then
|
|
115
|
-
add_points "encryption" 3 10 "GPG keys configured" "partial"
|
|
116
|
-
else
|
|
117
|
-
add_points "encryption" 0 10 "GPG keys configured" "fail"
|
|
118
|
-
fi
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
check_ssh() {
|
|
122
|
-
section "SSH Security (25 pts max)"
|
|
123
|
-
|
|
124
|
-
# SSH directory permissions
|
|
125
|
-
if [[ -d "${HOME}/.ssh" ]]; then
|
|
126
|
-
local ssh_perms
|
|
127
|
-
ssh_perms=$(stat -c "%a" "${HOME}/.ssh" 2>/dev/null || stat -f "%OLp" "${HOME}/.ssh" 2>/dev/null)
|
|
128
|
-
if [[ "$ssh_perms" == "700" ]]; then
|
|
129
|
-
add_points "ssh" 5 5 "SSH directory permissions (700)" "pass"
|
|
130
|
-
else
|
|
131
|
-
add_points "ssh" 2 5 "SSH directory permissions (700)" "partial"
|
|
132
|
-
fi
|
|
133
|
-
else
|
|
134
|
-
add_points "ssh" 0 5 "SSH directory exists" "fail"
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
# ED25519 key (preferred over RSA)
|
|
138
|
-
if [[ -f "${HOME}/.ssh/id_ed25519" ]]; then
|
|
139
|
-
add_points "ssh" 10 10 "ED25519 SSH key (modern)" "pass"
|
|
140
|
-
elif [[ -f "${HOME}/.ssh/id_rsa" ]]; then
|
|
141
|
-
add_points "ssh" 5 10 "SSH key present (RSA)" "partial"
|
|
142
|
-
else
|
|
143
|
-
add_points "ssh" 0 10 "SSH key present" "fail"
|
|
144
|
-
fi
|
|
145
|
-
|
|
146
|
-
# SSH agent
|
|
147
|
-
if [[ -n "${SSH_AUTH_SOCK:-}" ]] || pgrep -x ssh-agent >/dev/null 2>&1; then
|
|
148
|
-
add_points "ssh" 5 5 "SSH agent running" "pass"
|
|
149
|
-
else
|
|
150
|
-
add_points "ssh" 0 5 "SSH agent running" "fail"
|
|
151
|
-
fi
|
|
152
|
-
|
|
153
|
-
# SSH config exists
|
|
154
|
-
if [[ -f "${HOME}/.ssh/config" ]]; then
|
|
155
|
-
add_points "ssh" 5 5 "SSH config present" "pass"
|
|
156
|
-
else
|
|
157
|
-
add_points "ssh" 2 5 "SSH config present" "partial"
|
|
158
|
-
fi
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
check_git() {
|
|
162
|
-
section "Git Security (20 pts max)"
|
|
163
|
-
|
|
164
|
-
# Git installed
|
|
165
|
-
if ! command -v git >/dev/null 2>&1; then
|
|
166
|
-
add_points "git" 0 20 "Git installed" "fail"
|
|
167
|
-
return
|
|
168
|
-
fi
|
|
169
|
-
|
|
170
|
-
# Commit signing
|
|
171
|
-
if git config --global commit.gpgsign 2>/dev/null | grep -q true; then
|
|
172
|
-
add_points "git" 10 10 "Commit signing enabled" "pass"
|
|
173
|
-
else
|
|
174
|
-
add_points "git" 0 10 "Commit signing enabled" "fail"
|
|
175
|
-
fi
|
|
176
|
-
|
|
177
|
-
# User identity configured
|
|
178
|
-
if git config --global user.email >/dev/null 2>&1 && git config --global user.name >/dev/null 2>&1; then
|
|
179
|
-
add_points "git" 5 5 "Git identity configured" "pass"
|
|
180
|
-
else
|
|
181
|
-
add_points "git" 0 5 "Git identity configured" "fail"
|
|
182
|
-
fi
|
|
183
|
-
|
|
184
|
-
# Credential helper
|
|
185
|
-
if git config --global credential.helper >/dev/null 2>&1; then
|
|
186
|
-
add_points "git" 5 5 "Credential helper configured" "pass"
|
|
187
|
-
else
|
|
188
|
-
add_points "git" 0 5 "Credential helper configured" "fail"
|
|
189
|
-
fi
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
check_system() {
|
|
193
|
-
section "System Security (15 pts max)"
|
|
194
|
-
|
|
195
|
-
# Firewall (macOS or Linux)
|
|
196
|
-
if [[ "$(uname)" == "Darwin" ]]; then
|
|
197
|
-
if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q enabled; then
|
|
198
|
-
add_points "system" 5 5 "Firewall enabled" "pass"
|
|
199
|
-
else
|
|
200
|
-
add_points "system" 0 5 "Firewall enabled" "fail"
|
|
201
|
-
fi
|
|
202
|
-
else
|
|
203
|
-
# Check ufw via systemctl (doesn't need sudo) or sudo ufw status
|
|
204
|
-
local fw_enabled=false
|
|
205
|
-
if systemctl is-active --quiet ufw 2>/dev/null; then
|
|
206
|
-
fw_enabled=true
|
|
207
|
-
elif command -v ufw >/dev/null 2>&1 && sudo -n ufw status 2>/dev/null | grep -q "Status: active"; then
|
|
208
|
-
fw_enabled=true
|
|
209
|
-
elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state 2>/dev/null | grep -q running; then
|
|
210
|
-
fw_enabled=true
|
|
211
|
-
fi
|
|
212
|
-
|
|
213
|
-
if $fw_enabled; then
|
|
214
|
-
add_points "system" 5 5 "Firewall enabled" "pass"
|
|
215
|
-
else
|
|
216
|
-
add_points "system" 0 5 "Firewall enabled" "fail"
|
|
217
|
-
fi
|
|
218
|
-
fi
|
|
219
|
-
|
|
220
|
-
# Disk encryption (LUKS, FileVault, or ecryptfs)
|
|
221
|
-
if [[ "$(uname)" == "Darwin" ]]; then
|
|
222
|
-
if fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
|
|
223
|
-
add_points "system" 10 10 "Disk encryption (FileVault)" "pass"
|
|
224
|
-
else
|
|
225
|
-
add_points "system" 0 10 "Disk encryption (FileVault)" "fail"
|
|
226
|
-
fi
|
|
227
|
-
else
|
|
228
|
-
local encryption_found=false
|
|
229
|
-
# Check LUKS
|
|
230
|
-
if lsblk 2>/dev/null | grep -q crypt || [[ -d /sys/block/dm-0 ]]; then
|
|
231
|
-
encryption_found=true
|
|
232
|
-
add_points "system" 10 10 "Disk encryption (LUKS)" "pass"
|
|
233
|
-
# Check Apple T2 chip (hardware SSD encryption)
|
|
234
|
-
elif lspci 2>/dev/null | grep -qi "T2.*Secure Enclave"; then
|
|
235
|
-
encryption_found=true
|
|
236
|
-
add_points "system" 10 10 "Hardware encryption (Apple T2)" "pass"
|
|
237
|
-
# Check ecryptfs (encrypted home)
|
|
238
|
-
elif mount 2>/dev/null | grep -q ecryptfs || [[ -d "$HOME/.ecryptfs" ]]; then
|
|
239
|
-
encryption_found=true
|
|
240
|
-
add_points "system" 10 10 "Home encryption (ecryptfs)" "pass"
|
|
241
|
-
# Check if running in encrypted VM/container
|
|
242
|
-
elif [[ -f /sys/class/dmi/id/product_name ]] && grep -qiE "virtual|vmware|kvm|qemu" /sys/class/dmi/id/product_name 2>/dev/null; then
|
|
243
|
-
encryption_found=true
|
|
244
|
-
add_points "system" 10 10 "Virtualized (host encryption)" "pass"
|
|
245
|
-
fi
|
|
246
|
-
|
|
247
|
-
if ! $encryption_found; then
|
|
248
|
-
add_points "system" 0 10 "Disk encryption" "unknown"
|
|
249
|
-
fi
|
|
250
|
-
fi
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
check_secrets() {
|
|
254
|
-
section "Secrets Management (10 pts max)"
|
|
255
|
-
|
|
256
|
-
# No secrets in dotfiles repo
|
|
257
|
-
if [[ -d "${HOME}/.dotfiles" ]]; then
|
|
258
|
-
local secrets_found=false
|
|
259
|
-
# Check for common secret patterns
|
|
260
|
-
if grep -rE "(api_key|api_secret|password|token)\\s*=\\s*['\"][^'\"]+['\"]" "${HOME}/.dotfiles" --include="*.sh" --include="*.zsh" --include="*.toml" 2>/dev/null | grep -v "example\|template\|placeholder" | head -1; then
|
|
261
|
-
secrets_found=true
|
|
262
|
-
fi
|
|
263
|
-
|
|
264
|
-
if $secrets_found; then
|
|
265
|
-
add_points "secrets" 0 5 "No hardcoded secrets" "fail"
|
|
266
|
-
else
|
|
267
|
-
add_points "secrets" 5 5 "No hardcoded secrets" "pass"
|
|
268
|
-
fi
|
|
269
|
-
else
|
|
270
|
-
add_points "secrets" 5 5 "No hardcoded secrets" "pass"
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
# Environment variables for secrets
|
|
274
|
-
if [[ -f "${HOME}/.config/secrets/api-keys.env" ]] || [[ -d "${HOME}/.config/secrets" ]]; then
|
|
275
|
-
add_points "secrets" 5 5 "Secrets in dedicated location" "pass"
|
|
276
|
-
else
|
|
277
|
-
add_points "secrets" 2 5 "Secrets management setup" "partial"
|
|
278
|
-
fi
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
print_summary() {
|
|
282
|
-
local score=$((TOTAL_POINTS * 100 / MAX_POINTS))
|
|
283
|
-
|
|
284
|
-
if $JSON_OUTPUT; then
|
|
285
|
-
echo "{"
|
|
286
|
-
echo " \"score\": $score,"
|
|
287
|
-
echo " \"points\": $TOTAL_POINTS,"
|
|
288
|
-
echo " \"max_points\": $MAX_POINTS,"
|
|
289
|
-
echo " \"grade\": \"$(get_grade $score)\","
|
|
290
|
-
echo " \"categories\": {"
|
|
291
|
-
local first=true
|
|
292
|
-
for cat in "${!CATEGORY_SCORES[@]}"; do
|
|
293
|
-
$first || echo ","
|
|
294
|
-
first=false
|
|
295
|
-
printf " \"%s\": %d" "$cat" "${CATEGORY_SCORES[$cat]}"
|
|
296
|
-
done
|
|
297
|
-
echo ""
|
|
298
|
-
echo " }"
|
|
299
|
-
echo "}"
|
|
300
|
-
return
|
|
301
|
-
fi
|
|
302
|
-
|
|
303
|
-
echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
304
|
-
echo -e "${CYAN} Security Score${NC}"
|
|
305
|
-
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
|
|
306
|
-
|
|
307
|
-
# Score bar
|
|
308
|
-
local bar_width=30
|
|
309
|
-
local filled=$((score * bar_width / 100))
|
|
310
|
-
local empty=$((bar_width - filled))
|
|
311
|
-
|
|
312
|
-
printf " Score: ["
|
|
313
|
-
if [[ $score -ge 80 ]]; then
|
|
314
|
-
printf '%s' "${GREEN}"
|
|
315
|
-
elif [[ $score -ge 60 ]]; then
|
|
316
|
-
printf '%s' "${YELLOW}"
|
|
317
|
-
else
|
|
318
|
-
printf '%s' "${RED}"
|
|
319
|
-
fi
|
|
320
|
-
printf "%${filled}s" | tr ' ' '█'
|
|
321
|
-
printf '%s' "${NC}"
|
|
322
|
-
printf "%${empty}s" | tr ' ' '░'
|
|
323
|
-
printf "] "
|
|
324
|
-
|
|
325
|
-
# Grade
|
|
326
|
-
local grade
|
|
327
|
-
grade=$(get_grade $score)
|
|
328
|
-
case "$grade" in
|
|
329
|
-
A*) echo -e "${GREEN}${score}% Grade: ${grade}${NC}" ;;
|
|
330
|
-
B*) echo -e "${GREEN}${score}% Grade: ${grade}${NC}" ;;
|
|
331
|
-
C*) echo -e "${YELLOW}${score}% Grade: ${grade}${NC}" ;;
|
|
332
|
-
*) echo -e "${RED}${score}% Grade: ${grade}${NC}" ;;
|
|
333
|
-
esac
|
|
334
|
-
|
|
335
|
-
echo -e "\n Points: ${TOTAL_POINTS}/${MAX_POINTS}"
|
|
336
|
-
echo ""
|
|
337
|
-
|
|
338
|
-
# Recommendations
|
|
339
|
-
if [[ $score -lt 100 ]]; then
|
|
340
|
-
echo -e "${BLUE}Recommendations:${NC}"
|
|
341
|
-
|
|
342
|
-
if ! command -v age >/dev/null 2>&1; then
|
|
343
|
-
echo " • Install age for encryption: brew install age"
|
|
344
|
-
fi
|
|
345
|
-
if ! command -v sops >/dev/null 2>&1; then
|
|
346
|
-
echo " • Install SOPS for secrets: brew install sops"
|
|
347
|
-
fi
|
|
348
|
-
if ! git config --global commit.gpgsign 2>/dev/null | grep -q true; then
|
|
349
|
-
echo " • Enable commit signing: git config --global commit.gpgsign true"
|
|
350
|
-
fi
|
|
351
|
-
if [[ ! -f "${HOME}/.ssh/id_ed25519" ]]; then
|
|
352
|
-
echo " • Generate ED25519 SSH key: ssh-keygen -t ed25519"
|
|
353
|
-
fi
|
|
354
|
-
echo ""
|
|
355
|
-
fi
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
get_grade() {
|
|
359
|
-
local score=$1
|
|
360
|
-
if [[ $score -ge 95 ]]; then
|
|
361
|
-
echo "A+"
|
|
362
|
-
elif [[ $score -ge 90 ]]; then
|
|
363
|
-
echo "A"
|
|
364
|
-
elif [[ $score -ge 85 ]]; then
|
|
365
|
-
echo "A-"
|
|
366
|
-
elif [[ $score -ge 80 ]]; then
|
|
367
|
-
echo "B+"
|
|
368
|
-
elif [[ $score -ge 75 ]]; then
|
|
369
|
-
echo "B"
|
|
370
|
-
elif [[ $score -ge 70 ]]; then
|
|
371
|
-
echo "B-"
|
|
372
|
-
elif [[ $score -ge 65 ]]; then
|
|
373
|
-
echo "C+"
|
|
374
|
-
elif [[ $score -ge 60 ]]; then
|
|
375
|
-
echo "C"
|
|
376
|
-
elif [[ $score -ge 55 ]]; then
|
|
377
|
-
echo "C-"
|
|
378
|
-
elif [[ $score -ge 50 ]]; then
|
|
379
|
-
echo "D"
|
|
380
|
-
else
|
|
381
|
-
echo "F"
|
|
382
|
-
fi
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
# Main
|
|
386
|
-
print_header
|
|
387
|
-
check_encryption
|
|
388
|
-
check_ssh
|
|
389
|
-
check_git
|
|
390
|
-
check_system
|
|
391
|
-
check_secrets
|
|
392
|
-
print_summary
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Dotfiles CLI - Appearance Commands
|
|
3
|
-
# theme, wallpaper, fonts, tune
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
# shellcheck source=../lib/utils.sh
|
|
9
|
-
source "$SCRIPT_DIR/../lib/utils.sh"
|
|
10
|
-
|
|
11
|
-
cmd_theme() {
|
|
12
|
-
run_script "scripts/theme/switch.sh" "Theme switcher" "$@"
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
cmd_wallpaper() {
|
|
16
|
-
run_script "scripts/theme/wallpaper-sync.sh" "Wallpaper script" "$@"
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
cmd_fonts() {
|
|
20
|
-
run_script "scripts/fonts/install-nerd-fonts.sh" "Font install script" "$@"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
cmd_tune() {
|
|
24
|
-
local src_dir
|
|
25
|
-
src_dir="$(require_source_dir)"
|
|
26
|
-
|
|
27
|
-
case "$(uname -s)" in
|
|
28
|
-
Darwin)
|
|
29
|
-
exec bash "$src_dir/scripts/tuning/macos.sh" "$@"
|
|
30
|
-
;;
|
|
31
|
-
Linux)
|
|
32
|
-
exec bash "$src_dir/scripts/tuning/linux.sh" "$@"
|
|
33
|
-
;;
|
|
34
|
-
*)
|
|
35
|
-
echo "OS tuning not supported on this platform."
|
|
36
|
-
exit 1
|
|
37
|
-
;;
|
|
38
|
-
esac
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
# Dispatch
|
|
42
|
-
case "${1:-}" in
|
|
43
|
-
theme)
|
|
44
|
-
shift
|
|
45
|
-
cmd_theme "$@"
|
|
46
|
-
;;
|
|
47
|
-
wallpaper)
|
|
48
|
-
shift
|
|
49
|
-
cmd_wallpaper "$@"
|
|
50
|
-
;;
|
|
51
|
-
fonts)
|
|
52
|
-
shift
|
|
53
|
-
cmd_fonts "$@"
|
|
54
|
-
;;
|
|
55
|
-
tune)
|
|
56
|
-
shift
|
|
57
|
-
cmd_tune "$@"
|
|
58
|
-
;;
|
|
59
|
-
*)
|
|
60
|
-
echo "Unknown appearance command: ${1:-}" >&2
|
|
61
|
-
exit 1
|
|
62
|
-
;;
|
|
63
|
-
esac
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Dotfiles CLI - Core Commands
|
|
3
|
-
# apply, sync, update, add, diff, status, remove, cd, edit
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
# shellcheck source=../lib/utils.sh
|
|
9
|
-
source "$SCRIPT_DIR/../lib/utils.sh"
|
|
10
|
-
|
|
11
|
-
cmd_apply() {
|
|
12
|
-
local src_dir
|
|
13
|
-
src_dir="$(resolve_source_dir)"
|
|
14
|
-
if [ -n "$src_dir" ] && [ -f "$src_dir/scripts/ops/chezmoi-apply.sh" ]; then
|
|
15
|
-
exec bash "$src_dir/scripts/ops/chezmoi-apply.sh" "$@"
|
|
16
|
-
fi
|
|
17
|
-
exec chezmoi apply "$@"
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
cmd_sync() {
|
|
21
|
-
cmd_apply "$@"
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
cmd_update() {
|
|
25
|
-
local src_dir
|
|
26
|
-
src_dir="$(resolve_source_dir)"
|
|
27
|
-
if [ -n "$src_dir" ] && [ -f "$src_dir/scripts/ops/chezmoi-update.sh" ]; then
|
|
28
|
-
exec bash "$src_dir/scripts/ops/chezmoi-update.sh" "$@"
|
|
29
|
-
fi
|
|
30
|
-
echo "Updating Dotfiles..."
|
|
31
|
-
exec chezmoi update "$@"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
cmd_add() {
|
|
35
|
-
if [ -z "$1" ]; then
|
|
36
|
-
echo "Usage: dot add <file>"
|
|
37
|
-
echo ""
|
|
38
|
-
echo "Add a file to the chezmoi source directory."
|
|
39
|
-
echo "The file will be managed by chezmoi from now on."
|
|
40
|
-
exit 1
|
|
41
|
-
fi
|
|
42
|
-
exec chezmoi add "$@"
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
cmd_diff() {
|
|
46
|
-
local src_dir
|
|
47
|
-
src_dir="$(resolve_source_dir)"
|
|
48
|
-
if [ -n "$src_dir" ] && [ -f "$src_dir/scripts/ops/chezmoi-diff.sh" ]; then
|
|
49
|
-
exec bash "$src_dir/scripts/ops/chezmoi-diff.sh" "$@"
|
|
50
|
-
fi
|
|
51
|
-
exec chezmoi diff "$@"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
cmd_status() {
|
|
55
|
-
exec chezmoi status "$@"
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
cmd_remove() {
|
|
59
|
-
run_script "scripts/ops/chezmoi-remove.sh" "Remove helper" "$@"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
cmd_cd() {
|
|
63
|
-
local src_dir
|
|
64
|
-
src_dir="$(resolve_source_dir)"
|
|
65
|
-
if [ -n "$src_dir" ]; then
|
|
66
|
-
echo "$src_dir"
|
|
67
|
-
else
|
|
68
|
-
echo "Dotfiles source not found." >&2
|
|
69
|
-
exit 1
|
|
70
|
-
fi
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
cmd_edit() {
|
|
74
|
-
local src_dir
|
|
75
|
-
src_dir="$(require_source_dir)"
|
|
76
|
-
if [ -n "${EDITOR:-}" ]; then
|
|
77
|
-
exec "$EDITOR" "$src_dir"
|
|
78
|
-
elif has_command nvim; then
|
|
79
|
-
exec nvim "$src_dir"
|
|
80
|
-
elif has_command vim; then
|
|
81
|
-
exec vim "$src_dir"
|
|
82
|
-
else
|
|
83
|
-
echo "No editor found. Set \$EDITOR to open $src_dir."
|
|
84
|
-
exit 1
|
|
85
|
-
fi
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
# Dispatch
|
|
89
|
-
case "${1:-}" in
|
|
90
|
-
apply)
|
|
91
|
-
shift
|
|
92
|
-
cmd_apply "$@"
|
|
93
|
-
;;
|
|
94
|
-
sync)
|
|
95
|
-
shift
|
|
96
|
-
cmd_sync "$@"
|
|
97
|
-
;;
|
|
98
|
-
update)
|
|
99
|
-
shift
|
|
100
|
-
cmd_update "$@"
|
|
101
|
-
;;
|
|
102
|
-
add)
|
|
103
|
-
shift
|
|
104
|
-
cmd_add "$@"
|
|
105
|
-
;;
|
|
106
|
-
diff)
|
|
107
|
-
shift
|
|
108
|
-
cmd_diff "$@"
|
|
109
|
-
;;
|
|
110
|
-
status)
|
|
111
|
-
shift
|
|
112
|
-
cmd_status "$@"
|
|
113
|
-
;;
|
|
114
|
-
remove)
|
|
115
|
-
shift
|
|
116
|
-
cmd_remove "$@"
|
|
117
|
-
;;
|
|
118
|
-
cd)
|
|
119
|
-
shift
|
|
120
|
-
cmd_cd "$@"
|
|
121
|
-
;;
|
|
122
|
-
edit)
|
|
123
|
-
shift
|
|
124
|
-
cmd_edit "$@"
|
|
125
|
-
;;
|
|
126
|
-
*)
|
|
127
|
-
echo "Unknown core command: ${1:-}" >&2
|
|
128
|
-
exit 1
|
|
129
|
-
;;
|
|
130
|
-
esac
|