@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -0,0 +1,192 @@
1
+ # Tutorial: First Install
2
+
3
+ End-to-end installation and verification, from zero to a fully-working environment in under 5 minutes.
4
+
5
+ ## Prerequisites
6
+
7
+ - macOS 14+, Ubuntu/Debian 20.04+, Arch (rolling), Fedora 39+, or WSL2 on Windows 11
8
+ - `git` and `curl` installed
9
+ - Shell access (Zsh, Fish, or Bash)
10
+ - Optional but recommended: SSH key for signing commits
11
+
12
+ ## Step 1: Run the Installer
13
+
14
+ ```sh
15
+ bash -c "$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh)"
16
+ ```
17
+
18
+ The installer:
19
+ 1. Verifies prerequisites (`git`, `curl`, write access to `~`)
20
+ 2. Downloads chezmoi via the SHA256-verified installer
21
+ 3. Clones the dotfiles source to `~/.dotfiles`
22
+ 4. Runs `chezmoi init` to prompt for per-machine settings
23
+ 5. Runs `chezmoi apply` with progress output
24
+
25
+ Expected output:
26
+
27
+ ```
28
+ [install] Verifying prerequisites
29
+ [install] Installing chezmoi (verified SHA256)
30
+ [install] Cloning source to ~/.dotfiles
31
+ [install] Running chezmoi init (interactive)
32
+ Git email: you@example.com
33
+ Machine preset [macbook-t2]:
34
+ Default theme [tahoe-dark]:
35
+ Default shell [fish]:
36
+ [install] Applying configuration (180 files)
37
+ [install] ✓ Installation complete
38
+ ```
39
+
40
+ ## Step 2: Verify
41
+
42
+ Open a new shell and run:
43
+
44
+ ```sh
45
+ dot doctor
46
+ ```
47
+
48
+ Expected output:
49
+
50
+ ```
51
+ ◈ DOTFILES
52
+ Dot • Diagnostics
53
+
54
+ --- Health Check ---
55
+ ✓ Paths ~/.local/bin, mise shims present
56
+ ✓ Tools git, chezmoi, mise installed
57
+ ✓ Chezmoi clean (no drift)
58
+ ✓ Shell fish (500ms startup)
59
+ ✓ Security SSH key present, Age key present
60
+ ✓ Portability LC_ALL=en_US.UTF-8, TERM=xterm-256color
61
+
62
+ Score: 98/100
63
+ ```
64
+
65
+ Any warnings will be accompanied by a suggested fix.
66
+
67
+ ## Step 3: Take the Tour
68
+
69
+ ```sh
70
+ dot learn
71
+ ```
72
+
73
+ An interactive walkthrough covering:
74
+
75
+ - Shell basics and aliases
76
+ - Secrets workflow
77
+ - Theme switching
78
+ - Performance tuning
79
+ - Security hardening
80
+
81
+ Each section takes 30-60 seconds. You can skip sections or exit at any time.
82
+
83
+ ## Step 4: Customize
84
+
85
+ ### Per-Machine Settings
86
+
87
+ Edit `~/.config/chezmoi/chezmoi.toml`:
88
+
89
+ ```toml
90
+ [data]
91
+ machine = "macbook-t2" # see .chezmoidata/hardware.toml for presets
92
+ theme = "tahoe-dark" # see `dot theme list`
93
+ default_shell = "fish" # fish, zsh, bash
94
+ terminal_font_family = "JetBrainsMono Nerd Font"
95
+ terminal_font_size = 12
96
+ ```
97
+
98
+ ### Feature Flags
99
+
100
+ Edit `.chezmoidata.toml` in the source directory (`~/.dotfiles/.chezmoidata.toml`):
101
+
102
+ ```toml
103
+ [features]
104
+ dms = false # Dank Material Shell (Niri)
105
+ linux_desktop = false # Linux-specific desktop configs
106
+ waybar = false # Waybar status bar
107
+ ```
108
+
109
+ After editing, apply:
110
+
111
+ ```sh
112
+ dot apply
113
+ ```
114
+
115
+ ## Step 5: Add Your Identity
116
+
117
+ If you have an SSH key, configure signed commits:
118
+
119
+ ```sh
120
+ git config --global user.signingkey ~/.ssh/id_ed25519.pub
121
+ git config --global commit.gpgsign true
122
+ git config --global gpg.format ssh
123
+ git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
124
+ ```
125
+
126
+ Add your own key to `~/.ssh/allowed_signers`:
127
+
128
+ ```
129
+ you@example.com ssh-ed25519 AAAA...
130
+ ```
131
+
132
+ Test:
133
+
134
+ ```sh
135
+ cd ~/.dotfiles
136
+ git commit --allow-empty -m "test: signature"
137
+ git verify-commit HEAD
138
+ # Good "git" signature for you@example.com
139
+ ```
140
+
141
+ ## Step 6: First Theme Switch
142
+
143
+ ```sh
144
+ dot theme
145
+ ```
146
+
147
+ A picker opens showing all paired wallpaper themes on your system. Select one and press Enter. The terminal, editor, desktop wallpaper, and macOS accent color update in about 3 seconds.
148
+
149
+ ## Troubleshooting
150
+
151
+ If `dot doctor` shows failures:
152
+
153
+ ```sh
154
+ dot heal # auto-fix common issues
155
+ dot heal -n # dry-run first to see what would change
156
+ ```
157
+
158
+ If the installation is broken beyond repair:
159
+
160
+ ```sh
161
+ dot rollback # restore the previous known-good state
162
+ ```
163
+
164
+ If `dot doctor` still fails after heal + rollback, check:
165
+
166
+ - `~/.local/state/dotfiles/install.log` — installer log
167
+ - `~/.local/state/dotfiles/heal.log` — heal attempts
168
+ - `chezmoi doctor` — chezmoi-specific diagnostics
169
+
170
+ Still stuck? See [Cookbook: Troubleshooting](../04-cookbook/02-troubleshooting.md).
171
+
172
+ ## What Got Installed
173
+
174
+ After `dot doctor` reports a healthy score, you have:
175
+
176
+ | Surface | What's There |
177
+ |:---|:---|
178
+ | **Shell** | Fish (default), Zsh, Nushell, Bash all configured with cached init |
179
+ | **Editor** | Neovim with lazy.nvim + LSP + theme-synced colorscheme |
180
+ | **Terminal** | Ghostty/Alacritty/Kitty/WezTerm configs (pick whichever is installed) |
181
+ | **Git** | Signed commits, delta diff, conventional commit template |
182
+ | **AI tooling** | Claude Code, Codex, Copilot CLI, Gemini CLI via mise |
183
+ | **Secret store** | Age key, SOPS config, `dot secrets` command ready |
184
+ | **Security** | Gitleaks, detect-secrets baseline, signed attestation log |
185
+ | **Theme engine** | K-Means wallpaper extractor, system + custom wallpaper discovery |
186
+
187
+ ## Next
188
+
189
+ - [Tutorial: Add a Wallpaper → Theme](02-add-wallpaper.md)
190
+ - [Tutorial: Create a Machine Profile](03-create-profile.md)
191
+ - [Tutorial: Encrypt a Secret](04-encrypt-secret.md)
192
+ - [Cookbook: 30+ recipes](../04-cookbook/01-recipes.md)
@@ -0,0 +1,211 @@
1
+ # Tutorial: Add a Wallpaper → Theme
2
+
3
+ Drop an image. Get a fully-WCAG-AAA terminal theme.
4
+
5
+ ## Prerequisites
6
+
7
+ - Dotfiles installed (see [First Install](01-first-install.md))
8
+ - `magick` (ImageMagick) and `python3` available (installed by default)
9
+ - Optional: `heif-enc` for creating dynamic HEIC (`brew install libheif`)
10
+
11
+ ## Option A: Drop a Static Image
12
+
13
+ The simplest path: place a wallpaper in `~/Pictures/Wallpapers/` and rebuild.
14
+
15
+ ```sh
16
+ cp ~/Downloads/my-wallpaper.jpg ~/Pictures/Wallpapers/mytheme-dark.jpg
17
+ cp ~/Downloads/my-wallpaper-light.jpg ~/Pictures/Wallpapers/mytheme-light.jpg
18
+
19
+ dot theme rebuild
20
+ ```
21
+
22
+ Expected output:
23
+
24
+ ```
25
+ Discovering wallpapers...
26
+ Found: 126 system, 26 custom (152 total)
27
+
28
+ Generating themes...
29
+ Processing 2 wallpapers (4 parallel jobs)...
30
+ mytheme-dark [custom] ✓
31
+ mytheme-light [custom] ✓
32
+
33
+ Results: 2 processed, 150 cached, 0 failed
34
+
35
+ Assembling themes.toml...
36
+ Written: ~/.dotfiles/.chezmoidata/themes.toml (608 theme sections)
37
+
38
+ Done. Run 'dot theme list' to see available themes.
39
+ ```
40
+
41
+ Switch to the new theme:
42
+
43
+ ```sh
44
+ dot theme mytheme-dark
45
+ ```
46
+
47
+ ## Option B: Dynamic HEIC (Recommended)
48
+
49
+ Apple's dynamic HEIC format stores both dark and light variants in a single file with metadata that macOS uses to auto-switch appearance. This is the native format for Apple system wallpapers.
50
+
51
+ ### Create a Dynamic HEIC From a Pair
52
+
53
+ If you have `mytheme-dark.jpg` + `mytheme-light.jpg`:
54
+
55
+ ```sh
56
+ bash scripts/theme/merge-wallpaper.sh mytheme
57
+ ```
58
+
59
+ This:
60
+ 1. Resizes both to 6016×6016 (preserving aspect ratio, center-cropped)
61
+ 2. Encodes both into a single `.heic` via `heif-enc`
62
+ 3. Injects `apple_desktop:apr` XMP metadata (image 0 = light, image 1 = dark)
63
+ 4. Writes to `~/Pictures/Wallpapers/mytheme.heic`
64
+ 5. Removes the two source files
65
+
66
+ Verify:
67
+
68
+ ```sh
69
+ heif-info ~/Pictures/Wallpapers/mytheme.heic
70
+ # image: 6016x6016 (id=1), primary ← light
71
+ # image: 6016x6016 (id=4) ← dark
72
+ # metadata:
73
+ # XMP: 2473 bytes ← appearance mapping
74
+ ```
75
+
76
+ ### Rebuild Themes
77
+
78
+ ```sh
79
+ dot theme rebuild
80
+ # mytheme-light [custom] ✓
81
+ # mytheme-dark [custom] ✓
82
+ ```
83
+
84
+ The engine extracts each frame independently and generates paired themes.
85
+
86
+ ## Option C: Golden Ratio Brightness (Advanced)
87
+
88
+ For best perceived contrast between your dark and light themes, target a brightness ratio of ~1.6× (the golden ratio, approximately 1.618).
89
+
90
+ Measure:
91
+
92
+ ```sh
93
+ magick ~/Pictures/Wallpapers/mytheme-dark.jpg -resize 1x1\! -format '%[fx:mean]' info:
94
+ # 0.30
95
+
96
+ magick ~/Pictures/Wallpapers/mytheme-light.jpg -resize 1x1\! -format '%[fx:mean]' info:
97
+ # 0.48
98
+ # Ratio: 0.48 / 0.30 = 1.6 ← ideal
99
+ ```
100
+
101
+ Adjust a pair if the ratio is off:
102
+
103
+ ```sh
104
+ # Darken light to 0.485 brightness
105
+ mod=$(python3 -c "print(int((0.485 / 0.60) * 100))") # current mean = 0.60
106
+ magick input.jpg -modulate ${mod},100,100 output.jpg
107
+ ```
108
+
109
+ ## Option D: Install System Wallpapers (Already-Available)
110
+
111
+ macOS ships dozens of wallpapers you can use directly — no download needed.
112
+
113
+ List what's available:
114
+
115
+ ```sh
116
+ dot theme rebuild --list
117
+ ```
118
+
119
+ Output:
120
+
121
+ ```
122
+ NAME SOURCE PATH
123
+ ---- ------ ----
124
+ big-sur-graphic-dark system /System/Library/Desktop Pictures/.thumbnails/Big Sur Graphic Dark.heic
125
+ big-sur-graphic-light system /System/Library/Desktop Pictures/.thumbnails/Big Sur Graphic Light.heic
126
+ dome-dark system /System/Library/Desktop Pictures/.thumbnails/Dome Dark.heic
127
+ dome-light system /System/Library/Desktop Pictures/.thumbnails/Dome Light.heic
128
+ sonoma-dark system /System/Library/Desktop Pictures/.thumbnails/Sonoma Dark.heic
129
+ ...
130
+ Total: 152 wallpapers
131
+ ```
132
+
133
+ Switch to any system wallpaper:
134
+
135
+ ```sh
136
+ dot theme dome-dark
137
+ ```
138
+
139
+ The engine extracts Dome Dark's dominant colors, generates a palette, and applies it to every surface.
140
+
141
+ ## Verifying the Result
142
+
143
+ After a switch, check the applied colors:
144
+
145
+ ```sh
146
+ # See the current theme's palette
147
+ grep -A30 "^\[themes.mytheme-dark\]" ~/.dotfiles/.chezmoidata/themes.toml
148
+ ```
149
+
150
+ Check WCAG compliance (always passes for generated themes):
151
+
152
+ ```sh
153
+ bash tests/unit/theme/test_themes_toml.sh
154
+ # RESULTS: 11:11:0 (11 tests, 11 passed, 0 failed)
155
+ ```
156
+
157
+ Verify the applied wallpaper:
158
+
159
+ ```sh
160
+ # macOS
161
+ osascript -e 'tell application "System Events" to get picture of every desktop'
162
+
163
+ # Linux (GNOME)
164
+ gsettings get org.gnome.desktop.background picture-uri
165
+ gsettings get org.gnome.desktop.background picture-uri-dark
166
+ ```
167
+
168
+ ## Troubleshooting
169
+
170
+ ### Low Contrast on Both Variants
171
+
172
+ Your wallpaper pair doesn't have enough brightness difference. The theme will still generate but `dot theme list` may filter it from the picker. Adjust the source images to increase separation (brighter light variant, darker dark variant).
173
+
174
+ ### K-Means Failed to Converge
175
+
176
+ Rare, but possible with images that are nearly solid color. The engine uses a seeded RNG and 3 runs — if all 3 fail, the output theme is skipped. Fix: use a more chromatic source image.
177
+
178
+ ### Wallpaper Doesn't Apply on Linux
179
+
180
+ Check your desktop environment:
181
+
182
+ - **GNOME** — uses `gsettings picture-uri` (HEIC auto-converted to PNG)
183
+ - **KDE** — uses `plasma-apply-wallpaperimage`
184
+ - **Niri** — uses DMS IPC or `swaybg`
185
+ - **i3/sway (no DE)** — falls back to `feh`
186
+
187
+ If none are detected, set `$WALLPAPER_COMMAND` in `~/.config/dotfiles/config`.
188
+
189
+ ### The Dark/Light Auto-Switch Isn't Working on macOS
190
+
191
+ The `apple_desktop:apr` metadata may be missing. Verify:
192
+
193
+ ```sh
194
+ magick ~/Pictures/Wallpapers/mytheme.heic -format '%[XMP]' info: | grep apple_desktop
195
+ ```
196
+
197
+ If empty, re-run `merge-wallpaper.sh` — the XMP injection step may have failed due to missing `exiftool`.
198
+
199
+ ## Summary
200
+
201
+ You've added a custom wallpaper, generated a WCAG AAA theme from it, and verified cross-surface application. You can now:
202
+
203
+ - Add more wallpapers to build a library
204
+ - Share your wallpaper directory across fleet hosts (it's gitignored by default)
205
+ - Use `dot theme toggle` to swap dark↔light of your current family
206
+
207
+ ## Next
208
+
209
+ - [Concept: The Theme Engine](../01-concepts/03-theme-engine.md) — deep dive
210
+ - [Tutorial: Create a Profile](03-create-profile.md)
211
+ - [Cookbook: Theming Recipes](../04-cookbook/01-recipes.md)
@@ -0,0 +1,238 @@
1
+ # Tutorial: Create a Machine Profile
2
+
3
+ Machine profiles tell chezmoi how to render templates differently on each host — display scale, keyboard layout, performance preset, available features.
4
+
5
+ ## When to Use a Profile
6
+
7
+ - You have more than one host (laptop + desktop, work + personal)
8
+ - Your hardware differs materially (HiDPI laptop vs 1080p external, ARM vs x86)
9
+ - Certain features only apply to specific setups (Niri on Wayland, AeroSpace on macOS)
10
+
11
+ ## Step 1: Choose or Create a Preset
12
+
13
+ Presets live in `.chezmoidata/hardware.toml`:
14
+
15
+ ```toml
16
+ [hardware.macbook-t2]
17
+ display_scale = 2.0
18
+ kbd_layout = "qwerty"
19
+ modifier_mode = "left-cmd-control"
20
+ perf_profile = "laptop"
21
+ wm = "aerospace"
22
+ [hardware.macbook-t2.features]
23
+ retina = true
24
+ touchid = true
25
+
26
+ [hardware.surface-pro]
27
+ display_scale = 1.5
28
+ kbd_layout = "colemak-dh"
29
+ modifier_mode = "standard"
30
+ perf_profile = "laptop"
31
+ wm = "niri"
32
+ [hardware.surface-pro.features]
33
+ touch = true
34
+ pen = true
35
+ ```
36
+
37
+ If an existing preset fits: use its name. Otherwise, add a new one.
38
+
39
+ ## Step 2: Select the Preset for This Host
40
+
41
+ Edit `~/.config/chezmoi/chezmoi.toml`:
42
+
43
+ ```toml
44
+ [data]
45
+ machine = "surface-pro" # choose from .chezmoidata/hardware.toml
46
+ theme = "dome-dark"
47
+ default_shell = "fish"
48
+ terminal_font_family = "JetBrainsMono Nerd Font"
49
+ terminal_font_size = 11 # larger for HiDPI, smaller for dense screens
50
+ ```
51
+
52
+ `chezmoi.toml` is **not** in the repository — each host has its own. Generated by `chezmoi init` on first install.
53
+
54
+ ## Step 3: Reference the Preset in Templates
55
+
56
+ Inside any `.tmpl` file:
57
+
58
+ ```go
59
+ {{- $hw := index .hardware .machine }}
60
+
61
+ # Ghostty config — uses machine-specific font size
62
+ font-family = "{{ .terminal_font_family }}"
63
+ font-size = {{ .terminal_font_size }}
64
+
65
+ # DPI-aware settings
66
+ {{ if eq $hw.display_scale 2.0 }}
67
+ window-decoration = false
68
+ {{ else }}
69
+ window-decoration = true
70
+ {{ end }}
71
+
72
+ # Feature-gated config
73
+ {{ if $hw.features.touch }}
74
+ mouse-scroll-multiplier = 3
75
+ {{ end }}
76
+ ```
77
+
78
+ After editing the template, run `chezmoi apply` or `dot apply`.
79
+
80
+ ## Step 4: Add a New Preset
81
+
82
+ Suppose you have a new mini PC. Add to `.chezmoidata/hardware.toml`:
83
+
84
+ ```toml
85
+ [hardware.my-nuc]
86
+ display_scale = 1.0 # external 1440p
87
+ kbd_layout = "qwerty"
88
+ modifier_mode = "standard"
89
+ perf_profile = "desktop"
90
+ wm = "gnome"
91
+ [hardware.my-nuc.features]
92
+ multi-monitor = true
93
+ gaming = true
94
+ ```
95
+
96
+ Then on that host:
97
+
98
+ ```toml
99
+ # ~/.config/chezmoi/chezmoi.toml
100
+ [data]
101
+ machine = "my-nuc"
102
+ ```
103
+
104
+ Apply:
105
+
106
+ ```sh
107
+ dot apply
108
+ ```
109
+
110
+ Templates automatically pick up the new preset data.
111
+
112
+ ## Step 5: Per-Preset Feature Flags
113
+
114
+ Feature flags in `.chezmoidata.toml` can be gated by preset:
115
+
116
+ ```toml
117
+ # .chezmoidata.toml — defaults for all hosts
118
+ [features]
119
+ dms = false
120
+ linux_desktop = false
121
+ waybar = false
122
+ ```
123
+
124
+ Override per-preset in `.chezmoidata/hardware.toml`:
125
+
126
+ ```toml
127
+ [hardware.surface-pro.features]
128
+ touch = true
129
+ pen = true
130
+ dms = true # override feature default
131
+ waybar = true
132
+ ```
133
+
134
+ In templates:
135
+
136
+ ```go
137
+ {{- $hw := index .hardware .machine }}
138
+ {{- $features := mergeOverwrite .features $hw.features }}
139
+
140
+ {{ if $features.waybar }}
141
+ # ... waybar-specific config ...
142
+ {{ end }}
143
+ ```
144
+
145
+ ## Example: Font Size by Preset
146
+
147
+ A single Ghostty config that renders correctly on every host:
148
+
149
+ ```go
150
+ # dot_config/ghostty/config.tmpl
151
+ {{- $hw := index .hardware .machine }}
152
+
153
+ theme = {{ .theme }}
154
+ font-family = "{{ .terminal_font_family }}"
155
+
156
+ # DPI-aware font sizing
157
+ {{ if eq $hw.display_scale 2.0 }}
158
+ font-size = 12 # Retina MacBook
159
+ {{ else if eq $hw.display_scale 1.5 }}
160
+ font-size = 11 # Surface Pro
161
+ {{ else }}
162
+ font-size = 14 # External 1440p/4K
163
+ {{ end }}
164
+ ```
165
+
166
+ On the MacBook: 12pt. On the Surface: 11pt. On the NUC: 14pt. One template.
167
+
168
+ ## Example: Platform × Preset
169
+
170
+ Combine `.chezmoi.os` with the preset:
171
+
172
+ ```go
173
+ {{- $hw := index .hardware .machine }}
174
+
175
+ {{ if and (eq .chezmoi.os "darwin") (eq $hw.wm "aerospace") }}
176
+ # macOS + AeroSpace specifics
177
+ {{ else if and (eq .chezmoi.os "linux") (eq $hw.wm "niri") }}
178
+ # Linux + Niri specifics
179
+ {{ end }}
180
+ ```
181
+
182
+ ## Listing Known Presets
183
+
184
+ ```sh
185
+ chezmoi execute-template '{{- range $name, $_ := .hardware }}{{ $name }}{{ "\n" }}{{ end }}'
186
+ # macbook-t2
187
+ # surface-pro
188
+ # geekom-a9
189
+ # my-nuc
190
+ ```
191
+
192
+ ## Changing Presets on an Existing Host
193
+
194
+ If you reassign a host to a different preset:
195
+
196
+ ```sh
197
+ # Edit ~/.config/chezmoi/chezmoi.toml
198
+ # machine = "my-nuc" (was "surface-pro")
199
+
200
+ dot apply --dry-run # preview changes
201
+ dot apply # apply
202
+ ```
203
+
204
+ Chezmoi re-renders every template with the new preset data. No reboot needed.
205
+
206
+ ## Troubleshooting
207
+
208
+ ### "Machine preset 'foo' not found"
209
+
210
+ The `machine` value in `~/.config/chezmoi/chezmoi.toml` doesn't match any key under `[hardware.*]` in `.chezmoidata/hardware.toml`. Check spelling.
211
+
212
+ ### Templates Silently Use Defaults
213
+
214
+ Make sure you're using `{{- $hw := index .hardware .machine }}` at the top of templates. If `machine` is empty, `index` returns `nil` — reference with `{{- with $hw }}...{{- end }}` guards.
215
+
216
+ ### Feature Flag Not Taking Effect
217
+
218
+ Verify the merge order:
219
+
220
+ ```sh
221
+ chezmoi execute-template '{{- $hw := index .hardware .machine -}}{{- $f := mergeOverwrite .features $hw.features -}}{{ $f | toToml }}'
222
+ ```
223
+
224
+ Per-preset features must override global defaults. If the output doesn't reflect that, check template syntax.
225
+
226
+ ## Summary
227
+
228
+ Profiles let one source tree produce correctly-configured output on every host you own. The machinery:
229
+
230
+ 1. `.chezmoidata/hardware.toml` defines presets (declarative)
231
+ 2. `~/.config/chezmoi/chezmoi.toml` selects a preset per host (per-host override)
232
+ 3. `.tmpl` files read `.hardware` + `.machine` (template-time)
233
+
234
+ ## Next
235
+
236
+ - [Concept: Fleet Architecture](../01-concepts/04-fleet.md)
237
+ - [Reference: Templates](../03-reference/04-templates.md)
238
+ - [Reference: Feature Flags](../03-reference/05-feature-flags.md)