@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

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 (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -1,19 +1,41 @@
1
1
  #!/usr/bin/env bash
2
- # Security Score Assessment
3
- # Usage: dot security-score [--verbose|-v] [--json]
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Security Score Assessment.
4
+ ##
5
+ ## Evaluates system security posture across encryption, SSH, Git, system
6
+ ## hardening, and secrets management. Returns a letter grade (A+ to F) with
7
+ ## actionable recommendations.
8
+ ##
9
+ ## # Usage
10
+ ## dot security-score [--verbose|-v] [--json|-j] [--quiet|-q]
11
+ ##
12
+ ## # Dependencies
13
+ ## - age: Encryption tool check
14
+ ## - sops: Secrets manager check
15
+ ## - gpg: Key management check
16
+ ## - git: Commit signing verification
17
+ ##
18
+ ## # Platform Notes
19
+ ## - macOS: Checks socketfilterfw, FileVault, Little Snitch
20
+ ## - Linux: Checks ufw/firewalld, LUKS encryption
21
+ ## - WSL: Checks host encryption, virtualization detection
22
+ ##
23
+ ## # Security
24
+ ## Does not modify system state. Read-only checks only.
25
+ ##
26
+ ## # Idempotency
27
+ ## Safe to run repeatedly. No side effects.
4
28
 
5
29
  set -euo pipefail
30
+ set +o xtrace 2>/dev/null || true
6
31
 
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'
32
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
+ # shellcheck source=../dot/lib/ui.sh
34
+ # shellcheck disable=SC1091
35
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
14
36
 
15
37
  # Parse arguments
16
- VERBOSE=false
38
+ VERBOSE=true
17
39
  JSON_OUTPUT=false
18
40
  while [[ $# -gt 0 ]]; do
19
41
  case "$1" in
@@ -21,7 +43,11 @@ while [[ $# -gt 0 ]]; do
21
43
  VERBOSE=true
22
44
  shift
23
45
  ;;
24
- --json)
46
+ --quiet | -q)
47
+ VERBOSE=false
48
+ shift
49
+ ;;
50
+ --json | -j)
25
51
  JSON_OUTPUT=true
26
52
  shift
27
53
  ;;
@@ -29,6 +55,12 @@ while [[ $# -gt 0 ]]; do
29
55
  esac
30
56
  done
31
57
 
58
+ ui_init
59
+ NC="${NORMAL}"
60
+ RED="${RED:-}"
61
+ GREEN="${GREEN:-}"
62
+ YELLOW="${YELLOW:-}"
63
+
32
64
  # Scoring
33
65
  TOTAL_POINTS=0
34
66
  MAX_POINTS=0
@@ -39,7 +71,6 @@ add_points() {
39
71
  local points="$2"
40
72
  local max="$3"
41
73
  local description="$4"
42
- # $5 is status (pass/fail/partial) - used for icon selection below
43
74
 
44
75
  TOTAL_POINTS=$((TOTAL_POINTS + points))
45
76
  MAX_POINTS=$((MAX_POINTS + max))
@@ -47,29 +78,42 @@ add_points() {
47
78
 
48
79
  if ! $JSON_OUTPUT && $VERBOSE; then
49
80
  local icon
81
+ local color=""
50
82
  if [[ $points -eq $max ]]; then
51
- icon="${GREEN}✓${NC}"
83
+ icon=""
84
+ color="$GREEN"
52
85
  elif [[ $points -gt 0 ]]; then
53
- icon="${YELLOW}◐${NC}"
86
+ icon=""
87
+ color="$YELLOW"
88
+ else
89
+ icon="✗"
90
+ color="$RED"
91
+ fi
92
+
93
+ if [[ "$UI_ENABLED" = "1" ]]; then
94
+ ui_status "$icon" "[OK]" "$description" "$points/$max pts" "$color"
54
95
  else
55
- icon="${RED}✗${NC}"
96
+ ui_bullet "$description ($points/$max pts)"
56
97
  fi
57
- printf " $icon %-40s %d/%d pts\n" "$description" "$points" "$max"
58
98
  fi
59
99
  }
60
100
 
61
101
  print_header() {
62
102
  if ! $JSON_OUTPUT; then
63
- echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
64
- echo -e "${CYAN} Security Score Assessment${NC}"
65
- echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
103
+ echo ""
104
+ ui_dot_banner "Diagnostics"
105
+ ui_header "Security Score Assessment"
106
+ echo ""
66
107
  fi
67
108
  }
68
109
 
69
110
  section() {
70
111
  if ! $JSON_OUTPUT; then
71
- echo -e "\n${BLUE}▸ $1${NC}"
72
- echo "───────────────────────────────────────────────"
112
+ echo ""
113
+ ui_section "$1"
114
+ if [[ "$UI_ENABLED" != "1" ]]; then
115
+ echo "───────────────────────────────────────────────"
116
+ fi
73
117
  fi
74
118
  }
75
119
 
@@ -80,41 +124,41 @@ check_encryption() {
80
124
 
81
125
  # Age encryption tool
82
126
  if command -v age >/dev/null 2>&1; then
83
- add_points "encryption" 5 5 "Age encryption installed" "pass"
127
+ add_points "encryption" 5 5 "Age encryption installed"
84
128
  else
85
- add_points "encryption" 0 5 "Age encryption installed" "fail"
129
+ add_points "encryption" 0 5 "Age encryption installed"
86
130
  fi
87
131
 
88
132
  # Age key exists
89
133
  if [[ -f "${HOME}/.config/chezmoi/key.txt" ]]; then
90
- add_points "encryption" 5 5 "Age encryption key present" "pass"
134
+ add_points "encryption" 5 5 "Age encryption key present"
91
135
 
92
136
  # Check key permissions
93
137
  local perms
94
138
  perms=$(stat -c "%a" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null || stat -f "%OLp" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null)
95
139
  if [[ "$perms" == "600" ]]; then
96
- add_points "encryption" 5 5 "Key file permissions (600)" "pass"
140
+ add_points "encryption" 5 5 "Key file permissions (600)"
97
141
  else
98
- add_points "encryption" 2 5 "Key file permissions (600)" "partial"
142
+ add_points "encryption" 2 5 "Key file permissions (600)"
99
143
  fi
100
144
  else
101
- add_points "encryption" 0 10 "Age encryption configured" "fail"
145
+ add_points "encryption" 0 10 "Age encryption configured"
102
146
  fi
103
147
 
104
148
  # SOPS available
105
149
  if command -v sops >/dev/null 2>&1; then
106
- add_points "encryption" 5 5 "SOPS secrets manager" "pass"
150
+ add_points "encryption" 5 5 "SOPS secrets manager"
107
151
  else
108
- add_points "encryption" 0 5 "SOPS secrets manager" "fail"
152
+ add_points "encryption" 0 5 "SOPS secrets manager"
109
153
  fi
110
154
 
111
155
  # GPG available
112
156
  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"
157
+ add_points "encryption" 10 10 "GPG keys configured"
114
158
  elif command -v gpg >/dev/null 2>&1; then
115
- add_points "encryption" 3 10 "GPG keys configured" "partial"
159
+ add_points "encryption" 3 10 "GPG keys configured"
116
160
  else
117
- add_points "encryption" 0 10 "GPG keys configured" "fail"
161
+ add_points "encryption" 0 10 "GPG keys configured"
118
162
  fi
119
163
  }
120
164
 
@@ -126,35 +170,35 @@ check_ssh() {
126
170
  local ssh_perms
127
171
  ssh_perms=$(stat -c "%a" "${HOME}/.ssh" 2>/dev/null || stat -f "%OLp" "${HOME}/.ssh" 2>/dev/null)
128
172
  if [[ "$ssh_perms" == "700" ]]; then
129
- add_points "ssh" 5 5 "SSH directory permissions (700)" "pass"
173
+ add_points "ssh" 5 5 "SSH directory permissions (700)"
130
174
  else
131
- add_points "ssh" 2 5 "SSH directory permissions (700)" "partial"
175
+ add_points "ssh" 2 5 "SSH directory permissions (700)"
132
176
  fi
133
177
  else
134
- add_points "ssh" 0 5 "SSH directory exists" "fail"
178
+ add_points "ssh" 0 5 "SSH directory exists"
135
179
  fi
136
180
 
137
181
  # ED25519 key (preferred over RSA)
138
182
  if [[ -f "${HOME}/.ssh/id_ed25519" ]]; then
139
- add_points "ssh" 10 10 "ED25519 SSH key (modern)" "pass"
183
+ add_points "ssh" 10 10 "ED25519 SSH key (modern)"
140
184
  elif [[ -f "${HOME}/.ssh/id_rsa" ]]; then
141
- add_points "ssh" 5 10 "SSH key present (RSA)" "partial"
185
+ add_points "ssh" 5 10 "SSH key present (RSA)"
142
186
  else
143
- add_points "ssh" 0 10 "SSH key present" "fail"
187
+ add_points "ssh" 0 10 "SSH key present"
144
188
  fi
145
189
 
146
190
  # SSH agent
147
191
  if [[ -n "${SSH_AUTH_SOCK:-}" ]] || pgrep -x ssh-agent >/dev/null 2>&1; then
148
- add_points "ssh" 5 5 "SSH agent running" "pass"
192
+ add_points "ssh" 5 5 "SSH agent running"
149
193
  else
150
- add_points "ssh" 0 5 "SSH agent running" "fail"
194
+ add_points "ssh" 0 5 "SSH agent running"
151
195
  fi
152
196
 
153
197
  # SSH config exists
154
198
  if [[ -f "${HOME}/.ssh/config" ]]; then
155
- add_points "ssh" 5 5 "SSH config present" "pass"
199
+ add_points "ssh" 5 5 "SSH config present"
156
200
  else
157
- add_points "ssh" 2 5 "SSH config present" "partial"
201
+ add_points "ssh" 2 5 "SSH config present"
158
202
  fi
159
203
  }
160
204
 
@@ -163,29 +207,29 @@ check_git() {
163
207
 
164
208
  # Git installed
165
209
  if ! command -v git >/dev/null 2>&1; then
166
- add_points "git" 0 20 "Git installed" "fail"
210
+ add_points "git" 0 20 "Git installed"
167
211
  return
168
212
  fi
169
213
 
170
214
  # Commit signing
171
215
  if git config --global commit.gpgsign 2>/dev/null | grep -q true; then
172
- add_points "git" 10 10 "Commit signing enabled" "pass"
216
+ add_points "git" 10 10 "Commit signing enabled"
173
217
  else
174
- add_points "git" 0 10 "Commit signing enabled" "fail"
218
+ add_points "git" 0 10 "Commit signing enabled"
175
219
  fi
176
220
 
177
221
  # User identity configured
178
222
  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"
223
+ add_points "git" 5 5 "Git identity configured"
180
224
  else
181
- add_points "git" 0 5 "Git identity configured" "fail"
225
+ add_points "git" 0 5 "Git identity configured"
182
226
  fi
183
227
 
184
228
  # Credential helper
185
229
  if git config --global credential.helper >/dev/null 2>&1; then
186
- add_points "git" 5 5 "Credential helper configured" "pass"
230
+ add_points "git" 5 5 "Credential helper configured"
187
231
  else
188
- add_points "git" 0 5 "Credential helper configured" "fail"
232
+ add_points "git" 0 5 "Credential helper configured"
189
233
  fi
190
234
  }
191
235
 
@@ -195,9 +239,11 @@ check_system() {
195
239
  # Firewall (macOS or Linux)
196
240
  if [[ "$(uname)" == "Darwin" ]]; then
197
241
  if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q enabled; then
198
- add_points "system" 5 5 "Firewall enabled" "pass"
242
+ add_points "system" 5 5 "Firewall enabled"
243
+ elif pgrep -x "Little Snitch" >/dev/null 2>&1 || [[ -d "/Applications/Little Snitch.app" ]]; then
244
+ add_points "system" 5 5 "Firewall enabled (Little Snitch)"
199
245
  else
200
- add_points "system" 0 5 "Firewall enabled" "fail"
246
+ add_points "system" 0 5 "Firewall enabled"
201
247
  fi
202
248
  else
203
249
  # Check ufw via systemctl (doesn't need sudo) or sudo ufw status
@@ -211,41 +257,41 @@ check_system() {
211
257
  fi
212
258
 
213
259
  if $fw_enabled; then
214
- add_points "system" 5 5 "Firewall enabled" "pass"
260
+ add_points "system" 5 5 "Firewall enabled"
215
261
  else
216
- add_points "system" 0 5 "Firewall enabled" "fail"
262
+ add_points "system" 0 5 "Firewall enabled"
217
263
  fi
218
264
  fi
219
265
 
220
266
  # Disk encryption (LUKS, FileVault, or ecryptfs)
221
267
  if [[ "$(uname)" == "Darwin" ]]; then
222
268
  if fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
223
- add_points "system" 10 10 "Disk encryption (FileVault)" "pass"
269
+ add_points "system" 10 10 "Disk encryption (FileVault)"
224
270
  else
225
- add_points "system" 0 10 "Disk encryption (FileVault)" "fail"
271
+ add_points "system" 0 10 "Disk encryption (FileVault)"
226
272
  fi
227
273
  else
228
274
  local encryption_found=false
229
275
  # Check LUKS
230
276
  if lsblk 2>/dev/null | grep -q crypt || [[ -d /sys/block/dm-0 ]]; then
231
277
  encryption_found=true
232
- add_points "system" 10 10 "Disk encryption (LUKS)" "pass"
278
+ add_points "system" 10 10 "Disk encryption (LUKS)"
233
279
  # Check Apple T2 chip (hardware SSD encryption)
234
280
  elif lspci 2>/dev/null | grep -qi "T2.*Secure Enclave"; then
235
281
  encryption_found=true
236
- add_points "system" 10 10 "Hardware encryption (Apple T2)" "pass"
282
+ add_points "system" 10 10 "Hardware encryption (Apple T2)"
237
283
  # Check ecryptfs (encrypted home)
238
284
  elif mount 2>/dev/null | grep -q ecryptfs || [[ -d "$HOME/.ecryptfs" ]]; then
239
285
  encryption_found=true
240
- add_points "system" 10 10 "Home encryption (ecryptfs)" "pass"
286
+ add_points "system" 10 10 "Home encryption (ecryptfs)"
241
287
  # Check if running in encrypted VM/container
242
288
  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
289
  encryption_found=true
244
- add_points "system" 10 10 "Virtualized (host encryption)" "pass"
290
+ add_points "system" 10 10 "Virtualized (host encryption)"
245
291
  fi
246
292
 
247
293
  if ! $encryption_found; then
248
- add_points "system" 0 10 "Disk encryption" "unknown"
294
+ add_points "system" 0 10 "Disk encryption"
249
295
  fi
250
296
  fi
251
297
  }
@@ -256,25 +302,29 @@ check_secrets() {
256
302
  # No secrets in dotfiles repo
257
303
  if [[ -d "${HOME}/.dotfiles" ]]; then
258
304
  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
305
+ local match=""
306
+ # Check for common secret patterns, ignore templates/placeholders and variable expansions.
307
+ match=$(grep -rE "(api_key|api_secret|password|token)[[:space:]]*=[[:space:]]*['\"][^'\"]+['\"]" \
308
+ "${HOME}/.dotfiles" --include="*.sh" --include="*.zsh" --include="*.toml" 2>/dev/null |
309
+ grep -v "example\\|template\\|placeholder" | grep -F -v "\${" | head -1 || true)
310
+ if [[ -n "$match" ]]; then
261
311
  secrets_found=true
262
312
  fi
263
313
 
264
314
  if $secrets_found; then
265
- add_points "secrets" 0 5 "No hardcoded secrets" "fail"
315
+ add_points "secrets" 0 5 "No hardcoded secrets"
266
316
  else
267
- add_points "secrets" 5 5 "No hardcoded secrets" "pass"
317
+ add_points "secrets" 5 5 "No hardcoded secrets"
268
318
  fi
269
319
  else
270
- add_points "secrets" 5 5 "No hardcoded secrets" "pass"
320
+ add_points "secrets" 5 5 "No hardcoded secrets"
271
321
  fi
272
322
 
273
323
  # Environment variables for secrets
274
324
  if [[ -f "${HOME}/.config/secrets/api-keys.env" ]] || [[ -d "${HOME}/.config/secrets" ]]; then
275
- add_points "secrets" 5 5 "Secrets in dedicated location" "pass"
325
+ add_points "secrets" 5 5 "Secrets in dedicated location"
276
326
  else
277
- add_points "secrets" 2 5 "Secrets management setup" "partial"
327
+ add_points "secrets" 2 5 "Secrets management setup"
278
328
  fi
279
329
  }
280
330
 
@@ -300,16 +350,20 @@ print_summary() {
300
350
  return
301
351
  fi
302
352
 
303
- echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
304
- echo -e "${CYAN} Security Score${NC}"
305
- echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
353
+ echo ""
354
+ ui_header "Security Score"
355
+ echo ""
306
356
 
307
- # Score bar
308
- local bar_width=30
357
+ local bar_width=28
309
358
  local filled=$((score * bar_width / 100))
310
359
  local empty=$((bar_width - filled))
360
+ local block="#"
361
+ local pad="-"
311
362
 
312
- printf " Score: ["
363
+ local grade
364
+ grade=$(get_grade $score)
365
+
366
+ printf " Score: "
313
367
  if [[ $score -ge 80 ]]; then
314
368
  printf '%s' "${GREEN}"
315
369
  elif [[ $score -ge 60 ]]; then
@@ -317,39 +371,28 @@ print_summary() {
317
371
  else
318
372
  printf '%s' "${RED}"
319
373
  fi
320
- printf "%${filled}s" | tr ' ' '█'
374
+ printf "%${filled}s" | tr ' ' "$block"
321
375
  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
376
+ printf "%${empty}s" | tr ' ' "$pad"
377
+ printf " %s%% Grade: %s\n" "${score}" "${grade}"
334
378
 
335
- echo -e "\n Points: ${TOTAL_POINTS}/${MAX_POINTS}"
379
+ printf '%b\n' "\n Points: ${TOTAL_POINTS}/${MAX_POINTS}"
336
380
  echo ""
337
381
 
338
382
  # Recommendations
339
383
  if [[ $score -lt 100 ]]; then
340
- echo -e "${BLUE}Recommendations:${NC}"
341
-
384
+ ui_header "Recommendations"
342
385
  if ! command -v age >/dev/null 2>&1; then
343
- echo "Install age for encryption: brew install age"
386
+ ui_bullet "Install age for encryption: brew install age"
344
387
  fi
345
388
  if ! command -v sops >/dev/null 2>&1; then
346
- echo "Install SOPS for secrets: brew install sops"
389
+ ui_bullet "Install SOPS for secrets: brew install sops"
347
390
  fi
348
391
  if ! git config --global commit.gpgsign 2>/dev/null | grep -q true; then
349
- echo "Enable commit signing: git config --global commit.gpgsign true"
392
+ ui_bullet "Enable commit signing: git config --global commit.gpgsign true"
350
393
  fi
351
394
  if [[ ! -f "${HOME}/.ssh/id_ed25519" ]]; then
352
- echo "Generate ED25519 SSH key: ssh-keygen -t ed25519"
395
+ ui_bullet "Generate ED25519 SSH key: ssh-keygen -t ed25519"
353
396
  fi
354
397
  echo ""
355
398
  fi
@@ -383,6 +426,9 @@ get_grade() {
383
426
  }
384
427
 
385
428
  # Main
429
+ export LANG="${LANG:-en_US.UTF-8}"
430
+ export LC_ALL="${LC_ALL:-en_US.UTF-8}"
431
+
386
432
  print_header
387
433
  check_encryption
388
434
  check_ssh
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Smoke tests to quickly verify toolchain health after installation/updates.
4
+
5
+ set -euo pipefail
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck disable=SC1091
10
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ ui_init
12
+
13
+ ui_header "Dotfiles Smoke Tests"
14
+
15
+ declare -i passed=0
16
+ declare -i failed=0
17
+
18
+ check_cmd() {
19
+ local cmd="$1"
20
+ if command -v "$cmd" >/dev/null 2>&1; then
21
+ return 0
22
+ fi
23
+ if command -v mise >/dev/null 2>&1; then
24
+ if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
25
+ return 0
26
+ fi
27
+ fi
28
+ return 1
29
+ }
30
+
31
+ verify_cmd() {
32
+ local cmd="$1"
33
+ local expected_output="${2:-}"
34
+
35
+ if ! check_cmd "$cmd"; then
36
+ ui_err "$cmd" "not found"
37
+ failed+=1
38
+ return 1
39
+ fi
40
+
41
+ if [[ -n "$expected_output" ]]; then
42
+ local output
43
+ # shellcheck disable=SC2015
44
+ output=$($cmd --version 2>&1 || $cmd version 2>&1 || true)
45
+ if echo "$output" | grep -q "$expected_output"; then
46
+ ui_ok "$cmd"
47
+ passed+=1
48
+ else
49
+ ui_err "$cmd" "output mismatch"
50
+ failed+=1
51
+ fi
52
+ else
53
+ ui_ok "$cmd"
54
+ passed+=1
55
+ fi
56
+ }
57
+
58
+ # Core utilities
59
+ verify_cmd "git" "git version"
60
+ verify_cmd "zsh" "zsh"
61
+ verify_cmd "chezmoi" "chezmoi version"
62
+
63
+ # Rust Toolchain / Frontier
64
+ verify_cmd "rg" "ripgrep"
65
+ verify_cmd "bat" "bat"
66
+ verify_cmd "eza" "eza"
67
+ verify_cmd "zoxide" "zoxide"
68
+ verify_cmd "zellij" "zellij"
69
+ verify_cmd "shfmt" "3."
70
+
71
+ # Process management
72
+ verify_cmd "pueue" "pueue"
73
+
74
+ # AI Tools
75
+ # Prevent sgpt from prompting for a key by piping empty string
76
+ export OPENAI_API_KEY="sk-placeholder-for-testing"
77
+ verify_cmd "sgpt" "ShellGPT"
78
+ verify_cmd "copilot" "copilot"
79
+ verify_cmd "kiro-cli" "kiro-cli"
80
+
81
+ echo ""
82
+ if [[ $failed -eq 0 ]]; then
83
+ ui_ok "All $passed tests passed"
84
+ else
85
+ ui_err "$failed failed" "$passed passed"
86
+ exit 1
87
+ fi
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Snapshot current system/tooling state
4
+ # Usage: dot snapshot [--baseline|-b] [--force|-f]
5
+
6
+ set -euo pipefail
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ # shellcheck source=../dot/lib/ui.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
12
+
13
+ ui_init
14
+
15
+ BASELINE=false
16
+ FORCE=false
17
+ while [[ $# -gt 0 ]]; do
18
+ case "$1" in
19
+ --baseline | -b)
20
+ BASELINE=true
21
+ shift
22
+ ;;
23
+ --force | -f)
24
+ FORCE=true
25
+ shift
26
+ ;;
27
+ *) shift ;;
28
+ esac
29
+ done
30
+
31
+ STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles/snapshots"
32
+ mkdir -p "$STATE_DIR"
33
+
34
+ if $BASELINE; then
35
+ output="$STATE_DIR/baseline.json"
36
+ else
37
+ output="$STATE_DIR/snapshot_$(date +%Y%m%d_%H%M%S).json"
38
+ fi
39
+
40
+ if [[ -f "$output" && "$FORCE" != "true" ]]; then
41
+ ui_warn "Snapshot" "${output} already exists (use --force)"
42
+ exit 0
43
+ fi
44
+
45
+ safe() { printf '%s' "$1" | sed 's/"/\\"/g'; }
46
+
47
+ get_version() {
48
+ local cmd="$1"
49
+ if command -v "$cmd" >/dev/null 2>&1; then
50
+ "$cmd" --version 2>/dev/null | head -1 | awk '{print $NF}'
51
+ else
52
+ echo ""
53
+ fi
54
+ }
55
+
56
+ os_name=$(uname -s 2>/dev/null || echo "unknown")
57
+ kernel=$(uname -r 2>/dev/null || echo "unknown")
58
+ shell_name=$(basename "${SHELL:-}" 2>/dev/null || echo "")
59
+
60
+ dot_version=""
61
+ if [[ -f "$SCRIPT_DIR/../../package.json" ]]; then
62
+ dot_version=$(sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([0-9.]*\)".*/\1/p' "$SCRIPT_DIR/../../package.json" | head -1)
63
+ fi
64
+
65
+ cat >"$output" <<JSON
66
+ {
67
+ "timestamp": "$(date -Iseconds)",
68
+ "os": "$(safe "$os_name")",
69
+ "kernel": "$(safe "$kernel")",
70
+ "shell": "$(safe "$shell_name")",
71
+ "dotfiles_version": "$(safe "$dot_version")",
72
+ "tools": {
73
+ "chezmoi": "$(safe "$(get_version chezmoi)")",
74
+ "git": "$(safe "$(get_version git)")",
75
+ "zsh": "$(safe "$(get_version zsh)")",
76
+ "node": "$(safe "$(get_version node)")",
77
+ "python": "$(safe "$(python3 --version 2>/dev/null | awk '{print $2}')")",
78
+ "rustc": "$(safe "$(rustc --version 2>/dev/null | awk '{print $2}')")",
79
+ "go": "$(safe "$(go version 2>/dev/null | awk '{print $3}')")",
80
+ "nvim": "$(safe "$(nvim --version 2>/dev/null | head -1 | awk '{print $2}')")",
81
+ "tmux": "$(safe "$(tmux -V 2>/dev/null | awk '{print $2}')")",
82
+ "starship": "$(safe "$(get_version starship)")",
83
+ "mise": "$(safe "$(get_version mise)")"
84
+ }
85
+ }
86
+ JSON
87
+
88
+ ui_dot_banner "Diagnostics"
89
+ ui_ok "Snapshot" "$output"