@sebastienrousseau/dotfiles 0.2.499 → 0.2.501

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