@sebastienrousseau/dotfiles 0.2.499 → 0.2.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/CHANGELOG.md +375 -0
  2. package/LICENSE +1283 -0
  3. package/README.md +284 -0
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +4 -3
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +78 -0
  9. package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
  10. package/docs/adr/ADR-002-shell-performance.md +121 -0
  11. package/docs/adr/ADR-003-security-first.md +140 -0
  12. package/docs/adr/ADR-004-cli-architecture.md +157 -0
  13. package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
  14. package/docs/adr/ADR-006-shell-selection.md +115 -0
  15. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  16. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  17. package/docs/adr/README.md +32 -0
  18. package/docs/architecture/ARCHITECTURE.md +113 -0
  19. package/docs/architecture/INTEROP.md +36 -0
  20. package/docs/architecture/REPO_LAYOUT.md +237 -0
  21. package/docs/architecture/WALKTHROUGH.md +82 -0
  22. package/docs/architecture/fleet-deployment.md +73 -0
  23. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  24. package/docs/archive/LEGACY_ROADMAP.md +142 -0
  25. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  26. package/docs/{PLAN.md → archive/PLAN.md} +4 -4
  27. package/docs/archive/REPO_AUDIT.md +23 -0
  28. package/docs/guides/INSTALL.md +140 -0
  29. package/docs/guides/NEOVIM_IDE_GUIDE.md +52 -0
  30. package/docs/guides/THEMING.md +222 -0
  31. package/docs/guides/TROUBLESHOOTING.md +148 -0
  32. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +723 -0
  33. package/docs/index.md +39 -0
  34. package/docs/interop/A2A.md +32 -0
  35. package/docs/manual/00-introduction.md +85 -0
  36. package/docs/manual/01-concepts/01-architecture.md +134 -0
  37. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  38. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  39. package/docs/manual/01-concepts/04-fleet.md +142 -0
  40. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  41. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  42. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  43. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  44. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  45. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  46. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  47. package/docs/manual/03-reference/02-config-files.md +259 -0
  48. package/docs/manual/03-reference/03-environment.md +120 -0
  49. package/docs/manual/03-reference/04-templates.md +184 -0
  50. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  51. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  52. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  53. package/docs/manual/04-cookbook/03-faq.md +167 -0
  54. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  55. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  56. package/docs/manual/05-appendices/C-glossary.md +36 -0
  57. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  58. package/docs/manual/05-appendices/E-license.md +34 -0
  59. package/docs/manual/_toc.yml +58 -0
  60. package/docs/manual/command-index.md +58 -0
  61. package/docs/manual/concept-index.md +164 -0
  62. package/docs/operations/ATTESTATION.md +39 -0
  63. package/docs/operations/MAINTENANCE.md +59 -0
  64. package/docs/operations/MIGRATION.md +101 -0
  65. package/docs/operations/OPERATIONS.md +164 -0
  66. package/docs/operations/RELIABILITY.md +116 -0
  67. package/docs/{ROADMAP.md → operations/ROADMAP.md} +22 -22
  68. package/docs/operations/TESTING.md +195 -0
  69. package/docs/operations/TRACEABILITY.md +31 -0
  70. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  71. package/docs/operations/VERSION_SYNC.md +344 -0
  72. package/docs/reference/ALIASES.md +124 -0
  73. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  74. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  75. package/docs/reference/FEATURES.md +62 -0
  76. package/docs/reference/FONTS.md +108 -0
  77. package/docs/reference/PROFILES.md +65 -0
  78. package/docs/reference/SCREENSHOTS.md +117 -0
  79. package/docs/reference/SCRIPTS.md +67 -0
  80. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  81. package/docs/reference/THEMES.md +113 -0
  82. package/docs/reference/TOOLS.md +105 -0
  83. package/docs/reference/UTILS.md +151 -0
  84. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  85. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  86. package/docs/security/COMPLIANCE.md +453 -0
  87. package/docs/security/ENCRYPTION.md +52 -0
  88. package/docs/security/FMEA.md +155 -0
  89. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  90. package/docs/security/KEYS.md +45 -0
  91. package/docs/security/KEY_ROTATION.md +219 -0
  92. package/docs/security/MCP_POLICY.md +69 -0
  93. package/docs/security/POLICY_RELEASES.md +33 -0
  94. package/docs/security/README.md +24 -0
  95. package/docs/security/SECRETS.md +146 -0
  96. package/docs/security/SECURITY.md +41 -0
  97. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  98. package/docs/security/SOUP_REGISTER.md +32 -0
  99. package/docs/security/THREAT_MODEL.md +120 -0
  100. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  101. package/docs/themes/README.md +6 -0
  102. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  103. package/docs/themes/hero-shot.svg +78 -0
  104. package/dot_config/.module-manifest.json +69 -0
  105. package/dot_config/ai/identity.md +20 -0
  106. package/dot_config/ai/patterns/architect.md +14 -0
  107. package/dot_config/ai/patterns/hardener.md +13 -0
  108. package/dot_config/ai/patterns/refactor.md +13 -0
  109. package/dot_config/aider/aider.conf.yml +32 -0
  110. package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
  111. package/dot_config/ansible/ansible.cfg +11 -0
  112. package/dot_config/atuin/config.toml +40 -0
  113. package/dot_config/bat/config +23 -0
  114. package/dot_config/brave-flags.conf.tmpl +7 -0
  115. package/dot_config/btop/btop.conf +16 -0
  116. package/dot_config/btop/themes/tokyonight.theme +34 -0
  117. package/dot_config/bun/bunfig.toml.tmpl +33 -0
  118. package/dot_config/claude/mcp_servers.json +20 -0
  119. package/dot_config/containers/containers.conf +14 -0
  120. package/dot_config/curl/dot_curlrc +18 -0
  121. package/dot_config/dlv/config.yml +39 -0
  122. package/dot_config/docker/config.json +15 -0
  123. package/dot_config/dotfiles/agent-card.json +29 -0
  124. package/dot_config/dotfiles/agent-profiles.json +92 -0
  125. package/dot_config/dotfiles/boot/README.md +11 -0
  126. package/dot_config/dotfiles/grub/README.md +11 -0
  127. package/dot_config/dotfiles/lock/README.md +11 -0
  128. package/dot_config/dotfiles/mcp-lock.json +33 -0
  129. package/dot_config/dotfiles/mcp-policy.json +52 -0
  130. package/dot_config/dotfiles/mcp-registry.json +47 -0
  131. package/dot_config/dotfiles/model-registry.json +20 -0
  132. package/dot_config/dotfiles/policy-bundles.json +38 -0
  133. package/dot_config/dotfiles/prompt-registry.json +16 -0
  134. package/dot_config/dotfiles/versions.env +18 -0
  135. package/dot_config/duf/duf.conf +6 -0
  136. package/dot_config/duti/defaults.duti +5 -0
  137. package/dot_config/emoji/emoji.txt +34 -0
  138. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  139. package/dot_config/environment.d/90-wayland.conf +19 -0
  140. package/dot_config/fastfetch/config.jsonc +28 -0
  141. package/dot_config/firefox/user.js.tmpl +58 -0
  142. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  143. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  144. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  145. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  146. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  147. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  148. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  149. package/dot_config/fish/config.fish.tmpl +44 -0
  150. package/dot_config/fish/fish_plugins +1 -0
  151. package/dot_config/fish/functions/_.fish +3 -0
  152. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  153. package/dot_config/fish/functions/als.fish +46 -0
  154. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  155. package/dot_config/fish/functions/c.fish +3 -0
  156. package/dot_config/fish/functions/cat.fish +9 -0
  157. package/dot_config/fish/functions/d.fish +7 -0
  158. package/dot_config/fish/functions/dot.fish +34 -0
  159. package/dot_config/fish/functions/h.fish +3 -0
  160. package/dot_config/fish/functions/l.fish +7 -0
  161. package/dot_config/fish/functions/la.fish +7 -0
  162. package/dot_config/fish/functions/ll.fish +7 -0
  163. package/dot_config/fish/functions/log_error.fish +13 -0
  164. package/dot_config/fish/functions/log_info.fish +13 -0
  165. package/dot_config/fish/functions/lr.fish +7 -0
  166. package/dot_config/fish/functions/lra.fish +7 -0
  167. package/dot_config/fish/functions/ls.fish +7 -0
  168. package/dot_config/fish/functions/lt.fish +7 -0
  169. package/dot_config/fish/functions/lta.fish +7 -0
  170. package/dot_config/fish/functions/notify-run.fish +11 -0
  171. package/dot_config/fish/functions/q.fish +3 -0
  172. package/dot_config/fish/functions/silent-run.fish +7 -0
  173. package/dot_config/fish/functions/yy.fish +8 -0
  174. package/dot_config/flatpak/flatpak.list +4 -0
  175. package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
  176. package/dot_config/foot/foot.ini.tmpl +33 -0
  177. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  178. package/dot_config/fzf/fzf.zsh +48 -0
  179. package/dot_config/gem/gemrc +9 -0
  180. package/dot_config/gh/config.yml +12 -0
  181. package/dot_config/ghostty/config.tmpl +165 -0
  182. package/dot_config/git/allowed_signers.tmpl +18 -0
  183. package/dot_config/git/attributes +12 -0
  184. package/dot_config/git/commit-template +10 -0
  185. package/dot_config/git/ignore +27 -0
  186. package/dot_config/gnupg/gpg-agent.conf +11 -0
  187. package/dot_config/go/golangci.yml +118 -0
  188. package/dot_config/go/gopls.json +30 -0
  189. package/dot_config/goose/config.yaml +29 -0
  190. package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
  191. package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
  192. package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
  193. package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
  194. package/dot_config/htop/htoprc +20 -0
  195. package/dot_config/inputrc +2 -0
  196. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  197. package/dot_config/just/justfile +122 -0
  198. package/dot_config/k9s/config.yaml +65 -0
  199. package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
  200. package/dot_config/kanshi/config.tmpl +22 -0
  201. package/dot_config/karabiner/karabiner.json +14 -0
  202. package/dot_config/kitty/kitty.conf.tmpl +53 -0
  203. package/dot_config/lazydocker/config.yml +186 -0
  204. package/dot_config/lazygit/config.yml +35 -0
  205. package/dot_config/mako/config +47 -0
  206. package/dot_config/mas/masapps.txt +5 -0
  207. package/dot_config/micro/settings.json +3 -0
  208. package/dot_config/mimeapps.list +77 -0
  209. package/dot_config/minikube/config.json +13 -0
  210. package/dot_config/mise/config.toml +99 -0
  211. package/dot_config/mongosh/mongoshrc.js +68 -0
  212. package/dot_config/mpv/input.conf +47 -0
  213. package/dot_config/mpv/mpv.conf +47 -0
  214. package/dot_config/mycli/myclirc +67 -0
  215. package/dot_config/nano/nanorc +28 -0
  216. package/dot_config/ncdu/config +12 -0
  217. package/dot_config/niri/config.kdl.tmpl +327 -0
  218. package/dot_config/nushell/aliases.nu +18 -0
  219. package/dot_config/nushell/completions.nu.tmpl +52 -0
  220. package/dot_config/nushell/config.nu.tmpl +86 -0
  221. package/dot_config/nushell/env.nu.tmpl +94 -0
  222. package/dot_config/nushell/functions.nu.tmpl +17 -0
  223. package/dot_config/nvim/init.lua +18 -0
  224. package/dot_config/nvim/lazy-lock.json +58 -0
  225. package/dot_config/nvim/lua/config/autocmds.lua +107 -0
  226. package/dot_config/nvim/lua/config/keymaps.lua +92 -0
  227. package/dot_config/nvim/lua/config/lazy.lua +44 -0
  228. package/dot_config/nvim/lua/config/options.lua +49 -0
  229. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  230. package/dot_config/nvim/lua/plugins/coding.lua +216 -0
  231. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  232. package/dot_config/nvim/lua/plugins/dap.lua +412 -0
  233. package/dot_config/nvim/lua/plugins/editor.lua +55 -0
  234. package/dot_config/nvim/lua/plugins/git.lua +10 -0
  235. package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
  236. package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
  237. package/dot_config/nvim/lua/plugins/rust.lua +34 -0
  238. package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
  239. package/dot_config/nvim/lua/plugins/ui.lua +509 -0
  240. package/dot_config/paru/paru.conf +10 -0
  241. package/dot_config/pip/pip.conf.tmpl +32 -0
  242. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  243. package/dot_config/pueue/pueue.yml +34 -0
  244. package/dot_config/pypoetry/config.toml +6 -0
  245. package/dot_config/pyrightconfig.json +5 -0
  246. package/dot_config/raycast/README.md +13 -0
  247. package/dot_config/redis/redisclirc +41 -0
  248. package/dot_config/ripgrep/ripgreprc +21 -0
  249. package/dot_config/shell/00-core-paths.sh.tmpl +133 -0
  250. package/dot_config/shell/05-core-safety.sh +47 -0
  251. package/dot_config/shell/10-secrets.sh +40 -0
  252. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  253. package/dot_config/shell/40-ls-colors.sh +48 -0
  254. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  255. package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
  256. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  257. package/dot_config/shell/90-ux-aliases.sh.tmpl +120 -0
  258. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +54 -0
  259. package/dot_config/shell/Brewfile +207 -0
  260. package/dot_config/shell/Brewfile.cask +92 -0
  261. package/dot_config/shell/Brewfile.cli +127 -0
  262. package/dot_config/shell/README.md +267 -0
  263. package/dot_config/shell/als_data.txt.tmpl +65 -0
  264. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  265. package/dot_config/shell/custom/context_suggest.zsh +68 -0
  266. package/dot_config/shell/custom/error_analysis.zsh +45 -0
  267. package/dot_config/sops/dot_sops.yaml +23 -0
  268. package/dot_config/starship.toml.tmpl +202 -0
  269. package/dot_config/swaylock/config +43 -0
  270. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  271. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  272. package/dot_config/systemd/user/pueued.service +12 -0
  273. package/dot_config/systemd/user/ssh-agent.service +12 -0
  274. package/dot_config/task/Taskfile.yml +86 -0
  275. package/dot_config/tflint/tflint.hcl +9 -0
  276. package/dot_config/tmux/tmux.conf.tmpl +223 -0
  277. package/dot_config/topgrade.toml.tmpl +54 -0
  278. package/dot_config/user-dirs.dirs +9 -0
  279. package/dot_config/vscode/extensions.txt +11 -0
  280. package/dot_config/vscode/settings.json.tmpl +82 -0
  281. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  282. package/dot_config/waybar/style.css.tmpl +211 -0
  283. package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
  284. package/dot_config/wget/wgetrc +12 -0
  285. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  286. package/dot_config/yarn/yarnrc.yml +36 -0
  287. package/dot_config/yazi/keymap.toml +67 -0
  288. package/dot_config/yazi/theme.toml +102 -0
  289. package/dot_config/yazi/yazi.toml +40 -0
  290. package/dot_config/zathura/zathurarc +52 -0
  291. package/dot_config/zellij/config.kdl.tmpl +79 -0
  292. package/dot_config/zsh/dot_zprofile +7 -0
  293. package/dot_config/zsh/dot_zshenv +5 -0
  294. package/dot_config/zsh/dot_zshrc.tmpl +498 -0
  295. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  296. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
  297. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
  298. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  299. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +194 -0
  300. package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
  301. package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
  302. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  303. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  304. package/dot_local/bin/executable_ai-update +195 -0
  305. package/dot_local/bin/executable_ai_core +152 -0
  306. package/dot_local/bin/executable_antigravity +11 -0
  307. package/dot_local/bin/executable_b64 +84 -0
  308. package/dot_local/bin/executable_bm +77 -0
  309. package/dot_local/bin/executable_cb +39 -0
  310. package/dot_local/bin/executable_dot +589 -0
  311. package/dot_local/bin/executable_dot-ai +36 -0
  312. package/dot_local/bin/executable_dot-bootstrap +77 -0
  313. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  314. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  315. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  316. package/dot_local/bin/executable_dot-theme-sync +952 -0
  317. package/dot_local/bin/executable_dot_completion +57 -0
  318. package/dot_local/bin/executable_dtags +28 -0
  319. package/dot_local/bin/executable_epoch +67 -0
  320. package/dot_local/bin/executable_extract +41 -0
  321. package/dot_local/bin/executable_gbd +52 -0
  322. package/dot_local/bin/executable_gd +42 -0
  323. package/dot_local/bin/executable_git-ai-commit +175 -0
  324. package/dot_local/bin/executable_git-ai-diff +169 -0
  325. package/dot_local/bin/executable_gl +101 -0
  326. package/dot_local/bin/executable_hash +161 -0
  327. package/dot_local/bin/executable_hashsum +160 -0
  328. package/dot_local/bin/executable_hex +115 -0
  329. package/dot_local/bin/executable_jsonv +78 -0
  330. package/dot_local/bin/executable_jwt +94 -0
  331. package/dot_local/bin/executable_kill-port +75 -0
  332. package/dot_local/bin/executable_lorem +118 -0
  333. package/dot_local/bin/executable_mkscript +35 -0
  334. package/dot_local/bin/executable_monitor +56 -0
  335. package/dot_local/bin/executable_myip +51 -0
  336. package/dot_local/bin/executable_notify +22 -0
  337. package/dot_local/bin/executable_open +36 -0
  338. package/dot_local/bin/executable_pw +27 -0
  339. package/dot_local/bin/executable_rec-start +46 -0
  340. package/dot_local/bin/executable_rec-stop +35 -0
  341. package/dot_local/bin/executable_regex +132 -0
  342. package/dot_local/bin/executable_start-niri +8 -0
  343. package/dot_local/bin/executable_tmux-sessionizer +314 -0
  344. package/dot_local/bin/executable_tour +175 -0
  345. package/dot_local/bin/executable_up +21 -0
  346. package/dot_local/bin/executable_update +142 -0
  347. package/dot_local/bin/executable_uuid +87 -0
  348. package/dot_local/bin/executable_win +32 -0
  349. package/dot_local/bin/executable_yamlv +57 -0
  350. package/dot_local/share/bash-completion/completions/dot +72 -0
  351. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  352. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  353. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  354. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  355. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  356. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  357. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  358. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  359. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  360. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  361. package/dot_local/share/man/man1/dot.1 +149 -0
  362. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  363. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  364. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  365. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  366. package/dot_local/share/zsh/completions/.keep +0 -0
  367. package/dot_local/share/zsh/completions/_dot +283 -0
  368. package/install.sh +342 -0
  369. package/package.json +1 -1
  370. package/scripts/ci/check-copyright-headers.sh +96 -0
  371. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  372. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  373. package/scripts/ci/validate-ci-config.sh +224 -0
  374. package/scripts/demo/record.sh +42 -0
  375. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  376. package/scripts/diagnostics/alias-governance.sh +137 -0
  377. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  378. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  379. package/scripts/diagnostics/benchmark.sh +381 -0
  380. package/scripts/diagnostics/conflicts.sh +72 -0
  381. package/scripts/diagnostics/doctor-unified.sh +38 -0
  382. package/scripts/diagnostics/doctor.sh +541 -0
  383. package/scripts/diagnostics/drift-dashboard.sh +37 -0
  384. package/scripts/diagnostics/health.sh +597 -0
  385. package/scripts/diagnostics/history-analysis.sh +85 -0
  386. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  387. package/scripts/diagnostics/perf.sh +225 -0
  388. package/scripts/diagnostics/scorecard.sh +118 -0
  389. package/scripts/diagnostics/secret-governance.sh +58 -0
  390. package/scripts/diagnostics/security-score.sh +438 -0
  391. package/scripts/diagnostics/smoke-test.sh +87 -0
  392. package/scripts/diagnostics/snapshot.sh +89 -0
  393. package/scripts/diagnostics/verify.sh +107 -0
  394. package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
  395. package/scripts/diagnostics/version-locks.sh +79 -0
  396. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  397. package/scripts/docs/build-manual.sh +883 -0
  398. package/scripts/docs/check-manual.sh +213 -0
  399. package/scripts/dot/commands/agent.sh +465 -0
  400. package/scripts/dot/commands/ai.sh +416 -0
  401. package/scripts/dot/commands/aliases.sh +250 -0
  402. package/scripts/dot/commands/appearance.sh +80 -0
  403. package/scripts/dot/commands/core.sh +185 -0
  404. package/scripts/dot/commands/diagnostics.sh +229 -0
  405. package/scripts/dot/commands/fleet.sh +399 -0
  406. package/scripts/dot/commands/lint.sh +177 -0
  407. package/scripts/dot/commands/manual.sh +168 -0
  408. package/scripts/dot/commands/meta.sh +248 -0
  409. package/scripts/dot/commands/patterns.sh +54 -0
  410. package/scripts/dot/commands/restore.sh +231 -0
  411. package/scripts/dot/commands/secrets.sh +223 -0
  412. package/scripts/dot/commands/security.sh +76 -0
  413. package/scripts/dot/commands/tools.sh +469 -0
  414. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  415. package/scripts/dot/lib/bento.sh +49 -0
  416. package/scripts/dot/lib/log.sh +194 -0
  417. package/scripts/dot/lib/platform.sh +98 -0
  418. package/scripts/dot/lib/ui.sh +507 -0
  419. package/scripts/dot/lib/utils.sh +372 -0
  420. package/scripts/fonts/install-nerd-fonts.sh +68 -0
  421. package/scripts/fonts/patch-fonts.sh +35 -0
  422. package/scripts/git-hooks/install.sh +11 -0
  423. package/scripts/git-hooks/pre-commit +12 -0
  424. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  425. package/scripts/git-hooks/pre-push +29 -0
  426. package/scripts/git-hooks/prepare-commit-msg +29 -0
  427. package/scripts/lib/secrets_provider.sh +158 -0
  428. package/scripts/maintenance/check-updates.sh +131 -0
  429. package/scripts/ops/ai-setup.sh +55 -0
  430. package/scripts/ops/bundle.sh +77 -0
  431. package/scripts/ops/chaos.sh +49 -0
  432. package/scripts/ops/chezmoi-apply.sh +270 -0
  433. package/scripts/ops/chezmoi-diff.sh +15 -0
  434. package/scripts/ops/chezmoi-remove.sh +45 -0
  435. package/scripts/ops/chezmoi-update.sh +48 -0
  436. package/scripts/ops/heal-chezmoi.sh +51 -0
  437. package/scripts/ops/heal-system.sh +128 -0
  438. package/scripts/ops/heal-tools.sh +340 -0
  439. package/scripts/ops/heal.sh +222 -0
  440. package/scripts/ops/post-apply-repair.sh +106 -0
  441. package/scripts/ops/prewarm.sh +127 -0
  442. package/scripts/ops/release.sh +252 -0
  443. package/scripts/ops/rollback.sh +589 -0
  444. package/scripts/ops/setup.sh +137 -0
  445. package/scripts/ops/teleport.sh +33 -0
  446. package/scripts/qa/coverage-baseline.sh +60 -0
  447. package/scripts/qa/docs-coverage.sh +111 -0
  448. package/scripts/qa/reliability-audit.sh +138 -0
  449. package/scripts/qa/traceability-coverage.sh +116 -0
  450. package/scripts/qa/validate-examples.sh +26 -0
  451. package/scripts/qa/wsl-contract.sh +11 -0
  452. package/scripts/release/package-policy-bundles.sh +125 -0
  453. package/scripts/secrets/age-init.sh +70 -0
  454. package/scripts/secrets/create-secrets-file.sh +45 -0
  455. package/scripts/secrets/encrypt-ssh-key.sh +43 -0
  456. package/scripts/security/backup.sh +57 -0
  457. package/scripts/security/dns-doh.sh +51 -0
  458. package/scripts/security/encryption-check.sh +54 -0
  459. package/scripts/security/enforce-policies.sh +334 -0
  460. package/scripts/security/firewall.sh +90 -0
  461. package/scripts/security/lock-configs.sh +57 -0
  462. package/scripts/security/lock-screen.sh +55 -0
  463. package/scripts/security/manage-secrets.sh +428 -0
  464. package/scripts/security/ssh-cert.sh +203 -0
  465. package/scripts/security/telemetry-kill.sh +50 -0
  466. package/scripts/security/usb-safety.sh +51 -0
  467. package/scripts/theme/apply-gnome-theme.sh +328 -0
  468. package/scripts/theme/extract-theme.py +677 -0
  469. package/scripts/theme/install-boot-logo.sh +62 -0
  470. package/scripts/theme/install-catppuccin-themes.sh +370 -0
  471. package/scripts/theme/install-cursors.sh +25 -0
  472. package/scripts/theme/install-file-icons.sh +26 -0
  473. package/scripts/theme/install-grub-theme.sh +61 -0
  474. package/scripts/theme/install-lock-icon.sh +30 -0
  475. package/scripts/theme/merge-wallpaper.sh +141 -0
  476. package/scripts/theme/rebuild-themes.sh +309 -0
  477. package/scripts/theme/switch.sh +421 -0
  478. package/scripts/theme/wallpaper-rotate.sh +136 -0
  479. package/scripts/theme/wallpaper-sync.sh +397 -0
  480. package/scripts/tools/cmatrix.sh +21 -0
  481. package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
  482. package/scripts/tools/emoji-picker.sh +48 -0
  483. package/scripts/tools/figlet-banner.sh +18 -0
  484. package/scripts/tools/log-rotate.sh +30 -0
  485. package/scripts/tools/lolcat-wrap.sh +19 -0
  486. package/scripts/tools/pipes.sh +48 -0
  487. package/scripts/tuning/linux.sh +185 -0
  488. package/scripts/tuning/macos.sh +55 -0
  489. package/scripts/uninstall.sh +85 -0
  490. package/scripts/version-sync.sh +487 -0
  491. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  492. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  493. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  494. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  495. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  496. package/templates/projects/go/README.md +4 -0
  497. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  498. package/templates/projects/go/go.sum +0 -0
  499. package/templates/projects/molecule/README.md +7 -0
  500. package/templates/projects/molecule/converge.yml +7 -0
  501. package/templates/projects/molecule/molecule.yml +16 -0
  502. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  503. package/templates/projects/node/README.md +4 -0
  504. package/templates/projects/node/package-lock.json +12 -0
  505. package/templates/projects/node/src/index.js +1 -0
  506. package/templates/projects/packer/README.md +15 -0
  507. package/templates/projects/packer/main.pkr.hcl +15 -0
  508. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  509. package/templates/projects/python/README.md +4 -0
  510. package/templates/projects/python/pyproject.toml +15 -0
  511. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  512. package/templates/projects/python/tests/test_basic.py +1 -0
  513. package/docs/ARCHITECTURE.md +0 -62
  514. package/docs/COMPLIANCE.md +0 -47
  515. package/docs/OPERATIONS.md +0 -103
  516. package/docs/PR_DESCRIPTION.md +0 -150
  517. package/docs/ROADMAP_legacy.md +0 -556
  518. package/docs/SECURITY_CHECKLIST.md +0 -25
  519. package/docs/TASK.md +0 -99
  520. package/docs/WALKTHROUGH.md +0 -46
  521. package/scripts/backup.sh +0 -142
  522. package/scripts/banner.sh +0 -20
  523. package/scripts/benchmark.sh +0 -20
  524. package/scripts/build.sh +0 -41
  525. package/scripts/clean.sh +0 -31
  526. package/scripts/compile.sh +0 -54
  527. package/scripts/copy.sh +0 -108
  528. package/scripts/doctor.sh +0 -79
  529. package/scripts/dotfiles.sh +0 -63
  530. package/scripts/download.sh +0 -35
  531. package/scripts/help.sh +0 -57
  532. package/scripts/lock-configs.sh +0 -57
  533. package/scripts/package.sh +0 -46
  534. package/scripts/ssh.sh +0 -55
  535. package/scripts/teleport.sh +0 -23
  536. package/scripts/test-aliases.sh +0 -25
  537. package/scripts/test_smoke.sh +0 -88
  538. package/scripts/unpack.sh +0 -28
@@ -0,0 +1,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)
@@ -0,0 +1,275 @@
1
+ # Tutorial: Encrypt a Secret
2
+
3
+ How to store an API key (or any secret) encrypted in the repository using Age and SOPS — decrypted automatically on `dot apply`.
4
+
5
+ ## The Threat Model
6
+
7
+ Secrets in plaintext config files are:
8
+
9
+ - Committed to Git history (permanent record)
10
+ - Visible to every process on the machine
11
+ - Included in backup archives
12
+
13
+ Secrets encrypted with Age:
14
+
15
+ - Cipher text committed to Git is useless without the private key
16
+ - Private key (`~/.config/age/keys.txt`) never leaves the user's machine
17
+ - Per-machine policy: only authorized hosts hold keys for their share of secrets
18
+
19
+ ## Step 1: Generate an Age Key (First Time Only)
20
+
21
+ ```sh
22
+ age-keygen -o ~/.config/age/keys.txt
23
+ chmod 600 ~/.config/age/keys.txt
24
+ ```
25
+
26
+ The public key is embedded in the file:
27
+
28
+ ```sh
29
+ cat ~/.config/age/keys.txt
30
+ # created: 2026-04-16T09:00:00Z
31
+ # public key: age1qy90l...xyz
32
+ AGE-SECRET-KEY-1A...
33
+ ```
34
+
35
+ Copy the public key — you'll reference it when encrypting.
36
+
37
+ ## Step 2: Choose Encryption Method
38
+
39
+ Two approaches are supported:
40
+
41
+ | Method | Best For | Filename |
42
+ |:---|:---|:---|
43
+ | **Chezmoi encrypt** | Individual files (API tokens, config snippets) | `dot_config/token.age` |
44
+ | **SOPS** | YAML/JSON with multiple secrets, selective field encryption | `dot_config/creds.sops.yaml` |
45
+
46
+ ## Step 3A: Chezmoi-Encrypted File
47
+
48
+ Create an unencrypted source file:
49
+
50
+ ```sh
51
+ mkdir -p ~/tmp
52
+ echo "sk_live_abc123" > ~/tmp/stripe-key.txt
53
+ ```
54
+
55
+ Import it as encrypted:
56
+
57
+ ```sh
58
+ chezmoi add --encrypt ~/tmp/stripe-key.txt
59
+ ```
60
+
61
+ This:
62
+
63
+ 1. Reads `~/tmp/stripe-key.txt`
64
+ 2. Encrypts with your Age public key
65
+ 3. Stores encrypted content at `~/.dotfiles/dot_tmp/stripe-key.txt.age`
66
+ 4. Template reads encrypted content at apply time and decrypts to target
67
+
68
+ Delete the plaintext source:
69
+
70
+ ```sh
71
+ rm ~/tmp/stripe-key.txt
72
+ ```
73
+
74
+ On `dot apply`, chezmoi decrypts and writes to `~/tmp/stripe-key.txt`. If someone lacks the private key, they see only the encrypted `.age` file in Git.
75
+
76
+ ## Step 3B: SOPS-Encrypted YAML
77
+
78
+ SOPS encrypts **values** in YAML/JSON while preserving the structure. Useful when you want:
79
+
80
+ - Multiple secrets in one file
81
+ - Encryption of only sensitive fields (leaving metadata readable)
82
+ - Multi-recipient (e.g. the work laptop AND the backup laptop can decrypt)
83
+
84
+ Configure SOPS once:
85
+
86
+ ```yaml
87
+ # .sops.yaml (at repo root)
88
+ creation_rules:
89
+ - path_regex: \.sops\.yaml$
90
+ age: age1qy90l...xyz
91
+ ```
92
+
93
+ Create a secrets file:
94
+
95
+ ```yaml
96
+ # dot_config/credentials.sops.yaml
97
+ database:
98
+ host: db.prod.example.com
99
+ user: app
100
+ password: supersecret
101
+ api_keys:
102
+ stripe: sk_live_abc
103
+ sendgrid: SG.xyz
104
+ ```
105
+
106
+ Encrypt it:
107
+
108
+ ```sh
109
+ sops --encrypt --in-place dot_config/credentials.sops.yaml
110
+ ```
111
+
112
+ The file now contains ciphertext blobs where plaintext values were:
113
+
114
+ ```yaml
115
+ database:
116
+ host: ENC[AES256_GCM,data:...]
117
+ user: ENC[AES256_GCM,data:...]
118
+ password: ENC[AES256_GCM,data:...]
119
+ api_keys:
120
+ stripe: ENC[AES256_GCM,data:...]
121
+ sendgrid: ENC[AES256_GCM,data:...]
122
+ sops:
123
+ age:
124
+ - recipient: age1qy90l...xyz
125
+ enc: |
126
+ -----BEGIN AGE ENCRYPTED FILE-----
127
+ ...
128
+ ```
129
+
130
+ To edit the encrypted file:
131
+
132
+ ```sh
133
+ sops dot_config/credentials.sops.yaml
134
+ # Opens in $EDITOR with decrypted content; re-encrypts on save
135
+ ```
136
+
137
+ ## Step 4: Reference the Secret in a Template
138
+
139
+ Chezmoi has a built-in `decrypt` helper:
140
+
141
+ ```go
142
+ # dot_bashrc.tmpl
143
+ export STRIPE_KEY="{{ include "dot_tmp/stripe-key.txt.age" | decrypt | trim }}"
144
+ ```
145
+
146
+ For SOPS:
147
+
148
+ ```go
149
+ # Use the sopsDecrypt template function
150
+ {{- $creds := dict -}}
151
+ {{- $creds = sopsDecrypt "dot_config/credentials.sops.yaml" | fromYaml }}
152
+ export DB_PASSWORD="{{ $creds.database.password }}"
153
+ ```
154
+
155
+ ## Step 5: Commit and Verify
156
+
157
+ ```sh
158
+ cd ~/.dotfiles
159
+ git add .sops.yaml dot_config/credentials.sops.yaml dot_tmp/stripe-key.txt.age
160
+ git commit -sS -m "feat(secrets): add stripe and database credentials"
161
+ git push
162
+ ```
163
+
164
+ Verify the commit doesn't leak secrets:
165
+
166
+ ```sh
167
+ git log -p HEAD~1..HEAD | grep -v ENC | grep -iE 'password|secret|key' || echo "Clean"
168
+ ```
169
+
170
+ On the next machine:
171
+
172
+ ```sh
173
+ dot update
174
+ # Chezmoi decrypts using that machine's Age key
175
+ # If decryption fails, the template errors with a clear message
176
+ ```
177
+
178
+ ## Step 6: Multi-Recipient (Fleet)
179
+
180
+ To allow multiple hosts to decrypt the same secret, add more recipients:
181
+
182
+ ```yaml
183
+ # .sops.yaml
184
+ creation_rules:
185
+ - path_regex: \.sops\.yaml$
186
+ age: >-
187
+ age1qy90l...xyz,
188
+ age1z2x33...abc,
189
+ age1mm0kk...def
190
+ ```
191
+
192
+ Re-encrypt the affected files:
193
+
194
+ ```sh
195
+ sops updatekeys dot_config/credentials.sops.yaml
196
+ ```
197
+
198
+ Now any host with one of those three private keys can decrypt. Hosts without any matching key see the encrypted file but cannot read it.
199
+
200
+ ## Step 7: Rotate a Compromised Key
201
+
202
+ ```sh
203
+ # 1. Generate a new Age key on the affected host
204
+ age-keygen -o ~/.config/age/keys.txt.new
205
+ mv ~/.config/age/keys.txt.new ~/.config/age/keys.txt
206
+
207
+ # 2. Update .sops.yaml with the new public key
208
+
209
+ # 3. Re-encrypt all SOPS files with the new recipient list
210
+ find . -name '*.sops.yaml' -exec sops updatekeys {} \;
211
+
212
+ # 4. Commit and push
213
+ git add .sops.yaml dot_config/*.sops.yaml
214
+ git commit -sS -m "chore(secrets): rotate Age key"
215
+
216
+ # 5. On other fleet hosts
217
+ dot update
218
+ ```
219
+
220
+ Old key still works for existing ciphertext, but new secrets use the new key. To force deprecation, delete the old key from `.sops.yaml` and `sops updatekeys` all files.
221
+
222
+ ## Verifying No Plaintext Leaks
223
+
224
+ CI runs three secret scanners (`gitleaks`, `detect-secrets`, `trufflehog`) on every commit. You can run them locally:
225
+
226
+ ```sh
227
+ gitleaks detect --redact --source .
228
+ detect-secrets scan --update .secrets.baseline
229
+ trufflehog git file://. --only-verified
230
+ ```
231
+
232
+ If any scanner finds a potential leak, the commit is blocked.
233
+
234
+ ## Operational Rules
235
+
236
+ 1. **Never commit plaintext secrets** — use chezmoi encrypt or SOPS
237
+ 2. **Never commit `~/.config/age/keys.txt`** — it's gitignored; double-check before pushing
238
+ 3. **Age keys are per-host** — don't copy them via Git; use secure channels (1Password, Bitwarden, physical USB)
239
+ 4. **Rotate on team membership changes** — when someone leaves, update recipients and rotate all shared secrets
240
+ 5. **Audit with `dot verify --security`** — runs gitleaks + signature + policy hash checks
241
+
242
+ ## Troubleshooting
243
+
244
+ ### "Could not decrypt: no age key found"
245
+
246
+ `~/.config/age/keys.txt` is missing or unreadable:
247
+
248
+ ```sh
249
+ chmod 600 ~/.config/age/keys.txt
250
+ ls -la ~/.config/age/keys.txt
251
+ # -rw------- 1 user user 189 Apr 16 09:00 keys.txt
252
+ ```
253
+
254
+ ### "sops: file encrypted with outdated recipients"
255
+
256
+ A secret file has an old recipient list. Fix:
257
+
258
+ ```sh
259
+ sops updatekeys path/to/file.sops.yaml
260
+ ```
261
+
262
+ ### Secrets Not Applying After Apply
263
+
264
+ Check that `dot_tmp/stripe-key.txt.age` is committed. Run:
265
+
266
+ ```sh
267
+ chezmoi apply --verbose dot_tmp/stripe-key.txt
268
+ # Will show decrypt attempts and errors
269
+ ```
270
+
271
+ ## Next
272
+
273
+ - [Concept: Trust Model](../01-concepts/02-trust-model.md) — the security architecture
274
+ - [Reference: Secret operations](../03-reference/01-dot-cli.md#secrets)
275
+ - [Security: Secret management](../../security/SECRETS.md)