@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,6 +1,34 @@
1
1
  #!/usr/bin/env bash
2
- # Secure Configuration Management Script
3
- # Helps manage environment variables and secrets securely
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Secure Configuration Management.
4
+ ##
5
+ ## Manages environment variables and secrets across local development.
6
+ ## Provides init, validate, rotate, and audit capabilities for credentials.
7
+ ##
8
+ ## # Usage
9
+ ## manage-secrets.sh init # Create .env.local from template
10
+ ## manage-secrets.sh validate # Check configuration integrity
11
+ ## manage-secrets.sh check # Scan for hardcoded secrets
12
+ ## manage-secrets.sh rotate github # Secret rotation guide
13
+ ## manage-secrets.sh clean # Remove temporary files
14
+ ##
15
+ ## # Dependencies
16
+ ## - stat: Permission checking
17
+ ## - grep: Pattern matching
18
+ ## - find: File discovery
19
+ ##
20
+ ## # Platform Notes
21
+ ## - macOS: Uses BSD stat syntax
22
+ ## - Linux: Uses GNU stat syntax
23
+ ## - WSL: Works with Linux filesystem permissions
24
+ ##
25
+ ## # Security
26
+ ## - Creates .env.local with 600 permissions
27
+ ## - Automatically adds .env.local to .gitignore
28
+ ## - Never commits secrets to version control
29
+ ##
30
+ ## # Idempotency
31
+ ## Safe to run repeatedly. init requires --force to overwrite.
4
32
 
5
33
  set -euo pipefail
6
34
 
@@ -11,16 +39,10 @@ readonly REPO_ROOT
11
39
  readonly ENV_TEMPLATE="${REPO_ROOT}/.github/security-policies/environment-template.env"
12
40
  readonly ENV_LOCAL="${REPO_ROOT}/.env.local"
13
41
 
14
- # Color codes (respect NO_COLOR: https://no-color.org)
15
- if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
16
- readonly RED='\033[0;31m'
17
- readonly GREEN='\033[0;32m'
18
- readonly YELLOW='\033[1;33m'
19
- readonly BLUE='\033[0;34m'
20
- readonly NC='\033[0m'
21
- else
22
- readonly RED='' GREEN='' YELLOW='' BLUE='' NC=''
23
- fi
42
+ # shellcheck source=../dot/lib/ui.sh
43
+ # shellcheck disable=SC1091
44
+ source "${SCRIPT_DIR}/../dot/lib/ui.sh"
45
+ ui_init
24
46
 
25
47
  # Help text
26
48
  show_help() {
@@ -58,22 +80,11 @@ SECURITY NOTES:
58
80
  EOF
59
81
  }
60
82
 
61
- # Logging functions
62
- log_info() {
63
- echo -e "${BLUE}[INFO]${NC} $*"
64
- }
65
-
66
- log_success() {
67
- echo -e "${GREEN}[SUCCESS]${NC} $*"
68
- }
69
-
70
- log_warning() {
71
- echo -e "${YELLOW}[WARNING]${NC} $*"
72
- }
73
-
74
- log_error() {
75
- echo -e "${RED}[ERROR]${NC} $*"
76
- }
83
+ # Logging functions — delegate to shared ui.sh
84
+ log_info() { ui_info "$@"; }
85
+ log_success() { ui_ok "$@"; }
86
+ log_warning() { ui_warn "$@"; }
87
+ log_error() { ui_err "$@"; }
77
88
 
78
89
  # Initialize environment configuration
79
90
  init_config() {
@@ -105,6 +116,7 @@ init_config() {
105
116
  log_info "Next steps:"
106
117
  echo " 1. Edit .env.local and configure required variables"
107
118
  echo " 2. Run '$0 validate' to check configuration"
119
+ # shellcheck disable=SC1091
108
120
  echo " 3. Source the file: source .env.local"
109
121
 
110
122
  # Add to .gitignore if not present
@@ -130,7 +142,7 @@ validate_config() {
130
142
 
131
143
  # Check file permissions
132
144
  local perms
133
- perms=$(stat -c %a "$ENV_LOCAL" 2>/dev/null || stat -f %A "$ENV_LOCAL")
145
+ perms=$(stat -c %a "$ENV_LOCAL" 2>/dev/null || stat -f %OLp "$ENV_LOCAL")
134
146
  if [[ "$perms" != "600" ]]; then
135
147
  log_warning ".env.local has incorrect permissions ($perms). Should be 600."
136
148
  log_info "Fix with: chmod 600 $ENV_LOCAL"
@@ -139,6 +151,7 @@ validate_config() {
139
151
 
140
152
  # Source and validate environment
141
153
  # shellcheck source=/dev/null
154
+ # shellcheck disable=SC1091
142
155
  if source "$ENV_LOCAL" 2>/dev/null; then
143
156
  log_success ".env.local loads successfully"
144
157
  else
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck shell=bash
4
+ set -euo pipefail
5
+
6
+ # ssh-cert.sh — Short-lived SSH certificate management
7
+ #
8
+ # Supports step-ca (Smallstep) and ssh-keygen-based CA workflows.
9
+ # Short-lived certificates reduce the blast radius of key compromise
10
+ # by expiring automatically (default: 16 hours).
11
+ #
12
+ # Usage:
13
+ # dot ssh-cert issue [--ttl 16h] [--principal user]
14
+ # dot ssh-cert status
15
+ # dot ssh-cert revoke
16
+
17
+ # ---------- configuration -------------------------------------------------- #
18
+
19
+ SSH_DIR="${HOME}/.ssh"
20
+ CERT_FILE="${SSH_DIR}/id_ed25519-cert.pub"
21
+ KEY_FILE="${SSH_DIR}/id_ed25519"
22
+ DEFAULT_TTL="${SSH_CERT_TTL:-16h}"
23
+ DEFAULT_PRINCIPAL="${SSH_CERT_PRINCIPAL:-${USER}}"
24
+ CA_URL="${SSH_CERT_CA_URL:-}"
25
+ CA_PROVISIONER="${SSH_CERT_CA_PROVISIONER:-}"
26
+
27
+ # ---------- helpers -------------------------------------------------------- #
28
+
29
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
+ # shellcheck source=../dot/lib/ui.sh
31
+ # shellcheck disable=SC1091
32
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
33
+ ui_init
34
+
35
+ info() { ui_info "ssh-cert" "$*"; }
36
+ warn() { ui_warn "ssh-cert" "$*"; }
37
+ error() {
38
+ ui_err "ssh-cert" "$*"
39
+ exit 1
40
+ }
41
+
42
+ check_key() {
43
+ if [[ ! -f "$KEY_FILE" ]]; then
44
+ error "SSH key not found at $KEY_FILE. Generate one with: ssh-keygen -t ed25519"
45
+ fi
46
+ }
47
+
48
+ # ---------- issue ---------------------------------------------------------- #
49
+
50
+ cmd_issue() {
51
+ local ttl="$DEFAULT_TTL"
52
+ local principal="$DEFAULT_PRINCIPAL"
53
+
54
+ while [[ $# -gt 0 ]]; do
55
+ case "$1" in
56
+ --ttl)
57
+ ttl="$2"
58
+ shift 2
59
+ ;;
60
+ --principal)
61
+ principal="$2"
62
+ shift 2
63
+ ;;
64
+ *) error "Unknown option: $1" ;;
65
+ esac
66
+ done
67
+
68
+ check_key
69
+
70
+ # Method 1: step-ca (Smallstep) — preferred for production
71
+ if command -v step >/dev/null 2>&1 && [[ -n "$CA_URL" ]]; then
72
+ info "Requesting certificate from step-ca ($CA_URL)..."
73
+ local step_args=(ssh certificate "$principal" "$KEY_FILE"
74
+ --sign
75
+ --not-after "$ttl"
76
+ --ca-url "$CA_URL"
77
+ --force
78
+ )
79
+ if [[ -n "$CA_PROVISIONER" ]]; then
80
+ step_args+=(--provisioner "$CA_PROVISIONER")
81
+ fi
82
+ step "${step_args[@]}"
83
+ info "Certificate issued:"
84
+ step ssh inspect "$CERT_FILE"
85
+ return 0
86
+ fi
87
+
88
+ # Method 2: ssh-keygen with a local CA (for dev/testing)
89
+ local ca_key="${SSH_DIR}/ca_key"
90
+ if [[ ! -f "$ca_key" ]]; then
91
+ warn "No step-ca configured and no local CA key found."
92
+ echo ""
93
+ echo "To use short-lived SSH certificates, choose one of:"
94
+ echo ""
95
+ echo " Option A: Smallstep step-ca (recommended for production)"
96
+ echo " 1. Install: brew install step / sudo pacman -S step-cli step-ca"
97
+ echo " 2. Initialize CA: step ca init --name 'My CA' --provisioner admin"
98
+ echo " 3. Start CA: step-ca \$(step path)/config/ca.json"
99
+ echo " 4. Configure: export SSH_CERT_CA_URL=https://ca.example.com"
100
+ echo " 5. Run: dot ssh-cert issue"
101
+ echo ""
102
+ echo " Option B: Local CA key (for development/testing)"
103
+ echo " 1. Generate CA: ssh-keygen -t ed25519 -f ~/.ssh/ca_key -C 'local-ca'"
104
+ echo " 2. Run: dot ssh-cert issue"
105
+ echo ""
106
+ echo " Environment variables:"
107
+ echo " SSH_CERT_CA_URL step-ca server URL"
108
+ echo " SSH_CERT_CA_PROVISIONER step-ca provisioner name"
109
+ echo " SSH_CERT_TTL Certificate lifetime (default: 16h)"
110
+ echo " SSH_CERT_PRINCIPAL Certificate principal (default: \$USER)"
111
+ return 1
112
+ fi
113
+
114
+ info "Signing with local CA key ($ca_key)..."
115
+ info "TTL: $ttl, Principal: $principal"
116
+
117
+ # Parse TTL to seconds for validity
118
+ local validity="-${ttl}:+${ttl}"
119
+
120
+ ssh-keygen \
121
+ -s "$ca_key" \
122
+ -I "${principal}@$(hostname)-$(date +%s)" \
123
+ -n "$principal" \
124
+ -V "$validity" \
125
+ "${KEY_FILE}.pub"
126
+
127
+ info "Certificate issued:"
128
+ ssh-keygen -L -f "$CERT_FILE"
129
+ info "Expires automatically after $ttl"
130
+ }
131
+
132
+ # ---------- status --------------------------------------------------------- #
133
+
134
+ cmd_status() {
135
+ if [[ ! -f "$CERT_FILE" ]]; then
136
+ info "No SSH certificate found at $CERT_FILE"
137
+ return 0
138
+ fi
139
+
140
+ info "Current certificate:"
141
+ ssh-keygen -L -f "$CERT_FILE"
142
+
143
+ # Check expiry
144
+ local valid_to
145
+ valid_to=$(ssh-keygen -L -f "$CERT_FILE" 2>/dev/null | grep "Valid:" | sed 's/.*to //')
146
+ if [[ -n "$valid_to" ]]; then
147
+ local expiry_epoch
148
+ expiry_epoch=$(date -d "$valid_to" +%s 2>/dev/null || date -j -f "%Y-%m-%dT%H:%M:%S" "$valid_to" +%s 2>/dev/null || echo 0)
149
+ local now_epoch
150
+ now_epoch=$(date +%s)
151
+ if ((expiry_epoch > 0 && expiry_epoch < now_epoch)); then
152
+ warn "Certificate has EXPIRED"
153
+ return 1
154
+ else
155
+ local remaining=$(((expiry_epoch - now_epoch) / 3600))
156
+ info "Certificate valid for ~${remaining}h"
157
+ fi
158
+ fi
159
+ }
160
+
161
+ # ---------- revoke --------------------------------------------------------- #
162
+
163
+ cmd_revoke() {
164
+ if [[ ! -f "$CERT_FILE" ]]; then
165
+ info "No certificate to revoke"
166
+ return 0
167
+ fi
168
+
169
+ # Step-ca revocation
170
+ if command -v step >/dev/null 2>&1 && [[ -n "$CA_URL" ]]; then
171
+ info "Revoking certificate via step-ca..."
172
+ step ssh revoke "$CERT_FILE" --ca-url "$CA_URL" || true
173
+ fi
174
+
175
+ # Local removal
176
+ rm -f "$CERT_FILE"
177
+ info "Certificate removed: $CERT_FILE"
178
+ }
179
+
180
+ # ---------- main ----------------------------------------------------------- #
181
+
182
+ subcommand="${1:-}"
183
+ shift 2>/dev/null || true
184
+
185
+ case "$subcommand" in
186
+ issue) cmd_issue "$@" ;;
187
+ status) cmd_status ;;
188
+ revoke) cmd_revoke ;;
189
+ *)
190
+ echo "Usage: dot ssh-cert <command>"
191
+ echo ""
192
+ echo "Commands:"
193
+ echo " issue [--ttl 16h] [--principal user] Request a short-lived certificate"
194
+ echo " status Show current certificate status"
195
+ echo " revoke Revoke and remove certificate"
196
+ echo ""
197
+ echo "Environment:"
198
+ echo " SSH_CERT_CA_URL step-ca server URL (enables Smallstep mode)"
199
+ echo " SSH_CERT_CA_PROVISIONER step-ca provisioner name"
200
+ echo " SSH_CERT_TTL Certificate lifetime (default: 16h)"
201
+ echo " SSH_CERT_PRINCIPAL Certificate principal (default: \$USER)"
202
+ ;;
203
+ esac
@@ -1,28 +1,50 @@
1
- #!/bin/sh
2
- set -e
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
3
4
 
4
- if [ "${DOTFILES_TELEMETRY:-}" != "1" ]; then
5
- echo "Telemetry script is disabled by default."
6
- echo "Re-run with DOTFILES_TELEMETRY=1 to apply."
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ # shellcheck source=../dot/lib/ui.sh
7
+ # shellcheck disable=SC1091
8
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
+ # shellcheck source=../dot/lib/platform.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/platform.sh"
12
+
13
+ DRY_RUN=0
14
+ for arg in "$@"; do
15
+ case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
16
+ done
17
+ _run_cmd() {
18
+ if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
19
+ }
20
+
21
+ ui_init
22
+ ui_header "Telemetry"
23
+
24
+ if [[ "$DRY_RUN" -eq 1 ]]; then
25
+ ui_info "Mode" "dry-run (no changes will be made)"
26
+ elif [ "${DOTFILES_TELEMETRY:-}" != "1" ]; then
27
+ ui_warn "Telemetry" "disabled by default"
28
+ ui_info "Re-run" "DOTFILES_TELEMETRY=1"
7
29
  exit 1
8
30
  fi
9
31
 
10
- case "$(uname -s)" in
11
- Linux)
12
- echo "Disabling Ubuntu crash reporting (whoopsie/apport)..."
13
- sudo systemctl disable --now whoopsie 2>/dev/null || true
14
- sudo systemctl disable --now apport 2>/dev/null || true
15
- sudo systemctl mask apport 2>/dev/null || true
16
- echo "Disabling popularity-contest (if present)..."
17
- sudo systemctl disable --now popularity-contest 2>/dev/null || true
32
+ case "$(dot_platform_id)" in
33
+ linux | wsl)
34
+ ui_info "Disabling" "Ubuntu crash reporting (whoopsie/apport)"
35
+ _run_cmd sudo systemctl disable --now whoopsie 2>/dev/null || true
36
+ _run_cmd sudo systemctl disable --now apport 2>/dev/null || true
37
+ _run_cmd sudo systemctl mask apport 2>/dev/null || true
38
+ ui_info "Disabling" "popularity-contest"
39
+ _run_cmd sudo systemctl disable --now popularity-contest 2>/dev/null || true
18
40
  ;;
19
- Darwin)
20
- echo "Disabling macOS analytics (manual confirmation may be required)."
21
- sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist AutoSubmit -bool false || true
22
- sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist ThirdPartyDataSubmit -bool false || true
41
+ macos)
42
+ ui_info "Disabling" "macOS analytics"
43
+ _run_cmd sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist AutoSubmit -bool false || true
44
+ _run_cmd sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist ThirdPartyDataSubmit -bool false || true
23
45
  ;;
24
46
  *)
25
- echo "Unsupported OS for telemetry kill."
47
+ ui_err "Unsupported OS" "telemetry kill"
26
48
  exit 1
27
49
  ;;
28
50
  esac
@@ -1,29 +1,51 @@
1
- #!/bin/sh
2
- set -e
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
3
4
 
4
- if [ "${DOTFILES_USB_SAFETY:-}" != "1" ]; then
5
- echo "USB safety script is disabled by default."
6
- echo "Re-run with DOTFILES_USB_SAFETY=1 to apply."
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ # shellcheck source=../dot/lib/ui.sh
7
+ # shellcheck disable=SC1091
8
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
+ # shellcheck source=../dot/lib/platform.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/platform.sh"
12
+
13
+ DRY_RUN=0
14
+ for arg in "$@"; do
15
+ case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
16
+ done
17
+ _run_cmd() {
18
+ if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
19
+ }
20
+
21
+ ui_init
22
+ ui_header "USB Safety"
23
+
24
+ if [[ "$DRY_RUN" -eq 1 ]]; then
25
+ ui_info "Mode" "dry-run (no changes will be made)"
26
+ elif [ "${DOTFILES_USB_SAFETY:-}" != "1" ]; then
27
+ ui_warn "USB safety" "disabled by default"
28
+ ui_info "Re-run" "DOTFILES_USB_SAFETY=1"
7
29
  exit 1
8
30
  fi
9
31
 
10
- case "$(uname -s)" in
11
- Linux)
32
+ case "$(dot_platform_id)" in
33
+ linux | wsl)
12
34
  if command -v gsettings >/dev/null; then
13
- echo "Disabling GNOME automount for removable media..."
14
- gsettings set org.gnome.desktop.media-handling automount false || true
15
- gsettings set org.gnome.desktop.media-handling automount-open false || true
35
+ ui_info "Disabling" "GNOME automount for removable media"
36
+ _run_cmd gsettings set org.gnome.desktop.media-handling automount false || true
37
+ _run_cmd gsettings set org.gnome.desktop.media-handling automount-open false || true
16
38
  else
17
- echo "gsettings not found."
39
+ ui_err "gsettings" "not found"
18
40
  exit 1
19
41
  fi
20
42
  ;;
21
- Darwin)
22
- echo "macOS does not expose a simple CLI toggle for USB automount."
23
- echo "Use System Settings > General > Login Items > External disks."
43
+ macos)
44
+ ui_info "macOS" "no CLI toggle for USB automount"
45
+ ui_info "Use" "System Settings > General > Login Items > External disks"
24
46
  ;;
25
47
  *)
26
- echo "Unsupported OS for USB safety."
48
+ ui_err "Unsupported OS" "USB safety"
27
49
  exit 1
28
50
  ;;
29
51
  esac
@@ -1,10 +1,28 @@
1
- #!/bin/bash
2
- # GNOME Theme Applicator - Applies Catppuccin themes to GNOME desktop
3
- # Usage: apply-gnome-theme.sh <theme-name>
4
-
5
- set -e
6
-
7
- THEME_NAME="$1"
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Apply GNOME Theme — Apply Catppuccin themes to GNOME desktop.
4
+ ##
5
+ ## Configures GTK theme, icon theme, cursor theme, shell theme,
6
+ ## fonts, and wallpaper using gsettings.
7
+ ##
8
+ ## # Requirements
9
+ ## - gsettings: GNOME settings tool
10
+ ## - gnome-extensions (optional): For shell themes
11
+ ## - User Themes extension (optional): For custom shell themes
12
+ ##
13
+ ## # Usage
14
+ ## apply-gnome-theme.sh catppuccin-mocha # Apply dark theme
15
+ ## apply-gnome-theme.sh catppuccin-latte # Apply light theme
16
+ ## apply-gnome-theme.sh current # Show current theme
17
+ ## apply-gnome-theme.sh backup # Backup current settings
18
+ ##
19
+ ## # Platform Notes
20
+ ## - GNOME 42+: Full color-scheme support
21
+ ## - Older GNOME: Color scheme setting skipped
22
+
23
+ set -euo pipefail
24
+
25
+ THEME_NAME="${1:-}"
8
26
 
9
27
  if [ -z "$THEME_NAME" ]; then
10
28
  echo "Usage: $0 <theme-name>"
@@ -12,27 +30,28 @@ if [ -z "$THEME_NAME" ]; then
12
30
  exit 1
13
31
  fi
14
32
 
15
- # Colors for output
16
- RED='\033[0;31m'
17
- GREEN='\033[0;32m'
18
- YELLOW='\033[1;33m'
19
- BLUE='\033[0;34m'
20
- NC='\033[0m'
33
+ # Colors for output (respect NO_COLOR: https://no-color.org)
34
+ if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
35
+ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m'
36
+ BLUE='\033[0;34m' NC='\033[0m'
37
+ else
38
+ RED='' GREEN='' YELLOW='' BLUE='' NC=''
39
+ fi
21
40
 
22
41
  log() {
23
- echo -e "${BLUE}[GNOME]${NC} $1"
42
+ printf '%b\n' "${BLUE}[GNOME]${NC} $1"
24
43
  }
25
44
 
26
45
  warn() {
27
- echo -e "${YELLOW}[WARN]${NC} $1"
46
+ printf '%b\n' "${YELLOW}[WARN]${NC} $1"
28
47
  }
29
48
 
30
49
  error() {
31
- echo -e "${RED}[ERROR]${NC} $1"
50
+ printf '%b\n' "${RED}[ERROR]${NC} $1"
32
51
  }
33
52
 
34
53
  success() {
35
- echo -e "${GREEN}[SUCCESS]${NC} $1"
54
+ printf '%b\n' "${GREEN}[SUCCESS]${NC} $1"
36
55
  }
37
56
 
38
57
  # Check if we're running GNOME
@@ -174,54 +193,66 @@ apply_catppuccin_theme() {
174
193
  # Function to apply wallpaper
175
194
  apply_wallpaper() {
176
195
  local theme="$1"
177
- local wallpaper_path=""
196
+ local wallpaper_dir="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
197
+ local mode="light"
178
198
 
179
- # Check for system wallpapers first
180
- if [ -d "/usr/share/backgrounds/catppuccin" ]; then
181
- case "$theme" in
182
- catppuccin-latte)
183
- wallpaper_path="/usr/share/backgrounds/catppuccin/cat_latte.png"
184
- ;;
185
- catppuccin-frappe)
186
- wallpaper_path="/usr/share/backgrounds/catppuccin/cat_frappe.png"
187
- ;;
188
- catppuccin-macchiato)
189
- wallpaper_path="/usr/share/backgrounds/catppuccin/cat_macchiato.png"
190
- ;;
191
- catppuccin-mocha)
192
- wallpaper_path="/usr/share/backgrounds/catppuccin/cat_mocha.png"
193
- ;;
194
- esac
199
+ # Determine light/dark from theme name
200
+ case "$theme" in
201
+ *-latte) mode="light" ;;
202
+ *-frappe | *-macchiato | *-mocha) mode="dark" ;;
203
+ *-light*) mode="light" ;;
204
+ *-dark* | *-night* | *-storm* | *-moon*) mode="dark" ;;
205
+ esac
206
+
207
+ # Pick a random wallpaper matching the mode from curated collection
208
+ local wp=""
209
+ if [ -d "$wallpaper_dir" ]; then
210
+ wp="$(find "$wallpaper_dir" -maxdepth 1 -type f -iname "*-${mode}.jpg" 2>/dev/null | shuf -n 1 || true)"
195
211
  fi
196
212
 
197
- # Fallback to user wallpapers
198
- if [ ! -f "$wallpaper_path" ] && [ -d "$HOME/.local/share/backgrounds/catppuccin" ]; then
213
+ # Fallback: check Catppuccin system/user wallpapers
214
+ if [ -z "$wp" ]; then
215
+ local cat_flavor=""
199
216
  case "$theme" in
200
- catppuccin-latte)
201
- wallpaper_path="$HOME/.local/share/backgrounds/catppuccin/cat_latte.png"
202
- ;;
203
- catppuccin-frappe)
204
- wallpaper_path="$HOME/.local/share/backgrounds/catppuccin/cat_frappe.png"
205
- ;;
206
- catppuccin-macchiato)
207
- wallpaper_path="$HOME/.local/share/backgrounds/catppuccin/cat_macchiato.png"
208
- ;;
209
- catppuccin-mocha)
210
- wallpaper_path="$HOME/.local/share/backgrounds/catppuccin/cat_mocha.png"
211
- ;;
217
+ catppuccin-latte) cat_flavor="latte" ;;
218
+ catppuccin-frappe) cat_flavor="frappe" ;;
219
+ catppuccin-macchiato) cat_flavor="macchiato" ;;
220
+ catppuccin-mocha) cat_flavor="mocha" ;;
212
221
  esac
222
+ if [ -n "$cat_flavor" ]; then
223
+ for dir in /usr/share/backgrounds/catppuccin "$HOME/.local/share/backgrounds/catppuccin"; do
224
+ if [ -f "$dir/cat_${cat_flavor}.png" ]; then
225
+ wp="$dir/cat_${cat_flavor}.png"
226
+ break
227
+ fi
228
+ done
229
+ fi
230
+ fi
231
+
232
+ if [ -z "$wp" ]; then
233
+ warn "No ${mode} wallpapers found in $wallpaper_dir"
234
+ return
213
235
  fi
214
236
 
215
- if [ -f "$wallpaper_path" ]; then
216
- log "Setting wallpaper: $wallpaper_path"
217
- gsettings set org.gnome.desktop.background picture-uri "file://$wallpaper_path"
218
- gsettings set org.gnome.desktop.background picture-uri-dark "file://$wallpaper_path"
219
- gsettings set org.gnome.desktop.screensaver picture-uri "file://$wallpaper_path"
220
- success "Wallpaper set to Catppuccin theme wallpaper"
237
+ log "Setting wallpaper: $wp"
238
+
239
+ # Set both light and dark URIs if we have a pair
240
+ local base="${wp%-${mode}.jpg}"
241
+ local light_wp="${base}-light.jpg"
242
+ local dark_wp="${base}-dark.jpg"
243
+
244
+ if [ -f "$light_wp" ] && [ -f "$dark_wp" ]; then
245
+ gsettings set org.gnome.desktop.background picture-uri "file://${light_wp}"
246
+ gsettings set org.gnome.desktop.background picture-uri-dark "file://${dark_wp}"
247
+ gsettings set org.gnome.desktop.screensaver picture-uri "file://${light_wp}"
221
248
  else
222
- warn "Catppuccin wallpaper not found for theme: $theme"
223
- log "Install wallpapers with: $HOME/.dotfiles/scripts/theme/install-catppuccin-themes.sh wallpapers"
249
+ gsettings set org.gnome.desktop.background picture-uri "file://$wp"
250
+ gsettings set org.gnome.desktop.background picture-uri-dark "file://$wp"
251
+ gsettings set org.gnome.desktop.screensaver picture-uri "file://$wp"
224
252
  fi
253
+ gsettings set org.gnome.desktop.background picture-options "zoom"
254
+
255
+ success "Wallpaper set (${mode}): $(basename "$wp")"
225
256
  }
226
257
 
227
258
  # Function to backup current settings