@sebastienrousseau/dotfiles 0.2.499 → 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 (538) hide show
  1. package/CHANGELOG.md +375 -0
  2. package/LICENSE +1283 -0
  3. package/README.md +284 -0
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +4 -3
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +78 -0
  9. package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
  10. package/docs/adr/ADR-002-shell-performance.md +121 -0
  11. package/docs/adr/ADR-003-security-first.md +140 -0
  12. package/docs/adr/ADR-004-cli-architecture.md +157 -0
  13. package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
  14. package/docs/adr/ADR-006-shell-selection.md +115 -0
  15. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  16. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  17. package/docs/adr/README.md +32 -0
  18. package/docs/architecture/ARCHITECTURE.md +113 -0
  19. package/docs/architecture/INTEROP.md +36 -0
  20. package/docs/architecture/REPO_LAYOUT.md +237 -0
  21. package/docs/architecture/WALKTHROUGH.md +82 -0
  22. package/docs/architecture/fleet-deployment.md +73 -0
  23. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  24. package/docs/archive/LEGACY_ROADMAP.md +142 -0
  25. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  26. package/docs/{PLAN.md → archive/PLAN.md} +4 -4
  27. package/docs/archive/REPO_AUDIT.md +23 -0
  28. package/docs/guides/INSTALL.md +140 -0
  29. package/docs/guides/NEOVIM_IDE_GUIDE.md +52 -0
  30. package/docs/guides/THEMING.md +222 -0
  31. package/docs/guides/TROUBLESHOOTING.md +148 -0
  32. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +723 -0
  33. package/docs/index.md +39 -0
  34. package/docs/interop/A2A.md +32 -0
  35. package/docs/manual/00-introduction.md +85 -0
  36. package/docs/manual/01-concepts/01-architecture.md +134 -0
  37. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  38. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  39. package/docs/manual/01-concepts/04-fleet.md +142 -0
  40. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  41. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  42. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  43. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  44. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  45. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  46. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  47. package/docs/manual/03-reference/02-config-files.md +259 -0
  48. package/docs/manual/03-reference/03-environment.md +120 -0
  49. package/docs/manual/03-reference/04-templates.md +184 -0
  50. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  51. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  52. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  53. package/docs/manual/04-cookbook/03-faq.md +167 -0
  54. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  55. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  56. package/docs/manual/05-appendices/C-glossary.md +36 -0
  57. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  58. package/docs/manual/05-appendices/E-license.md +34 -0
  59. package/docs/manual/_toc.yml +58 -0
  60. package/docs/manual/command-index.md +58 -0
  61. package/docs/manual/concept-index.md +164 -0
  62. package/docs/operations/ATTESTATION.md +39 -0
  63. package/docs/operations/MAINTENANCE.md +59 -0
  64. package/docs/operations/MIGRATION.md +101 -0
  65. package/docs/operations/OPERATIONS.md +164 -0
  66. package/docs/operations/RELIABILITY.md +116 -0
  67. package/docs/{ROADMAP.md → operations/ROADMAP.md} +22 -22
  68. package/docs/operations/TESTING.md +195 -0
  69. package/docs/operations/TRACEABILITY.md +31 -0
  70. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  71. package/docs/operations/VERSION_SYNC.md +344 -0
  72. package/docs/reference/ALIASES.md +124 -0
  73. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  74. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  75. package/docs/reference/FEATURES.md +62 -0
  76. package/docs/reference/FONTS.md +108 -0
  77. package/docs/reference/PROFILES.md +65 -0
  78. package/docs/reference/SCREENSHOTS.md +117 -0
  79. package/docs/reference/SCRIPTS.md +67 -0
  80. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  81. package/docs/reference/THEMES.md +113 -0
  82. package/docs/reference/TOOLS.md +105 -0
  83. package/docs/reference/UTILS.md +151 -0
  84. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  85. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  86. package/docs/security/COMPLIANCE.md +453 -0
  87. package/docs/security/ENCRYPTION.md +52 -0
  88. package/docs/security/FMEA.md +155 -0
  89. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  90. package/docs/security/KEYS.md +45 -0
  91. package/docs/security/KEY_ROTATION.md +219 -0
  92. package/docs/security/MCP_POLICY.md +69 -0
  93. package/docs/security/POLICY_RELEASES.md +33 -0
  94. package/docs/security/README.md +24 -0
  95. package/docs/security/SECRETS.md +146 -0
  96. package/docs/security/SECURITY.md +41 -0
  97. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  98. package/docs/security/SOUP_REGISTER.md +32 -0
  99. package/docs/security/THREAT_MODEL.md +120 -0
  100. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  101. package/docs/themes/README.md +6 -0
  102. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  103. package/docs/themes/hero-shot.svg +78 -0
  104. package/dot_config/.module-manifest.json +69 -0
  105. package/dot_config/ai/identity.md +20 -0
  106. package/dot_config/ai/patterns/architect.md +14 -0
  107. package/dot_config/ai/patterns/hardener.md +13 -0
  108. package/dot_config/ai/patterns/refactor.md +13 -0
  109. package/dot_config/aider/aider.conf.yml +32 -0
  110. package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
  111. package/dot_config/ansible/ansible.cfg +11 -0
  112. package/dot_config/atuin/config.toml +40 -0
  113. package/dot_config/bat/config +23 -0
  114. package/dot_config/brave-flags.conf.tmpl +7 -0
  115. package/dot_config/btop/btop.conf +16 -0
  116. package/dot_config/btop/themes/tokyonight.theme +34 -0
  117. package/dot_config/bun/bunfig.toml.tmpl +33 -0
  118. package/dot_config/claude/mcp_servers.json +20 -0
  119. package/dot_config/containers/containers.conf +14 -0
  120. package/dot_config/curl/dot_curlrc +18 -0
  121. package/dot_config/dlv/config.yml +39 -0
  122. package/dot_config/docker/config.json +15 -0
  123. package/dot_config/dotfiles/agent-card.json +29 -0
  124. package/dot_config/dotfiles/agent-profiles.json +92 -0
  125. package/dot_config/dotfiles/boot/README.md +11 -0
  126. package/dot_config/dotfiles/grub/README.md +11 -0
  127. package/dot_config/dotfiles/lock/README.md +11 -0
  128. package/dot_config/dotfiles/mcp-lock.json +33 -0
  129. package/dot_config/dotfiles/mcp-policy.json +52 -0
  130. package/dot_config/dotfiles/mcp-registry.json +47 -0
  131. package/dot_config/dotfiles/model-registry.json +20 -0
  132. package/dot_config/dotfiles/policy-bundles.json +38 -0
  133. package/dot_config/dotfiles/prompt-registry.json +16 -0
  134. package/dot_config/dotfiles/versions.env +18 -0
  135. package/dot_config/duf/duf.conf +6 -0
  136. package/dot_config/duti/defaults.duti +5 -0
  137. package/dot_config/emoji/emoji.txt +34 -0
  138. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  139. package/dot_config/environment.d/90-wayland.conf +19 -0
  140. package/dot_config/fastfetch/config.jsonc +28 -0
  141. package/dot_config/firefox/user.js.tmpl +58 -0
  142. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  143. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  144. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  145. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  146. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  147. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  148. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  149. package/dot_config/fish/config.fish.tmpl +44 -0
  150. package/dot_config/fish/fish_plugins +1 -0
  151. package/dot_config/fish/functions/_.fish +3 -0
  152. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  153. package/dot_config/fish/functions/als.fish +46 -0
  154. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  155. package/dot_config/fish/functions/c.fish +3 -0
  156. package/dot_config/fish/functions/cat.fish +9 -0
  157. package/dot_config/fish/functions/d.fish +7 -0
  158. package/dot_config/fish/functions/dot.fish +34 -0
  159. package/dot_config/fish/functions/h.fish +3 -0
  160. package/dot_config/fish/functions/l.fish +7 -0
  161. package/dot_config/fish/functions/la.fish +7 -0
  162. package/dot_config/fish/functions/ll.fish +7 -0
  163. package/dot_config/fish/functions/log_error.fish +13 -0
  164. package/dot_config/fish/functions/log_info.fish +13 -0
  165. package/dot_config/fish/functions/lr.fish +7 -0
  166. package/dot_config/fish/functions/lra.fish +7 -0
  167. package/dot_config/fish/functions/ls.fish +7 -0
  168. package/dot_config/fish/functions/lt.fish +7 -0
  169. package/dot_config/fish/functions/lta.fish +7 -0
  170. package/dot_config/fish/functions/notify-run.fish +11 -0
  171. package/dot_config/fish/functions/q.fish +3 -0
  172. package/dot_config/fish/functions/silent-run.fish +7 -0
  173. package/dot_config/fish/functions/yy.fish +8 -0
  174. package/dot_config/flatpak/flatpak.list +4 -0
  175. package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
  176. package/dot_config/foot/foot.ini.tmpl +33 -0
  177. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  178. package/dot_config/fzf/fzf.zsh +48 -0
  179. package/dot_config/gem/gemrc +9 -0
  180. package/dot_config/gh/config.yml +12 -0
  181. package/dot_config/ghostty/config.tmpl +165 -0
  182. package/dot_config/git/allowed_signers.tmpl +18 -0
  183. package/dot_config/git/attributes +12 -0
  184. package/dot_config/git/commit-template +10 -0
  185. package/dot_config/git/ignore +27 -0
  186. package/dot_config/gnupg/gpg-agent.conf +11 -0
  187. package/dot_config/go/golangci.yml +118 -0
  188. package/dot_config/go/gopls.json +30 -0
  189. package/dot_config/goose/config.yaml +29 -0
  190. package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
  191. package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
  192. package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
  193. package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
  194. package/dot_config/htop/htoprc +20 -0
  195. package/dot_config/inputrc +2 -0
  196. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  197. package/dot_config/just/justfile +122 -0
  198. package/dot_config/k9s/config.yaml +65 -0
  199. package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
  200. package/dot_config/kanshi/config.tmpl +22 -0
  201. package/dot_config/karabiner/karabiner.json +14 -0
  202. package/dot_config/kitty/kitty.conf.tmpl +53 -0
  203. package/dot_config/lazydocker/config.yml +186 -0
  204. package/dot_config/lazygit/config.yml +35 -0
  205. package/dot_config/mako/config +47 -0
  206. package/dot_config/mas/masapps.txt +5 -0
  207. package/dot_config/micro/settings.json +3 -0
  208. package/dot_config/mimeapps.list +77 -0
  209. package/dot_config/minikube/config.json +13 -0
  210. package/dot_config/mise/config.toml +99 -0
  211. package/dot_config/mongosh/mongoshrc.js +68 -0
  212. package/dot_config/mpv/input.conf +47 -0
  213. package/dot_config/mpv/mpv.conf +47 -0
  214. package/dot_config/mycli/myclirc +67 -0
  215. package/dot_config/nano/nanorc +28 -0
  216. package/dot_config/ncdu/config +12 -0
  217. package/dot_config/niri/config.kdl.tmpl +327 -0
  218. package/dot_config/nushell/aliases.nu +18 -0
  219. package/dot_config/nushell/completions.nu.tmpl +52 -0
  220. package/dot_config/nushell/config.nu.tmpl +86 -0
  221. package/dot_config/nushell/env.nu.tmpl +94 -0
  222. package/dot_config/nushell/functions.nu.tmpl +17 -0
  223. package/dot_config/nvim/init.lua +18 -0
  224. package/dot_config/nvim/lazy-lock.json +58 -0
  225. package/dot_config/nvim/lua/config/autocmds.lua +107 -0
  226. package/dot_config/nvim/lua/config/keymaps.lua +92 -0
  227. package/dot_config/nvim/lua/config/lazy.lua +44 -0
  228. package/dot_config/nvim/lua/config/options.lua +49 -0
  229. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  230. package/dot_config/nvim/lua/plugins/coding.lua +216 -0
  231. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  232. package/dot_config/nvim/lua/plugins/dap.lua +412 -0
  233. package/dot_config/nvim/lua/plugins/editor.lua +55 -0
  234. package/dot_config/nvim/lua/plugins/git.lua +10 -0
  235. package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
  236. package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
  237. package/dot_config/nvim/lua/plugins/rust.lua +34 -0
  238. package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
  239. package/dot_config/nvim/lua/plugins/ui.lua +509 -0
  240. package/dot_config/paru/paru.conf +10 -0
  241. package/dot_config/pip/pip.conf.tmpl +32 -0
  242. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  243. package/dot_config/pueue/pueue.yml +34 -0
  244. package/dot_config/pypoetry/config.toml +6 -0
  245. package/dot_config/pyrightconfig.json +5 -0
  246. package/dot_config/raycast/README.md +13 -0
  247. package/dot_config/redis/redisclirc +41 -0
  248. package/dot_config/ripgrep/ripgreprc +21 -0
  249. package/dot_config/shell/00-core-paths.sh.tmpl +133 -0
  250. package/dot_config/shell/05-core-safety.sh +47 -0
  251. package/dot_config/shell/10-secrets.sh +40 -0
  252. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  253. package/dot_config/shell/40-ls-colors.sh +48 -0
  254. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  255. package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
  256. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  257. package/dot_config/shell/90-ux-aliases.sh.tmpl +120 -0
  258. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +54 -0
  259. package/dot_config/shell/Brewfile +207 -0
  260. package/dot_config/shell/Brewfile.cask +92 -0
  261. package/dot_config/shell/Brewfile.cli +127 -0
  262. package/dot_config/shell/README.md +267 -0
  263. package/dot_config/shell/als_data.txt.tmpl +65 -0
  264. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  265. package/dot_config/shell/custom/context_suggest.zsh +68 -0
  266. package/dot_config/shell/custom/error_analysis.zsh +45 -0
  267. package/dot_config/sops/dot_sops.yaml +23 -0
  268. package/dot_config/starship.toml.tmpl +202 -0
  269. package/dot_config/swaylock/config +43 -0
  270. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  271. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  272. package/dot_config/systemd/user/pueued.service +12 -0
  273. package/dot_config/systemd/user/ssh-agent.service +12 -0
  274. package/dot_config/task/Taskfile.yml +86 -0
  275. package/dot_config/tflint/tflint.hcl +9 -0
  276. package/dot_config/tmux/tmux.conf.tmpl +223 -0
  277. package/dot_config/topgrade.toml.tmpl +54 -0
  278. package/dot_config/user-dirs.dirs +9 -0
  279. package/dot_config/vscode/extensions.txt +11 -0
  280. package/dot_config/vscode/settings.json.tmpl +82 -0
  281. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  282. package/dot_config/waybar/style.css.tmpl +211 -0
  283. package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
  284. package/dot_config/wget/wgetrc +12 -0
  285. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  286. package/dot_config/yarn/yarnrc.yml +36 -0
  287. package/dot_config/yazi/keymap.toml +67 -0
  288. package/dot_config/yazi/theme.toml +102 -0
  289. package/dot_config/yazi/yazi.toml +40 -0
  290. package/dot_config/zathura/zathurarc +52 -0
  291. package/dot_config/zellij/config.kdl.tmpl +79 -0
  292. package/dot_config/zsh/dot_zprofile +7 -0
  293. package/dot_config/zsh/dot_zshenv +5 -0
  294. package/dot_config/zsh/dot_zshrc.tmpl +498 -0
  295. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  296. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
  297. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
  298. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  299. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +194 -0
  300. package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
  301. package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
  302. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  303. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  304. package/dot_local/bin/executable_ai-update +195 -0
  305. package/dot_local/bin/executable_ai_core +152 -0
  306. package/dot_local/bin/executable_antigravity +11 -0
  307. package/dot_local/bin/executable_b64 +84 -0
  308. package/dot_local/bin/executable_bm +77 -0
  309. package/dot_local/bin/executable_cb +39 -0
  310. package/dot_local/bin/executable_dot +589 -0
  311. package/dot_local/bin/executable_dot-ai +36 -0
  312. package/dot_local/bin/executable_dot-bootstrap +77 -0
  313. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  314. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  315. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  316. package/dot_local/bin/executable_dot-theme-sync +952 -0
  317. package/dot_local/bin/executable_dot_completion +57 -0
  318. package/dot_local/bin/executable_dtags +28 -0
  319. package/dot_local/bin/executable_epoch +67 -0
  320. package/dot_local/bin/executable_extract +41 -0
  321. package/dot_local/bin/executable_gbd +52 -0
  322. package/dot_local/bin/executable_gd +42 -0
  323. package/dot_local/bin/executable_git-ai-commit +175 -0
  324. package/dot_local/bin/executable_git-ai-diff +169 -0
  325. package/dot_local/bin/executable_gl +101 -0
  326. package/dot_local/bin/executable_hash +161 -0
  327. package/dot_local/bin/executable_hashsum +160 -0
  328. package/dot_local/bin/executable_hex +115 -0
  329. package/dot_local/bin/executable_jsonv +78 -0
  330. package/dot_local/bin/executable_jwt +94 -0
  331. package/dot_local/bin/executable_kill-port +75 -0
  332. package/dot_local/bin/executable_lorem +118 -0
  333. package/dot_local/bin/executable_mkscript +35 -0
  334. package/dot_local/bin/executable_monitor +56 -0
  335. package/dot_local/bin/executable_myip +51 -0
  336. package/dot_local/bin/executable_notify +22 -0
  337. package/dot_local/bin/executable_open +36 -0
  338. package/dot_local/bin/executable_pw +27 -0
  339. package/dot_local/bin/executable_rec-start +46 -0
  340. package/dot_local/bin/executable_rec-stop +35 -0
  341. package/dot_local/bin/executable_regex +132 -0
  342. package/dot_local/bin/executable_start-niri +8 -0
  343. package/dot_local/bin/executable_tmux-sessionizer +314 -0
  344. package/dot_local/bin/executable_tour +175 -0
  345. package/dot_local/bin/executable_up +21 -0
  346. package/dot_local/bin/executable_update +142 -0
  347. package/dot_local/bin/executable_uuid +87 -0
  348. package/dot_local/bin/executable_win +32 -0
  349. package/dot_local/bin/executable_yamlv +57 -0
  350. package/dot_local/share/bash-completion/completions/dot +72 -0
  351. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  352. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  353. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  354. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  355. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  356. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  357. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  358. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  359. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  360. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  361. package/dot_local/share/man/man1/dot.1 +149 -0
  362. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  363. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  364. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  365. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  366. package/dot_local/share/zsh/completions/.keep +0 -0
  367. package/dot_local/share/zsh/completions/_dot +283 -0
  368. package/install.sh +342 -0
  369. package/package.json +1 -1
  370. package/scripts/ci/check-copyright-headers.sh +96 -0
  371. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  372. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  373. package/scripts/ci/validate-ci-config.sh +224 -0
  374. package/scripts/demo/record.sh +42 -0
  375. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  376. package/scripts/diagnostics/alias-governance.sh +137 -0
  377. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  378. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  379. package/scripts/diagnostics/benchmark.sh +381 -0
  380. package/scripts/diagnostics/conflicts.sh +72 -0
  381. package/scripts/diagnostics/doctor-unified.sh +38 -0
  382. package/scripts/diagnostics/doctor.sh +541 -0
  383. package/scripts/diagnostics/drift-dashboard.sh +37 -0
  384. package/scripts/diagnostics/health.sh +597 -0
  385. package/scripts/diagnostics/history-analysis.sh +85 -0
  386. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  387. package/scripts/diagnostics/perf.sh +225 -0
  388. package/scripts/diagnostics/scorecard.sh +118 -0
  389. package/scripts/diagnostics/secret-governance.sh +58 -0
  390. package/scripts/diagnostics/security-score.sh +438 -0
  391. package/scripts/diagnostics/smoke-test.sh +87 -0
  392. package/scripts/diagnostics/snapshot.sh +89 -0
  393. package/scripts/diagnostics/verify.sh +107 -0
  394. package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
  395. package/scripts/diagnostics/version-locks.sh +79 -0
  396. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  397. package/scripts/docs/build-manual.sh +883 -0
  398. package/scripts/docs/check-manual.sh +213 -0
  399. package/scripts/dot/commands/agent.sh +465 -0
  400. package/scripts/dot/commands/ai.sh +416 -0
  401. package/scripts/dot/commands/aliases.sh +250 -0
  402. package/scripts/dot/commands/appearance.sh +80 -0
  403. package/scripts/dot/commands/core.sh +185 -0
  404. package/scripts/dot/commands/diagnostics.sh +229 -0
  405. package/scripts/dot/commands/fleet.sh +399 -0
  406. package/scripts/dot/commands/lint.sh +177 -0
  407. package/scripts/dot/commands/manual.sh +168 -0
  408. package/scripts/dot/commands/meta.sh +248 -0
  409. package/scripts/dot/commands/patterns.sh +54 -0
  410. package/scripts/dot/commands/restore.sh +231 -0
  411. package/scripts/dot/commands/secrets.sh +223 -0
  412. package/scripts/dot/commands/security.sh +76 -0
  413. package/scripts/dot/commands/tools.sh +469 -0
  414. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  415. package/scripts/dot/lib/bento.sh +49 -0
  416. package/scripts/dot/lib/log.sh +194 -0
  417. package/scripts/dot/lib/platform.sh +98 -0
  418. package/scripts/dot/lib/ui.sh +507 -0
  419. package/scripts/dot/lib/utils.sh +372 -0
  420. package/scripts/fonts/install-nerd-fonts.sh +68 -0
  421. package/scripts/fonts/patch-fonts.sh +35 -0
  422. package/scripts/git-hooks/install.sh +11 -0
  423. package/scripts/git-hooks/pre-commit +12 -0
  424. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  425. package/scripts/git-hooks/pre-push +29 -0
  426. package/scripts/git-hooks/prepare-commit-msg +29 -0
  427. package/scripts/lib/secrets_provider.sh +158 -0
  428. package/scripts/maintenance/check-updates.sh +131 -0
  429. package/scripts/ops/ai-setup.sh +55 -0
  430. package/scripts/ops/bundle.sh +77 -0
  431. package/scripts/ops/chaos.sh +49 -0
  432. package/scripts/ops/chezmoi-apply.sh +270 -0
  433. package/scripts/ops/chezmoi-diff.sh +15 -0
  434. package/scripts/ops/chezmoi-remove.sh +45 -0
  435. package/scripts/ops/chezmoi-update.sh +48 -0
  436. package/scripts/ops/heal-chezmoi.sh +51 -0
  437. package/scripts/ops/heal-system.sh +128 -0
  438. package/scripts/ops/heal-tools.sh +340 -0
  439. package/scripts/ops/heal.sh +222 -0
  440. package/scripts/ops/post-apply-repair.sh +106 -0
  441. package/scripts/ops/prewarm.sh +127 -0
  442. package/scripts/ops/release.sh +252 -0
  443. package/scripts/ops/rollback.sh +589 -0
  444. package/scripts/ops/setup.sh +137 -0
  445. package/scripts/ops/teleport.sh +33 -0
  446. package/scripts/qa/coverage-baseline.sh +60 -0
  447. package/scripts/qa/docs-coverage.sh +111 -0
  448. package/scripts/qa/reliability-audit.sh +138 -0
  449. package/scripts/qa/traceability-coverage.sh +116 -0
  450. package/scripts/qa/validate-examples.sh +26 -0
  451. package/scripts/qa/wsl-contract.sh +11 -0
  452. package/scripts/release/package-policy-bundles.sh +125 -0
  453. package/scripts/secrets/age-init.sh +70 -0
  454. package/scripts/secrets/create-secrets-file.sh +45 -0
  455. package/scripts/secrets/encrypt-ssh-key.sh +43 -0
  456. package/scripts/security/backup.sh +57 -0
  457. package/scripts/security/dns-doh.sh +51 -0
  458. package/scripts/security/encryption-check.sh +54 -0
  459. package/scripts/security/enforce-policies.sh +334 -0
  460. package/scripts/security/firewall.sh +90 -0
  461. package/scripts/security/lock-configs.sh +57 -0
  462. package/scripts/security/lock-screen.sh +55 -0
  463. package/scripts/security/manage-secrets.sh +428 -0
  464. package/scripts/security/ssh-cert.sh +203 -0
  465. package/scripts/security/telemetry-kill.sh +50 -0
  466. package/scripts/security/usb-safety.sh +51 -0
  467. package/scripts/theme/apply-gnome-theme.sh +328 -0
  468. package/scripts/theme/extract-theme.py +677 -0
  469. package/scripts/theme/install-boot-logo.sh +62 -0
  470. package/scripts/theme/install-catppuccin-themes.sh +370 -0
  471. package/scripts/theme/install-cursors.sh +25 -0
  472. package/scripts/theme/install-file-icons.sh +26 -0
  473. package/scripts/theme/install-grub-theme.sh +61 -0
  474. package/scripts/theme/install-lock-icon.sh +30 -0
  475. package/scripts/theme/merge-wallpaper.sh +141 -0
  476. package/scripts/theme/rebuild-themes.sh +309 -0
  477. package/scripts/theme/switch.sh +421 -0
  478. package/scripts/theme/wallpaper-rotate.sh +136 -0
  479. package/scripts/theme/wallpaper-sync.sh +397 -0
  480. package/scripts/tools/cmatrix.sh +21 -0
  481. package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
  482. package/scripts/tools/emoji-picker.sh +48 -0
  483. package/scripts/tools/figlet-banner.sh +18 -0
  484. package/scripts/tools/log-rotate.sh +30 -0
  485. package/scripts/tools/lolcat-wrap.sh +19 -0
  486. package/scripts/tools/pipes.sh +48 -0
  487. package/scripts/tuning/linux.sh +185 -0
  488. package/scripts/tuning/macos.sh +55 -0
  489. package/scripts/uninstall.sh +85 -0
  490. package/scripts/version-sync.sh +487 -0
  491. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  492. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  493. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  494. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  495. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  496. package/templates/projects/go/README.md +4 -0
  497. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  498. package/templates/projects/go/go.sum +0 -0
  499. package/templates/projects/molecule/README.md +7 -0
  500. package/templates/projects/molecule/converge.yml +7 -0
  501. package/templates/projects/molecule/molecule.yml +16 -0
  502. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  503. package/templates/projects/node/README.md +4 -0
  504. package/templates/projects/node/package-lock.json +12 -0
  505. package/templates/projects/node/src/index.js +1 -0
  506. package/templates/projects/packer/README.md +15 -0
  507. package/templates/projects/packer/main.pkr.hcl +15 -0
  508. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  509. package/templates/projects/python/README.md +4 -0
  510. package/templates/projects/python/pyproject.toml +15 -0
  511. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  512. package/templates/projects/python/tests/test_basic.py +1 -0
  513. package/docs/ARCHITECTURE.md +0 -62
  514. package/docs/COMPLIANCE.md +0 -47
  515. package/docs/OPERATIONS.md +0 -103
  516. package/docs/PR_DESCRIPTION.md +0 -150
  517. package/docs/ROADMAP_legacy.md +0 -556
  518. package/docs/SECURITY_CHECKLIST.md +0 -25
  519. package/docs/TASK.md +0 -99
  520. package/docs/WALKTHROUGH.md +0 -46
  521. package/scripts/backup.sh +0 -142
  522. package/scripts/banner.sh +0 -20
  523. package/scripts/benchmark.sh +0 -20
  524. package/scripts/build.sh +0 -41
  525. package/scripts/clean.sh +0 -31
  526. package/scripts/compile.sh +0 -54
  527. package/scripts/copy.sh +0 -108
  528. package/scripts/doctor.sh +0 -79
  529. package/scripts/dotfiles.sh +0 -63
  530. package/scripts/download.sh +0 -35
  531. package/scripts/help.sh +0 -57
  532. package/scripts/lock-configs.sh +0 -57
  533. package/scripts/package.sh +0 -46
  534. package/scripts/ssh.sh +0 -55
  535. package/scripts/teleport.sh +0 -23
  536. package/scripts/test-aliases.sh +0 -25
  537. package/scripts/test_smoke.sh +0 -88
  538. package/scripts/unpack.sh +0 -28
@@ -0,0 +1,421 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Theme Switcher — Switch between theme families and light/dark modes.
4
+ ##
5
+ ## Supports Tokyo Night, Catppuccin, Rose Pine, Kanagawa, and other
6
+ ## popular theme families. Updates chezmoi data and applies changes.
7
+ ##
8
+ ## # Requirements
9
+ ## - chezmoi: Dotfiles manager
10
+ ## - sed: For updating theme configuration
11
+ ##
12
+ ## # Usage
13
+ ## dot theme list # Show all available themes
14
+ ## dot theme set NAME # Set theme to NAME
15
+ ## dot theme toggle # Toggle light/dark within family
16
+ ## dot theme family # Switch between theme families
17
+ ## dot theme current # Show current theme info
18
+ ##
19
+ ## # Platform Notes
20
+ ## - All platforms: Updates chezmoi configuration
21
+
22
+ set -euo pipefail
23
+
24
+ # Cleanup function for temp files
25
+ cleanup() {
26
+ if [[ -n "${tmp_file:-}" ]] && [[ -f "$tmp_file" ]]; then
27
+ rm -f "$tmp_file"
28
+ fi
29
+ }
30
+ trap cleanup EXIT
31
+
32
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
+ # shellcheck source=../dot/lib/ui.sh
34
+ # shellcheck disable=SC1091
35
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
36
+
37
+ ui_init
38
+
39
+ resolve_source_dir() {
40
+ if [ -n "${CHEZMOI_SOURCE_DIR:-}" ] && [ -d "$CHEZMOI_SOURCE_DIR" ]; then
41
+ echo "$CHEZMOI_SOURCE_DIR"
42
+ return
43
+ fi
44
+ if [ -d "$HOME/.dotfiles" ]; then
45
+ echo "$HOME/.dotfiles"
46
+ return
47
+ fi
48
+ if [ -d "$HOME/.local/share/chezmoi" ]; then
49
+ echo "$HOME/.local/share/chezmoi"
50
+ return
51
+ fi
52
+ echo ""
53
+ }
54
+
55
+ SRC_DIR="$(resolve_source_dir)"
56
+ if [ -z "$SRC_DIR" ]; then
57
+ ui_err "Dotfiles source" "not found"
58
+ exit 1
59
+ fi
60
+
61
+ DATA_FILE="$SRC_DIR/.chezmoidata.toml"
62
+ THEMES_FILE="$SRC_DIR/.chezmoidata/themes.toml"
63
+ WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
64
+ if [ ! -f "$DATA_FILE" ]; then
65
+ ui_err "Missing" "$DATA_FILE"
66
+ exit 1
67
+ fi
68
+
69
+ # =============================================================================
70
+ # Theme Database
71
+ # =============================================================================
72
+
73
+ # Default preferences
74
+ DEFAULT_DARK="macos-monterey-dark"
75
+ DEFAULT_LIGHT="macos-monterey-light"
76
+
77
+ # =============================================================================
78
+ # Theme Functions
79
+ # =============================================================================
80
+
81
+ current_theme() {
82
+ awk -F'"' '/^theme =/ {print $2}' "$DATA_FILE" | head -n 1
83
+ }
84
+
85
+ theme_mode() {
86
+ local name="${1:-}"
87
+ awk -v n="$name" '
88
+ $0 == "[themes." n "]" { found=1; next }
89
+ /^\[/ { found=0 }
90
+ found && /^mode/ { sub(/.*= *"/, ""); sub(/".*/, ""); print; exit }
91
+ ' "$THEMES_FILE"
92
+ }
93
+
94
+ theme_exists() {
95
+ local name="${1:-}"
96
+ grep -q "^\[themes\.${name}\]$" "$THEMES_FILE" 2>/dev/null
97
+ }
98
+
99
+ all_theme_names() {
100
+ sed -n 's/^\[themes\.\([a-z0-9-]*\)\]$/\1/p' "$THEMES_FILE" | sort -u
101
+ }
102
+
103
+ # List wallpaper families that have BOTH dark and light variants in themes.toml.
104
+ # Only these are presented to users — unpaired wallpapers are hidden.
105
+ paired_families() {
106
+ local -A has_dark has_light
107
+ local name family
108
+ while IFS= read -r name; do
109
+ if [[ "$name" == *-dark ]]; then
110
+ family="${name%-dark}"
111
+ has_dark["$family"]=1
112
+ elif [[ "$name" == *-light ]]; then
113
+ family="${name%-light}"
114
+ has_light["$family"]=1
115
+ fi
116
+ done < <(all_theme_names)
117
+
118
+ for family in $(printf '%s\n' "${!has_dark[@]}" | sort); do
119
+ [[ -n "${has_light[$family]+x}" ]] && echo "$family"
120
+ done
121
+ }
122
+
123
+ # Determine source type (system/custom) for a wallpaper family.
124
+ wallpaper_source() {
125
+ local family="${1:-}"
126
+ # Check for custom wallpapers: dynamic (family.heic) or split (family-dark/light.ext)
127
+ for ext in heic jpg png; do
128
+ if [[ -f "$WALLPAPER_DIR/${family}.${ext}" || -f "$WALLPAPER_DIR/${family}-dark.${ext}" || -f "$WALLPAPER_DIR/${family}-light.${ext}" ]]; then
129
+ echo "Custom"
130
+ return
131
+ fi
132
+ done
133
+ echo "System"
134
+ }
135
+
136
+ get_theme_family() {
137
+ local theme="${1:-}"
138
+ # Read family from themes.toml if available
139
+ if [[ -f "$THEMES_FILE" ]]; then
140
+ local family
141
+ family="$(awk -v n="$theme" '
142
+ $0 == "[themes." n "]" { found=1; next }
143
+ /^\[/ { found=0 }
144
+ found && /^family/ { sub(/.*= *"/, ""); sub(/".*/, ""); print; exit }
145
+ ' "$THEMES_FILE")"
146
+ if [[ -n "$family" ]]; then
147
+ echo "$family"
148
+ return
149
+ fi
150
+ fi
151
+ # Fallback: strip -dark/-light suffix
152
+ local family="${theme%-dark}"
153
+ [[ "$family" != "$theme" ]] || family="${theme%-light}"
154
+ echo "$family"
155
+ }
156
+
157
+ is_dark_theme() {
158
+ local theme="${1:-}"
159
+ case "$theme" in
160
+ *-dark)
161
+ return 0
162
+ ;;
163
+ *)
164
+ return 1
165
+ ;;
166
+ esac
167
+ }
168
+
169
+ set_theme() {
170
+ local new_theme="$1"
171
+ if [ -z "$new_theme" ]; then
172
+ pick_theme
173
+ return
174
+ fi
175
+ dot-theme-sync "$new_theme"
176
+ }
177
+
178
+ # Interactive theme picker
179
+ pick_theme() {
180
+ if ! command -v fzf &>/dev/null; then
181
+ ui_err "fzf" "required for interactive picker"
182
+ ui_info "Usage" "dot theme set <name>"
183
+ exit 1
184
+ fi
185
+
186
+ local current
187
+ local current="$(current_theme)"
188
+
189
+ if [[ ! -f "$THEMES_FILE" ]]; then
190
+ ui_err "Missing" "$THEMES_FILE"
191
+ exit 1
192
+ fi
193
+
194
+ local current_family="${current%-dark}"
195
+ [[ "$current_family" != "$current" ]] || current_family="${current%-light}"
196
+ local current_mode="dark"
197
+ is_dark_theme "$current" 2>/dev/null || current_mode="light"
198
+
199
+ # Build theme list: one row per family, shows active mode
200
+ local theme_list=""
201
+ local family source marker active_mode
202
+ while IFS= read -r family; do
203
+ [[ -n "$family" ]] || continue
204
+ source="$(wallpaper_source "$family")"
205
+ marker="○"
206
+ active_mode=""
207
+ if [[ "$family" == "$current_family" ]]; then
208
+ marker="✓"
209
+ active_mode="$current_mode"
210
+ fi
211
+ theme_list+="$(printf '%s %-35s %-8s %s' "$marker" "$family" "$source" "$active_mode")"$'\n'
212
+ done < <(paired_families)
213
+
214
+ local selected_family
215
+ selected_family="$(echo "$theme_list" | fzf \
216
+ --header "Select wallpaper theme (current: $current_family [$current_mode])" \
217
+ --prompt "Theme > " \
218
+ --height 30 \
219
+ --reverse \
220
+ --no-sort \
221
+ --no-preview \
222
+ --ansi |
223
+ awk '$1 !~ /^#/ && NF >= 2 {print $2}')" || return 0
224
+
225
+ if [[ -n "$selected_family" ]]; then
226
+ # Apply with current appearance mode (dark/light)
227
+ local new_theme="${selected_family}-${current_mode}"
228
+ if [[ "$new_theme" != "$current" ]]; then
229
+ dot-theme-sync "$new_theme"
230
+ else
231
+ ui_info "Theme" "already on $current"
232
+ fi
233
+ fi
234
+ }
235
+
236
+ list_themes() {
237
+ local current="$(current_theme)"
238
+ local current_family="${current%-dark}"
239
+ [[ "$current_family" != "$current" ]] || current_family="${current%-light}"
240
+
241
+ local count=0
242
+ local family source
243
+
244
+ printf ' %-35s %s\n' "WALLPAPER" "SOURCE"
245
+ printf ' %-35s %s\n' "---------" "------"
246
+ while IFS= read -r family; do
247
+ [[ -n "$family" ]] || continue
248
+ source="$(wallpaper_source "$family")"
249
+ if [[ "$family" == "$current_family" ]]; then
250
+ ui_ok "$family" "$source ◀"
251
+ else
252
+ printf ' %-35s %s\n' "$family" "$source"
253
+ fi
254
+ count=$((count + 1))
255
+ done < <(paired_families)
256
+
257
+ echo ""
258
+ ui_info "Current" "$(current_theme) ($count wallpaper themes available)"
259
+ }
260
+
261
+ # Toggle between light and dark within the same family, or switch families
262
+ toggle_theme() {
263
+ local current="$(current_theme)"
264
+
265
+ if is_dark_theme "$current"; then
266
+ if [[ "$current" == *-dark ]]; then
267
+ set_theme "${current%-dark}-light"
268
+ else
269
+ set_theme "$DEFAULT_LIGHT"
270
+ fi
271
+ else
272
+ if [[ "$current" == *-light ]]; then
273
+ set_theme "${current%-light}-dark"
274
+ else
275
+ set_theme "$DEFAULT_DARK"
276
+ fi
277
+ fi
278
+ }
279
+
280
+ # Switch to the next wallpaper family while preserving mode.
281
+ switch_family() {
282
+ local current="$(current_theme)"
283
+ local family="$(get_theme_family "$current")"
284
+ local mode="dark"
285
+ local families=()
286
+ local idx=0
287
+ local next_family=""
288
+
289
+ if [[ "$current" == *-light ]]; then
290
+ mode="light"
291
+ fi
292
+
293
+ while IFS= read -r name; do
294
+ [[ -n "$name" ]] || continue
295
+ families+=("$name")
296
+ done < <(paired_families)
297
+
298
+ if [[ ${#families[@]} -eq 0 ]]; then
299
+ set_theme "$DEFAULT_DARK"
300
+ return
301
+ fi
302
+
303
+ for idx in "${!families[@]}"; do
304
+ if [[ "${families[$idx]}" == "$family" ]]; then
305
+ next_family="${families[$(((idx + 1) % ${#families[@]}))]}"
306
+ break
307
+ fi
308
+ done
309
+
310
+ if [[ -z "$next_family" ]]; then
311
+ next_family="${families[0]}"
312
+ fi
313
+
314
+ set_theme "${next_family}-${mode}"
315
+ }
316
+
317
+ # Show current theme info
318
+ show_current() {
319
+ local current="$(current_theme)"
320
+ local family="$(get_theme_family "$current")"
321
+ local mode="dark"
322
+ if ! is_dark_theme "$current" 2>/dev/null; then
323
+ mode="light"
324
+ fi
325
+ ui_info "Current" "$current ($family, $mode)"
326
+ }
327
+
328
+ # Detect system appearance (Dark/Light) and sync dotfiles
329
+ sync_theme() {
330
+ local os_mode="dark" # Default fallback
331
+ case "$(uname -s)" in
332
+ Darwin)
333
+ if defaults read -g AppleInterfaceStyle >/dev/null 2>&1; then
334
+ os_mode="dark"
335
+ else
336
+ os_mode="light"
337
+ fi
338
+ ;;
339
+ Linux)
340
+ if command -v gsettings >/dev/null 2>&1; then
341
+ # Check GNOME color scheme
342
+ local scheme=scheme=$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null | tr -d "'")
343
+ if [[ "$scheme" == "prefer-light" ]]; then
344
+ os_mode="light"
345
+ else
346
+ os_mode="dark"
347
+ fi
348
+ fi
349
+ ;;
350
+ esac
351
+
352
+ local current="$(current_theme)"
353
+ if is_dark_theme "$current" && [[ "$os_mode" == "light" ]]; then
354
+ ui_info "Sync" "System is light, switching dotfiles to light..."
355
+ toggle_theme
356
+ elif ! is_dark_theme "$current" && [[ "$os_mode" == "dark" ]]; then
357
+ ui_info "Sync" "System is dark, switching dotfiles to dark..."
358
+ toggle_theme
359
+ else
360
+ ui_ok "Sync" "Dotfiles already match system ($os_mode mode)"
361
+ fi
362
+ }
363
+
364
+ # =============================================================================
365
+ # Main
366
+ # =============================================================================
367
+
368
+ case "${1:-}" in
369
+ list)
370
+ list_themes
371
+ ;;
372
+ set)
373
+ shift
374
+ set_theme "$1"
375
+ ;;
376
+ toggle)
377
+ toggle_theme
378
+ ;;
379
+ sync)
380
+ sync_theme
381
+ ;;
382
+ family)
383
+ switch_family
384
+ ;;
385
+ current)
386
+ show_current
387
+ ;;
388
+ rebuild)
389
+ shift
390
+ bash "$SCRIPT_DIR/rebuild-themes.sh" "$@"
391
+ ;;
392
+ help | --help | -h)
393
+ ui_header "Usage"
394
+ ui_info "dot theme" "[command]"
395
+ echo ""
396
+ ui_header "Commands"
397
+ ui_ok "(no args)" "Interactive theme picker (fzf)"
398
+ ui_ok "list" "Show all available themes"
399
+ ui_ok "set [NAME]" "Set theme (interactive if no name)"
400
+ ui_ok "toggle" "Toggle between light/dark within current family"
401
+ ui_ok "family" "Cycle between theme families"
402
+ ui_ok "current" "Show current theme info"
403
+ ui_ok "sync" "Sync dotfiles with system dark/light mode"
404
+ ui_ok "rebuild" "Regenerate themes from system + custom wallpapers"
405
+ echo ""
406
+ show_current
407
+ ;;
408
+ "")
409
+ pick_theme
410
+ ;;
411
+ *)
412
+ # Treat unknown args as theme names for quick switching: dot theme macos-sequoia-dark
413
+ if grep -q "^\[themes\.${1}\]" "$THEMES_FILE" 2>/dev/null; then
414
+ dot-theme-sync "$1"
415
+ else
416
+ ui_err "Unknown command or theme" "$1"
417
+ ui_info "Usage" "dot theme [list|set <name>|toggle|family|current|help]"
418
+ exit 1
419
+ fi
420
+ ;;
421
+ esac
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
6
+ INTERVAL="${DOTFILES_WALLPAPER_INTERVAL:-300}"
7
+ ONCE=0
8
+
9
+ while [[ $# -gt 0 ]]; do
10
+ case "$1" in
11
+ --interval)
12
+ INTERVAL="$2"
13
+ shift 2
14
+ ;;
15
+ --once)
16
+ ONCE=1
17
+ shift
18
+ ;;
19
+ --light)
20
+ FORCE_MODE="light"
21
+ shift
22
+ ;;
23
+ --dark)
24
+ FORCE_MODE="dark"
25
+ shift
26
+ ;;
27
+ *)
28
+ shift
29
+ ;;
30
+ esac
31
+ done
32
+
33
+ if [[ ! -d "$WALLPAPER_DIR" ]]; then
34
+ echo "Wallpaper directory not found: $WALLPAPER_DIR" >&2
35
+ exit 1
36
+ fi
37
+
38
+ # Detect current color scheme (light/dark)
39
+ detect_mode() {
40
+ if [[ -n "${FORCE_MODE:-}" ]]; then
41
+ echo "$FORCE_MODE"
42
+ return
43
+ fi
44
+ if command -v gsettings &>/dev/null; then
45
+ local scheme
46
+ scheme="$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null || echo "")"
47
+ case "$scheme" in
48
+ *dark*) echo "dark" ;;
49
+ *) echo "light" ;;
50
+ esac
51
+ else
52
+ echo "dark"
53
+ fi
54
+ }
55
+
56
+ # Pick a random wallpaper matching mode, excluding the given path
57
+ pick_wallpaper() {
58
+ local mode="$1"
59
+ local exclude="${2:-}"
60
+ local files=()
61
+ while IFS= read -r line; do
62
+ [[ "$line" == "$exclude" ]] && continue
63
+ files+=("$line")
64
+ done < <(find "$WALLPAPER_DIR" -maxdepth 1 -type f -iname "*-${mode}.jpg")
65
+
66
+ if [[ ${#files[@]} -eq 0 ]]; then
67
+ return 1
68
+ fi
69
+
70
+ if command -v shuf &>/dev/null; then
71
+ printf '%s\n' "${files[@]}" | shuf -n 1
72
+ else
73
+ echo "${files[$RANDOM % ${#files[@]}]}"
74
+ fi
75
+ }
76
+
77
+ apply_wallpaper() {
78
+ local wp="$1"
79
+ local mode="$2"
80
+
81
+ case "$(uname -s)" in
82
+ Darwin)
83
+ osascript -e "tell application \"System Events\" to set picture of every desktop to POSIX file \"$wp\"" || true
84
+ ;;
85
+ Linux)
86
+ if command -v gsettings &>/dev/null; then
87
+ local light_wp dark_wp
88
+ local base="${wp%-${mode}.jpg}"
89
+ light_wp="${base}-light.jpg"
90
+ dark_wp="${base}-dark.jpg"
91
+
92
+ if [[ -f "$light_wp" ]] && [[ -f "$dark_wp" ]]; then
93
+ gsettings set org.gnome.desktop.background picture-uri "file://${light_wp}"
94
+ gsettings set org.gnome.desktop.background picture-uri-dark "file://${dark_wp}"
95
+ gsettings set org.gnome.desktop.screensaver picture-uri "file://${light_wp}"
96
+ else
97
+ local wp_uri="file://${wp}"
98
+ gsettings set org.gnome.desktop.background picture-uri "$wp_uri"
99
+ gsettings set org.gnome.desktop.background picture-uri-dark "$wp_uri"
100
+ gsettings set org.gnome.desktop.screensaver picture-uri "$wp_uri"
101
+ fi
102
+ gsettings set org.gnome.desktop.background picture-options "zoom"
103
+ elif command -v swaybg &>/dev/null; then
104
+ pkill swaybg || true
105
+ swaybg -i "$wp" -m fill &
106
+ elif command -v feh &>/dev/null; then
107
+ feh --bg-fill "$wp"
108
+ else
109
+ echo "No supported wallpaper setter found (gsettings/swaybg/feh)." >&2
110
+ return 1
111
+ fi
112
+ ;;
113
+ *)
114
+ echo "Wallpaper rotation not supported on this OS." >&2
115
+ return 1
116
+ ;;
117
+ esac
118
+ }
119
+
120
+ LAST_WP=""
121
+
122
+ while true; do
123
+ MODE="$(detect_mode)"
124
+ wp="$(pick_wallpaper "$MODE" "$LAST_WP" || true)"
125
+ if [[ -z "$wp" ]]; then
126
+ echo "No ${MODE} wallpapers found in $WALLPAPER_DIR" >&2
127
+ exit 1
128
+ fi
129
+ apply_wallpaper "$wp" "$MODE"
130
+ LAST_WP="$wp"
131
+ echo "Wallpaper applied (${MODE}): $(basename "$wp")"
132
+ if [[ "$ONCE" -eq 1 ]]; then
133
+ break
134
+ fi
135
+ sleep "$INTERVAL"
136
+ done