@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.
Files changed (317) hide show
  1. package/docs/ARCHITECTURE.md +29 -196
  2. package/docs/COMPLIANCE.md +10 -10
  3. package/docs/COPYRIGHT +3 -4
  4. package/docs/OPERATIONS.md +38 -65
  5. package/docs/PLAN.md +3 -3
  6. package/docs/PR_DESCRIPTION.md +85 -84
  7. package/docs/ROADMAP.md +11 -11
  8. package/docs/ROADMAP_legacy.md +556 -0
  9. package/docs/SECURITY_CHECKLIST.md +1 -1
  10. package/docs/TASK.md +4 -4
  11. package/docs/WALKTHROUGH.md +33 -152
  12. package/package.json +17 -5
  13. package/scripts/backup.sh +142 -0
  14. package/scripts/banner.sh +20 -0
  15. package/scripts/benchmark.sh +20 -0
  16. package/scripts/build.sh +41 -0
  17. package/scripts/clean.sh +31 -0
  18. package/scripts/compile.sh +54 -0
  19. package/scripts/copy.sh +108 -0
  20. package/scripts/{tools/detect-collisions.py → detect-collisions.py} +1 -1
  21. package/scripts/doctor.sh +79 -0
  22. package/scripts/dotfiles.sh +63 -0
  23. package/scripts/download.sh +35 -0
  24. package/scripts/help.sh +57 -0
  25. package/scripts/lock-configs.sh +57 -0
  26. package/scripts/package.sh +46 -0
  27. package/scripts/ssh.sh +55 -0
  28. package/scripts/teleport.sh +23 -0
  29. package/scripts/{tests/test-aliases.sh → test-aliases.sh} +3 -3
  30. package/scripts/test_smoke.sh +88 -0
  31. package/scripts/unpack.sh +28 -0
  32. package/scripts/{diagnostics/verify_state.sh → verify_state.sh} +21 -21
  33. package/templates/projects/go/README.md +0 -4
  34. package/templates/projects/node/README.md +0 -4
  35. package/templates/projects/python/README.md +0 -4
  36. package/templates/projects/python/pyproject.toml +0 -15
  37. package/CHANGELOG.md +0 -285
  38. package/LICENSE +0 -1283
  39. package/README.md +0 -315
  40. package/docs/ALIASES.md +0 -128
  41. package/docs/FEATURES.md +0 -166
  42. package/docs/FONTS.md +0 -147
  43. package/docs/INSTALL.md +0 -119
  44. package/docs/KEYS.md +0 -40
  45. package/docs/KEY_ROTATION.md +0 -219
  46. package/docs/LEGACY_ROADMAP.md +0 -142
  47. package/docs/NEOVIM_IDE_GUIDE.md +0 -52
  48. package/docs/README.md +0 -269
  49. package/docs/REPO_AUDIT.md +0 -23
  50. package/docs/SCREENSHOTS.md +0 -116
  51. package/docs/SECRETS.md +0 -76
  52. package/docs/SECURITY.md +0 -30
  53. package/docs/TESTING.md +0 -190
  54. package/docs/TOOLS.md +0 -146
  55. package/docs/TROUBLESHOOTING.md +0 -112
  56. package/docs/UTILS.md +0 -105
  57. package/docs/WSL2_NIX_TROUBLESHOOTING.md +0 -723
  58. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -101
  59. package/docs/adr/ADR-002-shell-performance.md +0 -121
  60. package/docs/adr/ADR-003-security-first.md +0 -140
  61. package/docs/adr/ADR-004-cli-architecture.md +0 -157
  62. package/docs/adr/ADR-005-chezmoi-choice.md +0 -89
  63. package/docs/adr/ADR-006-shell-selection.md +0 -115
  64. package/docs/adr/README.md +0 -33
  65. package/docs/themes/README.md +0 -20
  66. package/dot_config/aider/aider.conf.yml +0 -32
  67. package/dot_config/alacritty/alacritty.toml.tmpl +0 -483
  68. package/dot_config/ansible/ansible.cfg.tmpl +0 -11
  69. package/dot_config/atuin/config.toml +0 -23
  70. package/dot_config/bat/config +0 -8
  71. package/dot_config/brave-flags.conf.tmpl +0 -7
  72. package/dot_config/btop/btop.conf +0 -16
  73. package/dot_config/btop/themes/tokyonight.theme +0 -34
  74. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  75. package/dot_config/claude/mcp_servers.json +0 -49
  76. package/dot_config/clippy.toml +0 -55
  77. package/dot_config/containers/containers.conf +0 -14
  78. package/dot_config/curl/dot_curlrc +0 -18
  79. package/dot_config/dlv/config.yml +0 -39
  80. package/dot_config/docker/config.json.tmpl +0 -15
  81. package/dot_config/dotfiles/boot/README.md +0 -11
  82. package/dot_config/dotfiles/grub/README.md +0 -11
  83. package/dot_config/dotfiles/lock/README.md +0 -11
  84. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  85. package/dot_config/duf/duf.conf +0 -6
  86. package/dot_config/duti/defaults.duti +0 -5
  87. package/dot_config/emoji/emoji.txt +0 -34
  88. package/dot_config/fastfetch/config.jsonc +0 -28
  89. package/dot_config/firefox/user.js +0 -8
  90. package/dot_config/flatpak/flatpak.list +0 -4
  91. package/dot_config/fontconfig/fonts.conf.tmpl +0 -44
  92. package/dot_config/gem/gemrc +0 -9
  93. package/dot_config/gh/config.yml +0 -12
  94. package/dot_config/ghostty/config.tmpl +0 -661
  95. package/dot_config/git/attributes +0 -12
  96. package/dot_config/git/config.tmpl +0 -77
  97. package/dot_config/git/ignore +0 -27
  98. package/dot_config/gnupg/gpg-agent.conf.tmpl +0 -11
  99. package/dot_config/go/aliases.sh +0 -61
  100. package/dot_config/go/env.sh +0 -24
  101. package/dot_config/go/golangci.yml +0 -118
  102. package/dot_config/go/gopls.json +0 -30
  103. package/dot_config/goose/config.yaml +0 -29
  104. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -305
  105. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -66
  106. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -309
  107. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -21
  108. package/dot_config/htop/htoprc +0 -20
  109. package/dot_config/ice/README.md +0 -13
  110. package/dot_config/inputrc +0 -2
  111. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  112. package/dot_config/just/justfile +0 -104
  113. package/dot_config/k9s/config.yaml.tmpl +0 -65
  114. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  115. package/dot_config/karabiner/karabiner.json +0 -14
  116. package/dot_config/kitty/kitty.conf.tmpl +0 -517
  117. package/dot_config/lazydocker/config.yml +0 -186
  118. package/dot_config/lazygit/config.yml +0 -23
  119. package/dot_config/lsd/config.yaml +0 -19
  120. package/dot_config/mas/masapps.txt +0 -5
  121. package/dot_config/minikube/config.json +0 -13
  122. package/dot_config/mise/config.toml +0 -41
  123. package/dot_config/mongosh/mongoshrc.js +0 -67
  124. package/dot_config/mycli/myclirc +0 -67
  125. package/dot_config/nano/nanorc +0 -28
  126. package/dot_config/ncdu/config +0 -12
  127. package/dot_config/nvim/init.lua +0 -4
  128. package/dot_config/nvim/lazy-lock.json +0 -27
  129. package/dot_config/nvim/lua/config/autocmds.lua +0 -63
  130. package/dot_config/nvim/lua/config/keymaps.lua +0 -87
  131. package/dot_config/nvim/lua/config/lazy.lua +0 -34
  132. package/dot_config/nvim/lua/config/options.lua +0 -48
  133. package/dot_config/nvim/lua/plugins/coding.lua +0 -234
  134. package/dot_config/nvim/lua/plugins/dap.lua +0 -201
  135. package/dot_config/nvim/lua/plugins/editor.lua +0 -59
  136. package/dot_config/nvim/lua/plugins/git.lua +0 -9
  137. package/dot_config/nvim/lua/plugins/lsp.lua +0 -221
  138. package/dot_config/nvim/lua/plugins/markdown.lua +0 -17
  139. package/dot_config/nvim/lua/plugins/rust.lua +0 -33
  140. package/dot_config/nvim/lua/plugins/sessions.lua +0 -32
  141. package/dot_config/nvim/lua/plugins/ui.lua +0 -537
  142. package/dot_config/nvim/snippets/all.lua +0 -9
  143. package/dot_config/nvim/snippets/python.lua +0 -16
  144. package/dot_config/pip/pip.conf.tmpl +0 -32
  145. package/dot_config/pypoetry/config.toml.tmpl +0 -6
  146. package/dot_config/pyrightconfig.json.tmpl +0 -5
  147. package/dot_config/raycast/README.md +0 -13
  148. package/dot_config/redis/redisclirc +0 -41
  149. package/dot_config/shell/00-container-detect.sh +0 -53
  150. package/dot_config/shell/00-core-paths.sh.tmpl +0 -95
  151. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  152. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  153. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -10
  154. package/dot_config/shell/90-theme-switch.sh +0 -70
  155. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -35
  156. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -23
  157. package/dot_config/shell/Brewfile +0 -207
  158. package/dot_config/shell/Brewfile.cask +0 -92
  159. package/dot_config/shell/Brewfile.cli +0 -119
  160. package/dot_config/shell/README.md +0 -267
  161. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  162. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  163. package/dot_config/sops/dot_sops.yaml +0 -23
  164. package/dot_config/starship.toml.tmpl +0 -124
  165. package/dot_config/task/Taskfile.yml +0 -86
  166. package/dot_config/tflint/tflint.hcl.tmpl +0 -9
  167. package/dot_config/tmux/tmux.conf.tmpl +0 -181
  168. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  169. package/dot_config/vscode/extensions.txt +0 -11
  170. package/dot_config/vscode/settings.json.tmpl +0 -123
  171. package/dot_config/waybar/style.css +0 -8
  172. package/dot_config/wezterm/wezterm.lua.tmpl +0 -236
  173. package/dot_config/wget/wgetrc +0 -12
  174. package/dot_config/yarn/yarnrc.yml.tmpl +0 -36
  175. package/dot_config/yazi/yazi.toml +0 -40
  176. package/dot_config/zellij/config.kdl +0 -79
  177. package/dot_config/zsh/dot_zprofile +0 -13
  178. package/dot_config/zsh/dot_zshenv +0 -6
  179. package/dot_config/zsh/dot_zshrc.tmpl +0 -199
  180. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -5
  181. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  182. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  183. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -123
  184. package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +0 -20
  185. package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +0 -9
  186. package/dot_local/bin/executable_ai_core +0 -130
  187. package/dot_local/bin/executable_b64 +0 -59
  188. package/dot_local/bin/executable_dot +0 -178
  189. package/dot_local/bin/executable_dot_completion +0 -55
  190. package/dot_local/bin/executable_epoch +0 -62
  191. package/dot_local/bin/executable_extract +0 -108
  192. package/dot_local/bin/executable_git-ai-commit +0 -160
  193. package/dot_local/bin/executable_git-ai-diff +0 -154
  194. package/dot_local/bin/executable_hash +0 -123
  195. package/dot_local/bin/executable_hex +0 -79
  196. package/dot_local/bin/executable_ip +0 -37
  197. package/dot_local/bin/executable_jsonv +0 -54
  198. package/dot_local/bin/executable_jwt +0 -78
  199. package/dot_local/bin/executable_kill-port +0 -59
  200. package/dot_local/bin/executable_lorem +0 -103
  201. package/dot_local/bin/executable_regex +0 -96
  202. package/dot_local/bin/executable_tmux-sessionizer +0 -187
  203. package/dot_local/bin/executable_tour +0 -137
  204. package/dot_local/bin/executable_update +0 -108
  205. package/dot_local/bin/executable_uuid +0 -57
  206. package/dot_local/bin/executable_yamlv +0 -39
  207. package/dot_local/bin/executable_zig-install +0 -89
  208. package/dot_local/bin/voice_ops +0 -7
  209. package/dot_local/share/bash-completion/completions/dot +0 -54
  210. package/dot_local/share/zsh/completions/.keep +0 -0
  211. package/install.sh +0 -255
  212. package/scripts/ci/validate-ci-config.sh +0 -222
  213. package/scripts/demo/record.sh +0 -41
  214. package/scripts/diagnostics/benchmark.sh +0 -201
  215. package/scripts/diagnostics/doctor.sh +0 -115
  216. package/scripts/diagnostics/drift-dashboard.sh +0 -26
  217. package/scripts/diagnostics/health.sh +0 -356
  218. package/scripts/diagnostics/history-analysis.sh +0 -77
  219. package/scripts/diagnostics/security-score.sh +0 -392
  220. package/scripts/dot/commands/appearance.sh +0 -63
  221. package/scripts/dot/commands/core.sh +0 -130
  222. package/scripts/dot/commands/diagnostics.sh +0 -100
  223. package/scripts/dot/commands/meta.sh +0 -117
  224. package/scripts/dot/commands/restore.sh +0 -209
  225. package/scripts/dot/commands/secrets.sh +0 -81
  226. package/scripts/dot/commands/security.sh +0 -73
  227. package/scripts/dot/commands/tools.sh +0 -228
  228. package/scripts/dot/lib/utils.sh +0 -72
  229. package/scripts/fonts/install-nerd-fonts.sh +0 -59
  230. package/scripts/fonts/patch-fonts.sh +0 -34
  231. package/scripts/ops/chezmoi-apply.sh +0 -42
  232. package/scripts/ops/chezmoi-diff.sh +0 -14
  233. package/scripts/ops/chezmoi-remove.sh +0 -43
  234. package/scripts/ops/chezmoi-update.sh +0 -16
  235. package/scripts/ops/heal.sh +0 -466
  236. package/scripts/ops/health-check.sh +0 -380
  237. package/scripts/ops/rollback.sh +0 -531
  238. package/scripts/ops/teleport.sh +0 -32
  239. package/scripts/secrets/age-init.sh +0 -69
  240. package/scripts/secrets/create-secrets-file.sh +0 -44
  241. package/scripts/secrets/encrypt-ssh-key.sh +0 -42
  242. package/scripts/security/backup.sh +0 -17
  243. package/scripts/security/dns-doh.sh +0 -29
  244. package/scripts/security/encryption-check.sh +0 -39
  245. package/scripts/security/enforce-policies.sh +0 -339
  246. package/scripts/security/firewall.sh +0 -34
  247. package/scripts/security/lock-configs.sh +0 -57
  248. package/scripts/security/lock-screen.sh +0 -33
  249. package/scripts/security/manage-secrets.sh +0 -415
  250. package/scripts/security/telemetry-kill.sh +0 -28
  251. package/scripts/security/usb-safety.sh +0 -29
  252. package/scripts/tests/README.md +0 -241
  253. package/scripts/tests/benchmark.sh +0 -91
  254. package/scripts/tests/framework/assertions.sh +0 -283
  255. package/scripts/tests/framework/mocks.sh +0 -201
  256. package/scripts/tests/framework/test_runner.sh +0 -189
  257. package/scripts/tests/integration/test_install.sh +0 -237
  258. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  259. package/scripts/tests/performance/regression_check.sh +0 -73
  260. package/scripts/tests/performance/stress_test.sh +0 -65
  261. package/scripts/tests/test-docker.sh +0 -48
  262. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  263. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  264. package/scripts/tests/unit/test_backup.sh +0 -227
  265. package/scripts/tests/unit/test_case_functions.sh +0 -238
  266. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  267. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  268. package/scripts/tests/unit/test_encode64.sh +0 -67
  269. package/scripts/tests/unit/test_environment.sh +0 -78
  270. package/scripts/tests/unit/test_extract.sh +0 -163
  271. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  272. package/scripts/tests/unit/test_genpass.sh +0 -298
  273. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  274. package/scripts/tests/unit/test_installers.sh +0 -172
  275. package/scripts/tests/unit/test_keygen.sh +0 -68
  276. package/scripts/tests/unit/test_logging.sh +0 -96
  277. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  278. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  279. package/scripts/tests/unit/test_prependpath.sh +0 -66
  280. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  281. package/scripts/tests/unit/test_rd.sh +0 -230
  282. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  283. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  284. package/scripts/tests/unit/test_template_validation.sh +0 -238
  285. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  286. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  287. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  288. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  289. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  290. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  291. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  292. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  293. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  294. package/scripts/tests/unit/test_zipf.sh +0 -76
  295. package/scripts/theme/apply-gnome-theme.sh +0 -297
  296. package/scripts/theme/install-boot-logo.sh +0 -61
  297. package/scripts/theme/install-catppuccin-themes.sh +0 -346
  298. package/scripts/theme/install-cursors.sh +0 -24
  299. package/scripts/theme/install-file-icons.sh +0 -25
  300. package/scripts/theme/install-grub-theme.sh +0 -51
  301. package/scripts/theme/install-lock-icon.sh +0 -29
  302. package/scripts/theme/switch.sh +0 -250
  303. package/scripts/theme/wallpaper-rotate.sh +0 -82
  304. package/scripts/theme/wallpaper-sync.sh +0 -42
  305. package/scripts/tools/cmatrix.sh +0 -20
  306. package/scripts/tools/emoji-picker.sh +0 -45
  307. package/scripts/tools/figlet-banner.sh +0 -17
  308. package/scripts/tools/log-rotate.sh +0 -29
  309. package/scripts/tools/lolcat-wrap.sh +0 -18
  310. package/scripts/tools/pipes.sh +0 -47
  311. package/scripts/tuning/linux.sh +0 -175
  312. package/scripts/tuning/macos.sh +0 -46
  313. package/templates/projects/molecule/README.md +0 -7
  314. package/templates/projects/molecule/converge.yml +0 -7
  315. package/templates/projects/molecule/molecule.yml +0 -16
  316. package/templates/projects/packer/README.md +0 -15
  317. 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