@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,182 @@
1
+ # The Theme Engine
2
+
3
+ `.dotfiles` generates terminal color palettes directly from wallpaper images. There are no hand-crafted themes — dominant colors are extracted via K-Means clustering in CIELAB color space, mapped to ANSI slots, and enforced to WCAG AAA contrast.
4
+
5
+ This chapter explains the pipeline end to end.
6
+
7
+ ## The Why
8
+
9
+ Hand-crafted themes are expensive to maintain and constrain the user to a fixed palette. Wallpaper-driven themes:
10
+
11
+ - **Adapt to any wallpaper** — drop a new image, run `dot theme rebuild`, get a new theme
12
+ - **Guarantee contrast** — WCAG AAA is enforced algorithmically, not by taste
13
+ - **Avoid IP issues** — the engine never redistributes Apple/Microsoft wallpapers; it works with whatever is already on the user's system
14
+ - **Produce matched pairs** — every wallpaper yields a dark and light variant with a golden-ratio brightness relationship
15
+
16
+ ## The Pipeline
17
+
18
+ ```mermaid
19
+ graph LR
20
+ A[Wallpaper image<br/>any format] --> B[ImageMagick<br/>downsample + RGB extract]
21
+ B --> C[Random subsample<br/>2000 pixels]
22
+ C --> D[sRGB → CIE XYZ → CIELAB]
23
+ D --> E[K-Means++ clustering<br/>k=8, 3 runs, best inertia]
24
+ E --> F[Map clusters to<br/>ANSI hue slots]
25
+ F --> G[Enforce WCAG AAA<br/>contrast adjustments]
26
+ G --> H[Generate theme TOML<br/>16 ANSI + UI + app mappings]
27
+ ```
28
+
29
+ ### Stage 1 — Pixel Extraction
30
+
31
+ `ImageMagick` resizes the wallpaper to 80×80 maximum dimension (preserving aspect ratio) and emits pixel-by-pixel text output:
32
+
33
+ ```sh
34
+ magick input.heic -resize 80x80\> -depth 8 txt:-
35
+ ```
36
+
37
+ At 80×80 the image has ~6,400 pixels. For dynamic HEIC files (`image.heic[0]`, `image.heic[1]`), each frame is processed independently.
38
+
39
+ ### Stage 2 — Subsampling
40
+
41
+ 2,000 pixels are sampled uniformly from the downsampled image using a seeded PRNG (`random.Random(42)`). This gives a reproducible run and keeps K-Means iteration fast.
42
+
43
+ ### Stage 3 — Color Space Conversion
44
+
45
+ Each RGB triplet is converted:
46
+
47
+ 1. **sRGB → linear RGB** — gamma correction using the sRGB companding curve
48
+ 2. **Linear RGB → CIE XYZ** — D65 illuminant, matrix multiplication
49
+ 3. **CIE XYZ → CIELAB** — nonlinear transform; distances in Lab approximate human perception
50
+
51
+ Why CIELAB? In RGB, a "distance" of 30 between two colors might look identical to one eye and drastically different to another. In CIELAB, Δ*E* distances are perceptually uniform — a Δ*E* of 2 is the threshold for "just noticeable different" regardless of which axis moves.
52
+
53
+ ### Stage 4 — K-Means Clustering
54
+
55
+ **K-Means++** initialization places initial centroids spread across the color space (reducing "bad seed" failures). The algorithm:
56
+
57
+ 1. Pick one random pixel as centroid 1
58
+ 2. For centroids 2..k, pick a pixel with probability proportional to D(x)² (squared distance to nearest existing centroid)
59
+ 3. Iterate: assign each pixel to its nearest centroid, recompute centroid as mean of assigned pixels
60
+ 4. Stop when assignments stabilize or max iterations reached
61
+
62
+ We run the algorithm 3 times with different seeds and keep the clustering with lowest inertia (sum of squared distances from each pixel to its centroid). This avoids local minima without the cost of more runs.
63
+
64
+ ### Stage 5 — ANSI Hue Mapping
65
+
66
+ The 6 chromatic ANSI slots (red, green, yellow, blue, magenta, cyan) are assigned target hue angles:
67
+
68
+ | ANSI Slot | Target Hue (degrees) |
69
+ |:---|---:|
70
+ | red | 30 |
71
+ | yellow | 95 |
72
+ | green | 145 |
73
+ | cyan | 210 |
74
+ | blue | 275 |
75
+ | magenta | 330 |
76
+
77
+ For each slot, the engine picks the most chromatic cluster whose hue is nearest to the target. If no cluster is close enough, the color is synthesized by projecting the accent chroma onto the target hue angle.
78
+
79
+ Structural slots (`c0`/black, `c7`/white, `c8`, `c15`) are computed from the background Lab with fixed lightness offsets — they exist to provide the required contrast ratios, not to carry hue information.
80
+
81
+ ### Stage 6 — WCAG AAA Contrast Enforcement
82
+
83
+ Every color pair is checked and adjusted:
84
+
85
+ | Pair | Minimum Ratio |
86
+ |:---|---:|
87
+ | `fg` / `bg` | 7:1 |
88
+ | `accent_text` / `accent` | 7:1 |
89
+ | `c15` / `bg` | 7:1 |
90
+ | `fg` / `sel_bg` | 4.5:1 |
91
+ | `c8` / `bg` | 2.5:1 |
92
+ | `c0` / `bg` | 1.5:1 |
93
+ | `panel` / `bg` | 1.03-2.0 (bounded) |
94
+ | `border` / `bg` | 1.08-3.5 (bounded) |
95
+
96
+ For the accent, the engine darkens in Lab space until white text has 7:1 contrast. For fg and bright ANSI colors, lightness is adjusted until the target ratio is met. The output is guaranteed AAA on launch — the `test_themes_toml.sh` unit test verifies this for every generated theme.
97
+
98
+ ## Wallpaper Discovery
99
+
100
+ `rebuild-themes.sh` scans two tiers of wallpapers:
101
+
102
+ ### System Wallpapers
103
+
104
+ - **macOS** — `/System/Library/Desktop Pictures/*.heic` and `/System/Library/Desktop Pictures/.thumbnails/*.heic`
105
+ - **Linux** — `/usr/share/backgrounds/` and `/usr/share/wallpapers/` (recursive)
106
+
107
+ ### Custom Wallpapers
108
+
109
+ - `~/Pictures/Wallpapers/*.{heic,jpg,png}` (or `$DOTFILES_WALLPAPER_DIR`)
110
+
111
+ ### Deduplication
112
+
113
+ Custom wallpapers override system wallpapers on name collision. For Apple's dynamic HEIC files that contain multiple appearances in one file, the engine extracts each frame (`file.heic[0]`, `file.heic[1]`) and generates one theme per appearance.
114
+
115
+ If a base wallpaper has explicit `-dark` and `-light` variants (e.g. `Big Sur Graphic.heic` + `Big Sur Graphic Dark.heic` + `Big Sur Graphic Light.heic`), the base is skipped to avoid duplicate theme names.
116
+
117
+ ## Dynamic HEIC (Apple Appearance Metadata)
118
+
119
+ macOS dynamic wallpapers embed the `apple_desktop:apr` XMP metadata — a base64-encoded plist mapping image indices to appearance modes:
120
+
121
+ ```xml
122
+ <rdf:Description rdf:about=""
123
+ xmlns:apple_desktop="http://ns.apple.com/namespace/1.0/"
124
+ apple_desktop:apr="YnBsaXN0MDDSAQIDBFFsUWQQABABCA0PERMAAAAAAAABAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAFQ=="/>
125
+ ```
126
+
127
+ Decoded:
128
+
129
+ ```xml
130
+ <dict>
131
+ <key>l</key><integer>0</integer> <!-- light = image 0 -->
132
+ <key>d</key><integer>1</integer> <!-- dark = image 1 -->
133
+ </dict>
134
+ ```
135
+
136
+ `scripts/theme/merge-wallpaper.sh` combines separate dark+light files into a single dynamic HEIC with this metadata:
137
+
138
+ ```sh
139
+ bash scripts/theme/merge-wallpaper.sh # merge all pairs
140
+ bash scripts/theme/merge-wallpaper.sh tahoe # merge a specific family
141
+ bash scripts/theme/merge-wallpaper.sh --dry-run # preview
142
+ ```
143
+
144
+ macOS then auto-switches the displayed image based on the current Light/Dark mode — no application-level logic required.
145
+
146
+ ## Caching
147
+
148
+ Per-wallpaper themes are cached in `~/.cache/dotfiles/themes/<name>.toml`. The cache is invalidated when the wallpaper's mtime is newer than the cached TOML. `dot theme rebuild --force` skips the cache.
149
+
150
+ Full parallel rebuild of ~150 wallpapers takes ~3-5 minutes on modern hardware (4 parallel jobs, ~4 seconds per wallpaper). Incremental rebuilds (after adding 1-2 new wallpapers) take ~10 seconds.
151
+
152
+ ## Theme Application
153
+
154
+ `dot-theme-sync` orchestrates the switch across every managed surface:
155
+
156
+ | Surface | Mechanism |
157
+ |:---|:---|
158
+ | Ghostty | `chezmoi apply config.tmpl` + DBus reload or SIGUSR2 |
159
+ | Alacritty | `chezmoi apply alacritty.toml.tmpl` |
160
+ | Kitty | `chezmoi apply kitty.conf.tmpl` + SIGUSR1 |
161
+ | WezTerm | `chezmoi apply wezterm.lua.tmpl` |
162
+ | Tmux | `chezmoi apply tmux.conf.tmpl` + `source-file` |
163
+ | Neovim | `chezmoi apply` + `--remote-expr` colorscheme switch over socket |
164
+ | VS Code | `chezmoi apply settings.json.tmpl` |
165
+ | GTK | `chezmoi apply gtk.css.tmpl` + `gsettings set gtk-theme` |
166
+ | macOS accent | `defaults write -g AppleAccentColor` + `killall cfprefsd SystemUIServer Dock` |
167
+ | Desktop wallpaper | `osascript` (macOS) or `gsettings picture-uri` (Linux) |
168
+
169
+ See [Theming Reference](../03-reference/01-dot-cli.md#theme) for the exact command surface.
170
+
171
+ ## Bibliography
172
+
173
+ - MacQueen, J. (1967). *Some methods for classification and analysis of multivariate observations.* Proceedings of the Fifth Berkeley Symposium on Mathematical Statistics and Probability.
174
+ - Arthur, D. & Vassilvitskii, S. (2007). *K-Means++: The advantages of careful seeding.* ACM-SIAM Symposium on Discrete Algorithms.
175
+ - CIE (1976). *Recommendations on uniform color spaces, color-difference equations, psychometric color terms.* Supplement No. 2 to CIE Publication No. 15.
176
+ - W3C (2023). *Web Content Accessibility Guidelines (WCAG) 2.2.* <https://www.w3.org/TR/WCAG22/>
177
+
178
+ ## See Also
179
+
180
+ - [Theming Guide](../../guides/THEMING.md) — quick-start and troubleshooting
181
+ - [Theme Reference](../../reference/THEMES.md) — data schema and runtime behaviour
182
+ - [Tutorial: Add a Wallpaper](../02-tutorials/02-add-wallpaper.md)
@@ -0,0 +1,142 @@
1
+ # Fleet Architecture
2
+
3
+ A "fleet" is two or more workstations sharing a single `.dotfiles` source repository. The fleet model handles per-host customization, drift detection, and cross-host trust propagation.
4
+
5
+ ## Single Source, Many Hosts
6
+
7
+ All hosts clone the same repository. Platform and per-host differences are resolved at `chezmoi apply` time using three sources of data:
8
+
9
+ 1. **`.chezmoidata.toml`** — defaults for all hosts
10
+ 2. **`.chezmoidata/hardware.toml`** — machine presets (MacBook T2, Surface Pro, Geekom, etc.)
11
+ 3. **`~/.config/chezmoi/chezmoi.toml`** — per-host overrides, generated by `chezmoi init`
12
+
13
+ The `machine` key in `chezmoi.toml` selects which preset applies:
14
+
15
+ ```toml
16
+ # ~/.config/chezmoi/chezmoi.toml on a MacBook
17
+ [data]
18
+ machine = "macbook-t2"
19
+ theme = "tahoe-dark"
20
+ ```
21
+
22
+ Templates read `.chezmoi.hardware` to get the resolved preset:
23
+
24
+ ```go
25
+ {{- $hw := index .hardware .machine }}
26
+ display_scale = {{ $hw.display_scale }} // 2.0 for MacBook, 1.5 for Surface
27
+ ```
28
+
29
+ ## Hardware Presets
30
+
31
+ `.chezmoidata/hardware.toml` ships with ~12 presets covering common laptop/desktop/NUC configurations. Each preset defines:
32
+
33
+ | Field | Purpose |
34
+ |:---|:---|
35
+ | `display_scale` | 1.0, 1.25, 1.5, 1.75, 2.0 |
36
+ | `kbd_layout` | colemak-dh, qwerty, dvorak |
37
+ | `modifier_mode` | left-cmd-control, fn-swap, standard |
38
+ | `perf_profile` | laptop, desktop, low-power |
39
+ | `wm` | aerospace, niri, gnome, kde |
40
+ | `features.X` | per-preset feature toggles |
41
+
42
+ Add a new preset by appending to `hardware.toml` — no code changes needed.
43
+
44
+ ## Drift Detection
45
+
46
+ `dot drift` compares the current machine state against the rendered template output and reports:
47
+
48
+ | Drift Type | Example |
49
+ |:---|:---|
50
+ | **Added** | File exists locally but not in source |
51
+ | **Removed** | Source deletes a file still present locally |
52
+ | **Modified** | Local edit to a managed file |
53
+ | **Permission** | Chmod/chown changes |
54
+ | **Symlink target** | Link retargeted |
55
+
56
+ Drift is normal during development. `dot heal` reconciles the source → local direction. `dot apply` overwrites drift; `dot diff` previews the change without applying.
57
+
58
+ ## Fleet Attestation
59
+
60
+ `dot fleet attest` runs `dot attest` locally and collects signed attestations from every known host (via SSH). The combined report shows:
61
+
62
+ - Whether all hosts are on the same Git SHA
63
+ - Whether policy hashes match
64
+ - Which hosts have drift
65
+ - Which hosts have verified signatures
66
+
67
+ A typical output:
68
+
69
+ ```
70
+ Fleet Attestation — v0.2.500
71
+
72
+ Host Git SHA Policy Tools OK Drift Verified
73
+ -------------- ---------- --------- ---------- ------- --------
74
+ macbook-t2 abc123d 0x7f2a… ✓ 0 ✓
75
+ surface-pro abc123d 0x7f2a… ✓ 2 ✓
76
+ geekom-a9 def456e 0x7f2a… ✗ (chezmoi 2.45) ✗
77
+ -------------- ---------- --------- ---------- ------- --------
78
+ FLEET STATUS: 2/3 aligned; drift on geekom-a9
79
+ ```
80
+
81
+ This becomes an auditable artifact — useful for compliance reporting, incident response, and post-upgrade validation.
82
+
83
+ ## Fleet Deployment Workflow
84
+
85
+ Recommended rollout procedure for fleet-wide changes:
86
+
87
+ 1. **Develop on one host** — make the change, test locally with `dot apply --dry-run` then `dot apply`
88
+ 2. **Open a PR** — CI validates shellcheck, tests, security scanners
89
+ 3. **Merge to master** — signed commit required
90
+ 4. **Per-host pull** — on each fleet host: `dot update` (git pull + apply)
91
+ 5. **Verify alignment** — run `dot fleet attest` from any host
92
+
93
+ For urgent rollback: every host can independently run `dot rollback` to return to the previous known-good state (stored in `~/.local/state/dotfiles/snapshots/`).
94
+
95
+ ## Cross-Host Trust
96
+
97
+ Each host has its own SSH ED25519 signing key. To establish mutual trust:
98
+
99
+ 1. On each host: `cat ~/.ssh/id_ed25519.pub` — capture the public key
100
+ 2. Add every host's public key to `~/.ssh/allowed_signers` on every other host
101
+ 3. Commit `allowed_signers` to the source repository (it's public-key material, safe to share)
102
+ 4. After `dot apply`, any host can verify commits and attestations from any other host
103
+
104
+ This creates a **web-of-trust** among your own fleet. No central CA, no external service — just SSH keys.
105
+
106
+ ## Machine-Scoped Secrets
107
+
108
+ Some secrets must decrypt only on specific hosts (e.g. a work VPN config that doesn't belong on a personal laptop). The SOPS approach:
109
+
110
+ ```yaml
111
+ # dot_config/vpn.sops.yaml
112
+ vpn_key: ENC[AES256_GCM,data:...]
113
+ sops:
114
+ age:
115
+ - recipient: age1... # work laptop only
116
+ enc: |
117
+ -----BEGIN AGE ENCRYPTED FILE-----
118
+ ...
119
+ ```
120
+
121
+ Only the host with the matching Age private key can decrypt. Other hosts see the encrypted file but cannot read the content.
122
+
123
+ ## Fleet Operational Commands
124
+
125
+ | Command | Purpose |
126
+ |:---|:---|
127
+ | `dot fleet` | Show all known hosts and their last-seen status |
128
+ | `dot fleet attest` | Collect signed attestations from every host |
129
+ | `dot fleet diff` | Compare rendered config across hosts |
130
+ | `dot fleet sync` | Run `dot update` on every host (requires SSH access) |
131
+
132
+ ## Limitations
133
+
134
+ - Fleet commands assume SSH connectivity between hosts (or a dedicated orchestration agent — see [Roadmap](../../operations/ROADMAP.md))
135
+ - Secret rotation requires re-encrypting for all recipients; automated with `dot secrets rotate`
136
+ - There is no central policy store — policy is versioned in the Git repository itself
137
+
138
+ ## See Also
139
+
140
+ - [Fleet Deployment Architecture](../../architecture/fleet-deployment.md) — diagrams
141
+ - [Trust Model](02-trust-model.md)
142
+ - [Tutorial: Deploy to a Fleet](../02-tutorials/05-deploy-fleet.md)
@@ -0,0 +1,197 @@
1
+ # Self-Healing
2
+
3
+ `.dotfiles` detects, diagnoses, and repairs configuration drift, missing tools, broken symlinks, and environmental damage — often without user intervention.
4
+
5
+ ## The Self-Healing Loop
6
+
7
+ ```
8
+ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
9
+ │ dot doctor │ ──► │ detect │ ──► │ report │
10
+ └─────────────┘ └─────────────┘ └─────────────┘
11
+
12
+
13
+ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
14
+ │ dot heal │ ──► │ repair │ ──► │ verify │
15
+ └─────────────┘ └─────────────┘ └─────────────┘
16
+
17
+ ▼ (on failure)
18
+ ┌─────────────┐ ┌─────────────┐
19
+ │dot rollback │ ──► │ revert │
20
+ └─────────────┘ └─────────────┘
21
+ ```
22
+
23
+ ## `dot doctor` — Detection
24
+
25
+ `dot doctor` runs ~40 health checks grouped into categories:
26
+
27
+ | Category | Checks |
28
+ |:---|:---|
29
+ | **Paths** | `~/.local/bin`, `~/.cargo/bin`, Mise shim order, Homebrew prefix |
30
+ | **Tools** | Required: git, chezmoi. Optional: mise, nix, age, sops, pandoc |
31
+ | **Chezmoi** | Source dir exists, data file valid, no uncommitted drift |
32
+ | **Shell** | Default shell matches profile, startup time <500ms |
33
+ | **Security** | SSH keys present, Age key present, gitleaks baseline |
34
+ | **Portability** | Git user.email set, LC_ALL sane, TERM recognized |
35
+
36
+ Exit codes:
37
+
38
+ | Code | Meaning |
39
+ |:---|:---|
40
+ | 0 | All checks passed |
41
+ | 1 | Warnings (non-blocking) |
42
+ | 2 | Critical failures (tool missing, config broken) |
43
+
44
+ Flags:
45
+
46
+ - `--score` / `-s` — numeric health score (0-100)
47
+ - `--heal` / `-H` — auto-fix detected issues (equivalent to `dot doctor && dot heal`)
48
+ - `--json` / `-j` — machine-readable output for CI/monitoring
49
+ - `--verbose` / `-v` — show every check (default shows only failures)
50
+
51
+ ## `dot heal` — Repair
52
+
53
+ `dot heal` addresses three common failure modes:
54
+
55
+ ### 1. Missing Tools
56
+
57
+ Reinstalls tools listed in `.chezmoidata.toml` that aren't on PATH:
58
+
59
+ ```sh
60
+ dot heal
61
+ # [heal] jq not found, installing via mise
62
+ # [heal] age not found, installing via homebrew
63
+ # [heal] ✓ 2 tools installed
64
+ ```
65
+
66
+ Priority order: mise → homebrew (macOS) → apt/dnf (Linux) → nix → manual install script.
67
+
68
+ ### 2. Chezmoi Drift
69
+
70
+ Runs `chezmoi apply --force` to reconcile local files back to the source state. Skipped files (excluded via `.chezmoiignore`) are left alone.
71
+
72
+ ### 3. Broken Symlinks & Missing Files
73
+
74
+ Detects dangling symlinks (target doesn't exist) and re-applies chezmoi to recreate them. Missing critical files (e.g. `~/.zshrc`) trigger a targeted re-render.
75
+
76
+ ### Flags
77
+
78
+ - `--dry-run` / `-n` — show what would be fixed, don't change anything
79
+ - `--force` / `-f` — skip confirmation prompts
80
+ - `--tool <name>` — heal only a specific tool
81
+
82
+ ### Exit Codes
83
+
84
+ - 0 — nothing to heal or all fixes succeeded
85
+ - 1 — some repairs failed, manual intervention required
86
+
87
+ ## `dot chaos` — Self-Test
88
+
89
+ `dot chaos` intentionally corrupts the local installation to verify `dot heal` can recover it. This is **destructive** — run only in ephemeral environments (containers, VMs, fresh installs).
90
+
91
+ Corruption scenarios:
92
+
93
+ | Scenario | What it breaks |
94
+ |:---|:---|
95
+ | `symlink` | Delete 3 random managed symlinks |
96
+ | `config` | Rewrite `~/.gitconfig` with garbage |
97
+ | `tool` | `mv` a critical binary out of PATH |
98
+ | `permission` | `chmod 000` on a dotfile |
99
+ | `all` | Run all scenarios sequentially |
100
+
101
+ Typical workflow:
102
+
103
+ ```sh
104
+ docker run --rm -it ubuntu bash
105
+ # inside container:
106
+ bash -c "$(curl -fsSL https://.../install.sh)"
107
+ dot doctor # baseline
108
+ dot chaos all # break things
109
+ dot heal # fix
110
+ dot doctor # verify
111
+ ```
112
+
113
+ This is part of CI: every PR runs `dot chaos` in a Docker container and validates `dot heal` restores a healthy state.
114
+
115
+ ## `dot rollback` — Revert
116
+
117
+ Before every `dot apply`, chezmoi writes a snapshot to `~/.local/state/dotfiles/snapshots/YYYY-MM-DD-HHMMSS/`. `dot rollback` restores the most recent snapshot:
118
+
119
+ ```sh
120
+ dot rollback # revert to the most recent snapshot
121
+ dot rollback status # list available snapshots
122
+ dot rollback restore 3 # restore snapshot #3
123
+ dot rollback clean # delete snapshots older than 30 days
124
+ ```
125
+
126
+ Snapshots include:
127
+ - Every file chezmoi would have overwritten
128
+ - The previous `.chezmoidata.toml` and `chezmoi.toml`
129
+ - A pointer to the Git SHA at apply time
130
+
131
+ They do **not** include:
132
+ - Generated caches (`~/.cache/`)
133
+ - Tool binaries (Mise-managed)
134
+ - External state (databases, remote repos)
135
+
136
+ ## `dot bundle` — Offline Recovery
137
+
138
+ `dot bundle` creates a self-contained archive that can restore the workstation without network access:
139
+
140
+ ```
141
+ dotfiles-bundle-v0.2.500-20260416.tar.zst
142
+ ├── source/ # Full git clone at current HEAD
143
+ ├── tools/ # Pre-built chezmoi binary + mise
144
+ ├── secrets/ # Age-encrypted snapshot of ~/.config/age/
145
+ ├── manual/ # Offline manual (HTML + PDF)
146
+ ├── attestation.json # Signed state
147
+ ├── install-offline.sh # Bootstrap script
148
+ └── SHA256SUMS # Integrity checksums
149
+ ```
150
+
151
+ Usage:
152
+
153
+ ```sh
154
+ dot bundle # create bundle in ~/Downloads/
155
+ dot bundle --to /path/to/usb.img # write to external storage
156
+ dot bundle restore bundle.tar.zst # restore from bundle
157
+ ```
158
+
159
+ Recovery use case: you're stranded on a new machine with no internet. Copy the bundle over (USB, phone tether, Bluetooth). Run `bash install-offline.sh`. You have a working dotfiles environment in <60 seconds, no network required.
160
+
161
+ ## Observability
162
+
163
+ ### Health Score
164
+
165
+ `dot score` returns a 0-100 score combining:
166
+
167
+ | Dimension | Weight |
168
+ |:---|---:|
169
+ | Tool availability | 30 |
170
+ | Chezmoi drift | 20 |
171
+ | Security gates (sigs, secrets, Age key) | 20 |
172
+ | Performance (shell startup, cache health) | 15 |
173
+ | Compliance (policy hash match) | 15 |
174
+
175
+ Scores:
176
+ - 90-100 — healthy
177
+ - 70-89 — minor issues
178
+ - 50-69 — needs attention
179
+ - <50 — run `dot heal` immediately
180
+
181
+ ### Metrics
182
+
183
+ `dot metrics` shows recent observations: shell startup time, last-apply duration, heal events, chaos self-tests, CVE counts from SBOM scan. Metrics are stored locally in `~/.local/state/dotfiles/metrics.jsonl` (append-only, one line per event).
184
+
185
+ ## Design Principles
186
+
187
+ 1. **Idempotent** — running `dot apply` or `dot heal` twice has the same effect as once
188
+ 2. **Reversible** — every mutation creates a rollback point
189
+ 3. **Observable** — failures produce actionable error messages with exit codes
190
+ 4. **Offline-capable** — core flows (detect, heal, rollback) work without network
191
+ 5. **Minimally invasive** — repairs are scoped to the smallest unit that fixes the problem
192
+
193
+ ## See Also
194
+
195
+ - [Reliability Operations](../../operations/RELIABILITY.md)
196
+ - [Tutorial: First Install](../02-tutorials/01-first-install.md)
197
+ - [Cookbook: Troubleshooting](../04-cookbook/02-troubleshooting.md)