@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,42 +1,397 @@
1
- #!/bin/sh
2
- set -e
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
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
+
10
+ ui_init
11
+ ui_header "Wallpaper Sync"
3
12
 
4
13
  WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
14
+ CHEZMOI_CFG="${XDG_CONFIG_HOME:-$HOME/.config}/chezmoi/chezmoi.toml"
15
+ DATA_FILE="${HOME}/.dotfiles/.chezmoidata.toml"
5
16
 
17
+ WALLPAPER_DIR_EXISTS=true
6
18
  if [ ! -d "$WALLPAPER_DIR" ]; then
7
- echo "Wallpaper directory not found: $WALLPAPER_DIR"
8
- exit 1
19
+ WALLPAPER_DIR_EXISTS=false
9
20
  fi
10
21
 
22
+ # Detect current color scheme (light/dark)
23
+ detect_mode() {
24
+ if command -v dms &>/dev/null; then
25
+ local dms_mode
26
+ dms_mode="$(dms ipc theme getMode 2>/dev/null || true)"
27
+ case "$dms_mode" in
28
+ dark | light)
29
+ echo "$dms_mode"
30
+ return 0
31
+ ;;
32
+ esac
33
+ fi
34
+
35
+ if command -v gsettings &>/dev/null; then
36
+ local scheme
37
+ scheme="$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null || echo "")"
38
+ case "$scheme" in
39
+ *dark*) echo "dark" ;;
40
+ *) echo "light" ;;
41
+ esac
42
+ else
43
+ echo "dark"
44
+ fi
45
+ }
46
+
47
+ MODE="$(detect_mode)"
48
+
49
+ current_theme() {
50
+ if [[ -f "$CHEZMOI_CFG" ]]; then
51
+ local chezmoi_theme
52
+ chezmoi_theme="$(awk -F'"' '/^theme =/ {print $2}' "$CHEZMOI_CFG" | head -n 1)"
53
+ if [[ -n "$chezmoi_theme" ]]; then
54
+ printf '%s\n' "$chezmoi_theme"
55
+ return 0
56
+ fi
57
+ fi
58
+
59
+ if [[ -f "$DATA_FILE" ]]; then
60
+ awk -F'"' '/^theme =/ {print $2}' "$DATA_FILE" | head -n 1
61
+ fi
62
+ }
63
+
64
+ wallpaper_for_theme() {
65
+ local theme="${1:-}"
66
+ local mode="${2:-}"
67
+ local candidate=""
68
+ local family=""
69
+
70
+ [[ -n "$theme" ]] || return 1
71
+ [[ -n "$mode" ]] || return 1
72
+
73
+ # 1. Check themes.toml for stored wallpaper path (set by extract-theme.py)
74
+ local themes_file="${HOME}/.dotfiles/.chezmoidata/themes.toml"
75
+ if [[ -f "$themes_file" ]]; then
76
+ local stored_wp
77
+ stored_wp="$(awk -v n="$theme" '
78
+ $0 == "[themes." n "]" { found=1; next }
79
+ /^\[/ { found=0 }
80
+ found && /^wallpaper/ { sub(/.*= *"/, ""); sub(/".*/, ""); print; exit }
81
+ ' "$themes_file")"
82
+ if [[ -n "$stored_wp" && -f "$stored_wp" ]]; then
83
+ printf '%s\n' "$stored_wp"
84
+ return 0
85
+ fi
86
+ fi
87
+
88
+ # 2. Check custom wallpaper directory
89
+ for ext in heic jpg png; do
90
+ candidate="$WALLPAPER_DIR/${theme}.${ext}"
91
+ if [[ -f "$candidate" ]]; then
92
+ printf '%s\n' "$candidate"
93
+ return 0
94
+ fi
95
+ done
96
+
97
+ family="${theme%-dark}"
98
+ if [[ "$family" == "$theme" ]]; then
99
+ family="${theme%-light}"
100
+ fi
101
+ for ext in heic jpg png; do
102
+ candidate="$WALLPAPER_DIR/${family}-${mode}.${ext}"
103
+ if [[ -f "$candidate" ]]; then
104
+ printf '%s\n' "$candidate"
105
+ return 0
106
+ fi
107
+ done
108
+
109
+ return 1
110
+ }
111
+
112
+ # Fallback: find a matching system wallpaper when no custom one exists.
113
+ # Maps theme names to platform-native wallpapers shipped with the OS.
114
+ system_wallpaper_for_theme() {
115
+ local theme="${1:-}"
116
+ local mode="${2:-}"
117
+ local SYS_MAC="/System/Library/Desktop Pictures"
118
+ local SYS_LINUX_DIRS=(
119
+ /usr/share/backgrounds
120
+ /usr/share/wallpapers
121
+ )
122
+
123
+ [[ -n "$theme" ]] || return 1
124
+
125
+ # macOS: map theme names to Apple system wallpapers
126
+ if [[ "$(uname -s)" == "Darwin" && -d "$SYS_MAC" ]]; then
127
+ local -A mac_map=(
128
+ [macos - sonoma]="$SYS_MAC/Sonoma.heic"
129
+ [macos - blue]="$SYS_MAC/Mac Blue.heic"
130
+ [macos - pink]="$SYS_MAC/Mac Pink.heic"
131
+ [macos - purple]="$SYS_MAC/Mac Purple.heic"
132
+ [macos - yellow]="$SYS_MAC/Mac Yellow.heic"
133
+ [macos - orange]="$SYS_MAC/iMac Orange.heic"
134
+ [macos - green]="$SYS_MAC/iMac Green.heic"
135
+ [macos - silver]="$SYS_MAC/iMac Silver.heic"
136
+ )
137
+
138
+ # Extract family from theme name (strip -dark/-light)
139
+ local family="${theme%-dark}"
140
+ [[ "$family" == "$theme" ]] && family="${theme%-light}"
141
+
142
+ local sys_wp="${mac_map[$family]:-}"
143
+ if [[ -n "$sys_wp" && -f "$sys_wp" ]]; then
144
+ printf '%s\n' "$sys_wp"
145
+ return 0
146
+ fi
147
+ fi
148
+
149
+ # Linux: search system background directories for keyword match
150
+ if [[ "$(uname -s)" == "Linux" ]]; then
151
+ local keyword="${theme#macos-}"
152
+ keyword="${keyword%-dark}"
153
+ keyword="${keyword%-light}"
154
+
155
+ for dir in "${SYS_LINUX_DIRS[@]}"; do
156
+ [[ -d "$dir" ]] || continue
157
+ local match
158
+ match="$(find "$dir" -maxdepth 3 -type f \( -name "*.jpg" -o -name "*.png" \) \
159
+ -iname "*${keyword}*" 2>/dev/null | head -1)"
160
+ if [[ -n "$match" ]]; then
161
+ printf '%s\n' "$match"
162
+ return 0
163
+ fi
164
+ done
165
+ fi
166
+
167
+ return 1
168
+ }
169
+
170
+ theme_wallpaper_pair() {
171
+ local theme="${1:-}"
172
+ local family=""
173
+ local light_wp=""
174
+ local dark_wp=""
175
+
176
+ [[ -n "$theme" ]] || return 1
177
+
178
+ family="${theme%-dark}"
179
+ if [[ "$family" == "$theme" ]]; then
180
+ family="${theme%-light}"
181
+ fi
182
+
183
+ light_wp="$(wallpaper_for_theme "${family}-light" "light" || true)"
184
+ dark_wp="$(wallpaper_for_theme "${family}-dark" "dark" || true)"
185
+
186
+ if [[ -n "$light_wp" && -n "$dark_wp" ]]; then
187
+ printf '%s\n%s\n' "$light_wp" "$dark_wp"
188
+ return 0
189
+ fi
190
+
191
+ return 1
192
+ }
193
+
194
+ # Pick a wallpaper matching the current mode
11
195
  pick_wallpaper() {
12
- find "$WALLPAPER_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) | head -n 1
196
+ local mode="$1"
197
+ local theme="${2:-}"
198
+ local files=()
199
+
200
+ if [[ -n "$theme" ]]; then
201
+ local matched
202
+ matched="$(wallpaper_for_theme "$theme" "$mode" || true)"
203
+ if [[ -n "$matched" ]]; then
204
+ printf '%s\n' "$matched"
205
+ return 0
206
+ fi
207
+ fi
208
+
209
+ while IFS= read -r line; do
210
+ files+=("$line")
211
+ done < <(find "$WALLPAPER_DIR" -maxdepth 1 -type f \( -iname "*-${mode}.jpg" -o -iname "*-${mode}.png" -o -iname "*-${mode}.heic" \) | sort)
212
+
213
+ if [[ ${#files[@]} -eq 0 ]]; then
214
+ return 1
215
+ fi
216
+
217
+ # Pick a random one
218
+ if command -v shuf &>/dev/null; then
219
+ printf '%s\n' "${files[@]}" | shuf -n 1
220
+ else
221
+ echo "${files[$RANDOM % ${#files[@]}]}"
222
+ fi
13
223
  }
14
224
 
15
- WALLPAPER="$(pick_wallpaper)"
16
- if [ -z "$WALLPAPER" ]; then
17
- echo "No wallpapers found in $WALLPAPER_DIR"
18
- exit 1
225
+ THEME="$(current_theme || true)"
226
+ WALLPAPER=""
227
+ if [[ "$WALLPAPER_DIR_EXISTS" == "true" ]]; then
228
+ WALLPAPER="$(pick_wallpaper "$MODE" "$THEME" || true)"
19
229
  fi
20
230
 
21
- case "$(uname -s)" in
22
- Darwin)
23
- osascript -e "tell application \"System Events\" to set picture of every desktop to POSIX file \"$WALLPAPER\"" || true
24
- ;;
25
- Linux)
26
- if command -v feh >/dev/null; then
27
- feh --bg-fill "$WALLPAPER"
28
- elif command -v swaybg >/dev/null; then
29
- pkill swaybg || true
30
- swaybg -i "$WALLPAPER" -m fill &
31
- else
32
- echo "No supported wallpaper setter found (feh/swaybg)."
33
- exit 1
34
- fi
35
- ;;
36
- *)
37
- echo "Wallpaper sync not supported on this OS."
38
- exit 1
39
- ;;
40
- esac
41
-
42
- printf "Wallpaper applied: %s\n" "$WALLPAPER"
231
+ # Fallback: try OS-native system wallpapers
232
+ if [[ -z "$WALLPAPER" ]]; then
233
+ WALLPAPER="$(system_wallpaper_for_theme "$THEME" "$MODE" || true)"
234
+ if [[ -n "$WALLPAPER" ]]; then
235
+ ui_info "Wallpaper" "using system wallpaper: $(basename "$WALLPAPER")"
236
+ fi
237
+ fi
238
+
239
+ if [[ -z "$WALLPAPER" ]]; then
240
+ ui_info "Wallpaper" "no wallpaper for ${THEME:-unknown} (skipping theme colors still apply)"
241
+ exit 0
242
+ fi
243
+
244
+ # Convert .heic to .png on Linux (HEIC not universally supported)
245
+ ensure_linux_compatible() {
246
+ local wp="$1"
247
+ [[ "$(uname -s)" == "Linux" ]] || {
248
+ printf '%s\n' "$wp"
249
+ return
250
+ }
251
+ [[ "${wp##*.}" == "heic" ]] || {
252
+ printf '%s\n' "$wp"
253
+ return
254
+ }
255
+
256
+ local png="${wp%.heic}.png"
257
+ if [[ -f "$png" ]] && [[ "$png" -nt "$wp" ]]; then
258
+ printf '%s\n' "$png"
259
+ return
260
+ fi
261
+
262
+ if command -v magick &>/dev/null; then
263
+ magick "$wp" -quality 95 "$png" 2>/dev/null && {
264
+ printf '%s\n' "$png"
265
+ return
266
+ }
267
+ elif command -v heif-convert &>/dev/null; then
268
+ heif-convert "$wp" "$png" 2>/dev/null && {
269
+ printf '%s\n' "$png"
270
+ return
271
+ }
272
+ elif command -v convert &>/dev/null; then
273
+ convert "$wp" "$png" 2>/dev/null && {
274
+ printf '%s\n' "$png"
275
+ return
276
+ }
277
+ fi
278
+
279
+ # Fallback: use original and hope the DE supports it
280
+ printf '%s\n' "$wp"
281
+ }
282
+
283
+ # Apply wallpaper based on platform and compositor
284
+ apply_wallpaper() {
285
+ local wp="$1"
286
+ local mode="$2"
287
+
288
+ # Convert HEIC to PNG on Linux if needed
289
+ wp="$(ensure_linux_compatible "$wp")"
290
+ local wp_uri="file://${wp}"
291
+
292
+ case "$(uname -s)" in
293
+ Darwin)
294
+ osascript -e "tell application \"System Events\" to set picture of every desktop to POSIX file \"$wp\"" || true
295
+ ;;
296
+ Linux)
297
+ # Niri + DMS/Quickshell uses its own wallpaper state.
298
+ if command -v dms &>/dev/null; then
299
+ local dms_result current_outputs output current_dms_mode light_wp dark_wp
300
+ dms_result="$(dms ipc wallpaper set "$wp" 2>/dev/null || true)"
301
+ if [[ "$dms_result" == SUCCESS:* ]]; then
302
+ ui_info "Applied via" "dms ipc wallpaper set"
303
+ elif [[ "$dms_result" == ERROR:\ Per-monitor\ mode\ enabled* ]]; then
304
+ current_outputs="$(dms ipc outputs current 2>/dev/null | tr -d '[]"')"
305
+ for output in ${current_outputs//,/ }; do
306
+ [[ -n "$output" ]] || continue
307
+ dms ipc wallpaper setFor "$output" "$wp" >/dev/null 2>&1 || true
308
+ done
309
+ ui_info "Applied via" "dms ipc wallpaper setFor"
310
+ else
311
+ ui_warn "DMS wallpaper" "set failed, falling back"
312
+ fi
313
+
314
+ # Keep DMS light/dark wallpaper slots aligned with the theme family.
315
+ if [[ -n "${THEME:-}" ]] && mapfile -t _pair < <(theme_wallpaper_pair "$THEME"); then
316
+ light_wp="${_pair[0]:-}"
317
+ dark_wp="${_pair[1]:-}"
318
+ current_dms_mode="$(dms ipc theme getMode 2>/dev/null || printf '%s\n' "$mode")"
319
+
320
+ if [[ -n "$light_wp" && -n "$dark_wp" ]]; then
321
+ dms ipc theme light >/dev/null 2>&1 || true
322
+ dms ipc wallpaper set "$light_wp" >/dev/null 2>&1 || true
323
+
324
+ dms ipc theme dark >/dev/null 2>&1 || true
325
+ dms ipc wallpaper set "$dark_wp" >/dev/null 2>&1 || true
326
+
327
+ if [[ "$current_dms_mode" == "light" ]]; then
328
+ dms ipc theme light >/dev/null 2>&1 || true
329
+ else
330
+ dms ipc theme dark >/dev/null 2>&1 || true
331
+ fi
332
+ ui_info "DMS pair" "$(basename "$light_wp"), $(basename "$dark_wp")"
333
+ fi
334
+ fi
335
+ fi
336
+
337
+ # gsettings-based desktop state for GTK/freedesktop consumers
338
+ if command -v gsettings &>/dev/null; then
339
+ # Find the matching pair for picture-uri and picture-uri-dark
340
+ local light_wp dark_wp base ext
341
+ ext="${wp##*.}"
342
+ base="${wp%-${mode}.${ext}}"
343
+ if [[ -f "${base}-light.${ext}" ]] && [[ -f "${base}-dark.${ext}" ]]; then
344
+ light_wp="${base}-light.${ext}"
345
+ dark_wp="${base}-dark.${ext}"
346
+ elif [[ -f "${base}-light.heic" ]] && [[ -f "${base}-dark.heic" ]]; then
347
+ light_wp="${base}-light.heic"
348
+ dark_wp="${base}-dark.heic"
349
+ elif [[ -f "${base}-light.jpg" ]] && [[ -f "${base}-dark.jpg" ]]; then
350
+ light_wp="${base}-light.jpg"
351
+ dark_wp="${base}-dark.jpg"
352
+ elif [[ -f "${base}-light.png" ]] && [[ -f "${base}-dark.png" ]]; then
353
+ light_wp="${base}-light.png"
354
+ dark_wp="${base}-dark.png"
355
+ else
356
+ light_wp=""
357
+ dark_wp=""
358
+ fi
359
+
360
+ if [[ -n "$light_wp" ]] && [[ -n "$dark_wp" ]]; then
361
+ light_wp="$(ensure_linux_compatible "$light_wp")"
362
+ dark_wp="$(ensure_linux_compatible "$dark_wp")"
363
+ gsettings set org.gnome.desktop.background picture-uri "file://${light_wp}"
364
+ gsettings set org.gnome.desktop.background picture-uri-dark "file://${dark_wp}"
365
+ gsettings set org.gnome.desktop.screensaver picture-uri "file://${light_wp}"
366
+ else
367
+ gsettings set org.gnome.desktop.background picture-uri "$wp_uri"
368
+ gsettings set org.gnome.desktop.background picture-uri-dark "$wp_uri"
369
+ gsettings set org.gnome.desktop.screensaver picture-uri "$wp_uri"
370
+ fi
371
+ gsettings set org.gnome.desktop.background picture-options "zoom"
372
+ ui_info "Applied via" "gsettings"
373
+ elif command -v swaybg &>/dev/null; then
374
+ pkill swaybg || true
375
+ swaybg -i "$wp" -m fill &
376
+ ui_info "Applied via" "swaybg"
377
+ elif command -v feh &>/dev/null; then
378
+ feh --bg-fill "$wp"
379
+ ui_info "Applied via" "feh"
380
+ else
381
+ ui_err "Wallpaper setter" "not found (gsettings/swaybg/feh)"
382
+ return 1
383
+ fi
384
+ ;;
385
+ *)
386
+ ui_err "Unsupported OS" "wallpaper sync"
387
+ return 1
388
+ ;;
389
+ esac
390
+ }
391
+
392
+ apply_wallpaper "$WALLPAPER" "$MODE"
393
+ if [[ -n "$THEME" ]]; then
394
+ ui_ok "Wallpaper applied (${MODE})" "$(basename "$WALLPAPER") ← $THEME"
395
+ else
396
+ ui_ok "Wallpaper applied (${MODE})" "$(basename "$WALLPAPER")"
397
+ fi
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  if ! command -v cmatrix >/dev/null; then
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # MIT License
3
- # Copyright (c) 2026 Sebastien Rousseau
3
+ # Copyright (c) 2026
4
4
  # See LICENSE file for details.
5
5
 
6
6
  import os
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  EMOJI_FILE="${EMOJI_FILE:-$HOME/.config/emoji/emoji.txt}"
@@ -36,7 +37,9 @@ fi
36
37
 
37
38
  printf '%s' "$emoji"
38
39
 
39
- if command -v pbcopy >/dev/null; then
40
+ if command -v cb >/dev/null; then
41
+ printf '%s' "$emoji" | cb
42
+ elif command -v pbcopy >/dev/null; then
40
43
  printf '%s' "$emoji" | pbcopy
41
44
  elif command -v wl-copy >/dev/null; then
42
45
  printf '%s' "$emoji" | wl-copy
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  text="${*:-${USER:-dotfiles}}"
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  LOG_DIR="${HOME}/.local/share"
@@ -15,7 +16,7 @@ if [[ "${size}" -lt "${MAX_SIZE_BYTES}" ]]; then
15
16
  exit 0
16
17
  fi
17
18
 
18
- for i in $(seq ${ROTATIONS} -1 1); do
19
+ for ((i = ROTATIONS; i >= 1; i--)); do
19
20
  if [[ -f "${LOG_FILE}.${i}.gz" ]]; then
20
21
  mv "${LOG_FILE}.${i}.gz" "${LOG_FILE}.$((i + 1)).gz"
21
22
  elif [[ -f "${LOG_FILE}.${i}" ]]; then
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  if command -v lolcat >/dev/null; then
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  set -euo pipefail
3
4
 
4
5
  # Simple terminal pipes screensaver
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # Linux System Tuning (opt-in)
3
4
  # Managed by chezmoi - https://github.com/sebastienrousseau/dotfiles
4
5
  #
@@ -7,38 +8,46 @@
7
8
 
8
9
  set -euo pipefail
9
10
 
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ # shellcheck source=../dot/lib/ui.sh
13
+ # shellcheck disable=SC1091
14
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
15
+
16
+ ui_init
17
+ ui_header "Linux Tuning"
18
+
10
19
  if [[ "${DOTFILES_TUNING:-0}" != "1" ]]; then
11
- echo "Tuning is disabled. Re-run with DOTFILES_TUNING=1 to apply."
20
+ ui_warn "Tuning" "disabled. Re-run with DOTFILES_TUNING=1"
12
21
  exit 0
13
22
  fi
14
23
 
15
24
  PROFILE="${DOTFILES_PROFILE:-laptop}"
16
25
 
17
26
  if [[ "$PROFILE" != "laptop" && "$PROFILE" != "desktop" && "$PROFILE" != "server" ]]; then
18
- echo "DOTFILES_PROFILE must be: laptop, desktop, or server. Got: $PROFILE"
27
+ ui_err "DOTFILES_PROFILE" "must be laptop, desktop, or server (got: $PROFILE)"
19
28
  exit 1
20
29
  fi
21
30
 
22
- echo "Applying Linux tuning for profile: $PROFILE"
31
+ ui_info "Applying tuning" "$PROFILE profile"
23
32
 
24
33
  apply_sysctl() {
25
34
  local key="$1"
26
35
  local value="$2"
27
36
  if command -v sudo >/dev/null; then
28
- echo " Setting $key = $value"
29
- sudo sysctl -w "$key=$value" >/dev/null 2>&1 || echo " Warning: Failed to set $key"
37
+ ui_info "Setting" "$key = $value"
38
+ sudo sysctl -w "$key=$value" >/dev/null 2>&1 || ui_warn "Failed to set" "$key"
30
39
  fi
31
40
  }
32
41
 
33
42
  if ! command -v sudo >/dev/null; then
34
- echo "sudo not available; skipping sysctl tuning."
43
+ ui_warn "sudo" "not available; skipping sysctl tuning"
35
44
  exit 0
36
45
  fi
37
46
 
38
47
  # =============================================================================
39
48
  # File System Tuning
40
49
  # =============================================================================
41
- echo "Configuring file system settings..."
50
+ ui_header "File system settings"
42
51
 
43
52
  # Increase inotify watchers for IDEs and file sync tools
44
53
  apply_sysctl "fs.inotify.max_user_watches" "524288"
@@ -50,7 +59,7 @@ apply_sysctl "fs.file-max" "2097152"
50
59
  # =============================================================================
51
60
  # Memory Tuning - vm.swappiness
52
61
  # =============================================================================
53
- echo "Configuring memory settings..."
62
+ ui_header "Memory settings"
54
63
 
55
64
  case "$PROFILE" in
56
65
  laptop)
@@ -79,7 +88,7 @@ esac
79
88
  # =============================================================================
80
89
  # Network Tuning - TCP Keepalive
81
90
  # =============================================================================
82
- echo "Configuring TCP keepalive settings..."
91
+ ui_header "TCP keepalive settings"
83
92
 
84
93
  # TCP keepalive: Detect dead connections faster
85
94
  # Default: 7200s (2 hours) - we reduce to 60s for faster detection
@@ -113,8 +122,9 @@ apply_sysctl "net.ipv4.tcp_fin_timeout" "15"
113
122
  # =============================================================================
114
123
  # Security Tuning
115
124
  # =============================================================================
116
- echo "Configuring security settings..."
125
+ ui_header "Security settings"
117
126
 
127
+ # shellcheck disable=SC1091
118
128
  # Disable IP source routing
119
129
  apply_sysctl "net.ipv4.conf.all.accept_source_route" "0"
120
130
  apply_sysctl "net.ipv4.conf.default.accept_source_route" "0"
@@ -132,7 +142,7 @@ apply_sysctl "net.ipv4.tcp_syncookies" "1"
132
142
  # =============================================================================
133
143
  # Persist Settings
134
144
  # =============================================================================
135
- echo "Persisting settings to /etc/sysctl.d/99-dotfiles.conf..."
145
+ ui_header "Persisting sysctl settings"
136
146
 
137
147
  if command -v sudo >/dev/null; then
138
148
  sudo tee /etc/sysctl.d/99-dotfiles.conf >/dev/null <<'EOF'
@@ -171,5 +181,5 @@ net.ipv4.tcp_syncookies = 1
171
181
  EOF
172
182
  fi
173
183
 
174
- echo "Linux tuning complete for profile: $PROFILE"
175
- echo "Note: Some settings require a reboot to take full effect."
184
+ ui_ok "Linux tuning complete" "$PROFILE profile"
185
+ ui_info "Note" "Some settings require a reboot"
@@ -1,19 +1,28 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # macOS tuning (opt-in)
3
4
 
4
5
  set -euo pipefail
5
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
+
12
+ ui_init
13
+ ui_header "macOS Tuning"
14
+
6
15
  if [[ "${DOTFILES_TUNING:-0}" != "1" ]]; then
7
- echo "Tuning is disabled. Re-run with DOTFILES_TUNING=1 to apply."
16
+ ui_warn "Tuning" "disabled. Re-run with DOTFILES_TUNING=1"
8
17
  exit 0
9
18
  fi
10
19
 
11
20
  if [[ "${DOTFILES_PROFILE:-}" != "laptop" && "${DOTFILES_PROFILE:-}" != "desktop" && "${DOTFILES_PROFILE:-}" != "server" ]]; then
12
- echo "DOTFILES_PROFILE is not set to a known profile. Aborting."
21
+ ui_err "DOTFILES_PROFILE" "not set to known profile"
13
22
  exit 1
14
23
  fi
15
24
 
16
- echo "Applying macOS tuning..."
25
+ ui_info "Applying" "macOS tuning"
17
26
 
18
27
  # Faster key repeat (requires logout/login to fully apply)
19
28
  defaults write -g InitialKeyRepeat -int 15
@@ -43,4 +52,4 @@ defaults write com.apple.dock autohide-delay -float 0
43
52
  defaults write com.apple.dock autohide-time-modifier -float 0.2
44
53
  killall Dock >/dev/null 2>&1 || true
45
54
 
46
- echo "macOS tuning complete."
55
+ ui_ok "macOS tuning" "complete"