@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,33 @@
1
+ # Policy Bundle Releases
2
+
3
+ Policy bundles are released as tracked governance artifacts.
4
+
5
+ They include:
6
+
7
+ - policy bundles
8
+ - model registry
9
+ - prompt registry
10
+ - agent profiles
11
+ - agent card
12
+ - MCP policy, registry, and lock
13
+ - A2A discovery metadata
14
+
15
+ ## Local packaging
16
+
17
+ ```bash
18
+ bash scripts/release/package-policy-bundles.sh --version 2026.03
19
+ bash scripts/release/package-policy-bundles.sh --json
20
+ ```
21
+
22
+ ## Release workflow
23
+
24
+ Use the `Policy Bundle Release` workflow.
25
+
26
+ Release controls:
27
+
28
+ - source ref must be signed
29
+ - governance JSON must validate with `jq`
30
+ - bundle archive gets a SHA-256 checksum
31
+ - bundle archive gets GitHub provenance attestation
32
+
33
+ Signed commits remain mandatory for any policy change.
@@ -0,0 +1,24 @@
1
+ # Security Documentation
2
+
3
+ This directory contains security documentation for the dotfiles project.
4
+
5
+ ## Index
6
+
7
+ | Document | Description |
8
+ |----------|-------------|
9
+ | [SECURITY.md](SECURITY.md) | Core security model and opt-in hardening |
10
+ | [THREAT_MODEL.md](THREAT_MODEL.md) | Threat analysis with trust boundaries |
11
+ | [SECRETS.md](SECRETS.md) | Secrets management (Age, SOPS, Keychain) |
12
+ | [KEY_ROTATION.md](KEY_ROTATION.md) | Key rotation procedures |
13
+ | [KEYS.md](KEYS.md) | Keybindings reference |
14
+ | [COMPLIANCE.md](COMPLIANCE.md) | SOC 2, ISO 27001, GDPR, HIPAA mapping |
15
+ | [AI_ACT_COMPLIANCE.md](AI_ACT_COMPLIANCE.md) | EU AI Act risk classification and exemption analysis |
16
+ | [SECURITY_CHECKLIST.md](SECURITY_CHECKLIST.md) | Pre-release security verification |
17
+
18
+ ## Quick Reference
19
+
20
+ - **Encryption:** Age + SOPS for secrets at rest
21
+ - **Signing:** SSH ED25519 commit signing enforced
22
+ - **Scanning:** Gitleaks pre-commit hook prevents credential leaks
23
+ - **Telemetry:** Disabled by default, no data leaves your machine
24
+ - **Hardening:** Opt-in firewall, DNS-over-HTTPS, lock-screen, USB safety
@@ -0,0 +1,146 @@
1
+ # Secrets Management
2
+
3
+ Provider-agnostic secrets via `dot secrets`. Supports macOS Keychain, `pass`, and age-encrypted local storage.
4
+
5
+ ## Providers
6
+
7
+ Provider selection is controlled by `.chezmoidata.toml`:
8
+
9
+ ```toml
10
+ [secrets.policy]
11
+ provider = "auto" # auto | macos-keychain | pass | plain-enc
12
+ auto_load = true
13
+
14
+ [secrets.buckets]
15
+ ai = ["GEMINI_API_KEY", "CLAUDE_API_KEY", "OPENAI_API_KEY"]
16
+ infra = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "GITHUB_TOKEN"]
17
+ ```
18
+
19
+ `auto` resolves in this order:
20
+ 1. `macos-keychain` on macOS
21
+ 2. `pass` when available
22
+ 3. `plain-enc` fallback (age-encrypted local store)
23
+
24
+ ## Commands
25
+
26
+ ```bash
27
+ # Bootstrap age key for chezmoi encrypted files
28
+ dot secrets-init
29
+
30
+ # Optional: create encrypted secrets file for chezmoi
31
+ dot secrets-create
32
+ dot secrets edit
33
+
34
+ # Managed secret store
35
+ dot secrets set GEMINI_API_KEY
36
+ dot secrets get GEMINI_API_KEY --raw
37
+ dot secrets list
38
+ dot secrets provider
39
+
40
+ # Emit export lines for a bucket
41
+ dot secrets load ai
42
+
43
+ # Load into current shell session
44
+ eval "$(dot env load ai)"
45
+ ```
46
+
47
+ ## Shell Auto-Load
48
+
49
+ When `auto_load = true`, shell startup can load configured buckets automatically via `dot env load <bucket>`.
50
+
51
+ Environment toggles:
52
+ - `DOTFILES_SECRETS_PROVIDER`
53
+ - `DOTFILES_SECRETS_AUTO_LOAD`
54
+ - `DOTFILES_SECRETS_BUCKET_NAMES`
55
+
56
+ ## Governance
57
+
58
+ A pre-commit hook runs:
59
+
60
+ ```bash
61
+ scripts/diagnostics/secret-governance.sh
62
+ ```
63
+
64
+ It blocks staged commits when likely secret patterns are found. In strict mode it also blocks exact matches against managed secret values.
65
+
66
+ ## SSH Key Encryption
67
+
68
+ ```bash
69
+ dot ssh-key ~/.ssh/id_ed25519
70
+ ```
71
+
72
+ This creates a local encrypted file, which you can add to chezmoi with `chezmoi add --encrypt` if needed.
73
+
74
+ ## External Secrets Backends
75
+
76
+ Chezmoi natively supports external secret managers as template functions. Configure the backend in `.chezmoidata.toml`:
77
+
78
+ ```toml
79
+ secrets_backend = "age" # age, 1password, bitwarden, pass, vault
80
+ ```
81
+
82
+ ### 1Password
83
+
84
+ Requires the [1Password CLI](https://developer.1password.com/docs/cli/) (`op`).
85
+
86
+ ```toml
87
+ # .chezmoidata.toml
88
+ secrets_backend = "1password"
89
+ ```
90
+
91
+ Use in templates:
92
+ ```text
93
+ {{ onepassword "my-secret" "vault-name" }}
94
+ {{ onepasswordRead "op://vault/item/field" }}
95
+ ```
96
+
97
+ ### Bitwarden
98
+
99
+ Requires the [Bitwarden CLI](https://bitwarden.com/help/cli/) (`bw`).
100
+
101
+ ```toml
102
+ # .chezmoidata.toml
103
+ secrets_backend = "bitwarden"
104
+ ```
105
+
106
+ Use in templates:
107
+ ```text
108
+ {{ bitwarden "item" "my-login" }}
109
+ {{ bitwardenFields "item" "my-login" }}
110
+ ```
111
+
112
+ ### HashiCorp Vault
113
+
114
+ Requires the [Vault CLI](https://developer.hashicorp.com/vault/docs/commands) (`vault`).
115
+
116
+ ```toml
117
+ # .chezmoidata.toml
118
+ secrets_backend = "vault"
119
+ ```
120
+
121
+ Use in templates:
122
+ ```text
123
+ {{ vault "secret/data/my-secret" }}
124
+ ```
125
+
126
+ ### pass (Password Store)
127
+
128
+ Requires [pass](https://www.passwordstore.org/).
129
+
130
+ ```toml
131
+ # .chezmoidata.toml
132
+ secrets_backend = "pass"
133
+ ```
134
+
135
+ Use in templates:
136
+ ```text
137
+ {{ pass "my-secret" }}
138
+ ```
139
+
140
+ See the [chezmoi documentation](https://www.chezmoi.io/user-guide/password-managers/) for full details on each backend.
141
+
142
+ ## Security Notes
143
+
144
+ - **Never commit** `~/.config/chezmoi/key.txt` to version control.
145
+ - **Avoid shell history exposure** — use `dot secrets set` which prompts securely.
146
+ - **Rotate credentials** on a regular schedule.
@@ -0,0 +1,41 @@
1
+ # Security
2
+
3
+ How dotfiles handles security and system modifications.
4
+
5
+ ## Core Principles
6
+
7
+ - **Opt-In Only** — No hardening applies unless `DOTFILES_*` variables are set to `1`.
8
+ - **Local Logging** — All actions log to `~/.local/share/dotfiles.log`. No telemetry.
9
+ - **No Hidden Sudo** — Sudo requests only for package managers. Never cached indefinitely.
10
+
11
+ ## Hardening
12
+
13
+ | Feature | Env Var | Action (macOS) | Action (Linux) |
14
+ |---|---|---|---|
15
+ | Firewall | `DOTFILES_FIREWALL` | Enables `socketfilterfw` + Stealth Mode | Configures UFW |
16
+ | Telemetry | `DOTFILES_TELEMETRY` | Disables Diagnostic plists | Disables `whoopsie`/`apport` |
17
+ | DNS-over-HTTPS | `DOTFILES_DOH` | Browser-level settings | Configures `resolvectl` |
18
+ | Idle Security | `DOTFILES_LOCK` | Sets screensaver idle time | Sets GNOME/KDE idle-delay |
19
+
20
+ ## Secrets
21
+
22
+ The dotfiles use **age** for encryption.
23
+
24
+ - **Initialization**: `dot secrets-init` creates a key at `~/.config/chezmoi/key.txt`.
25
+ - **Storage**: Secrets are stored as `.age` encrypted files.
26
+ - **Protection**: Private keys aren't committed to the repo.
27
+
28
+ ## SSH Certificates
29
+
30
+ Short-lived SSH certificates reduce the blast radius of key compromise.
31
+
32
+ - **Issue**: `dot ssh-cert issue [--ttl 16h] [--principal user]`
33
+ - **Status**: `dot ssh-cert status` — checks certificate validity and expiry
34
+ - **Revoke**: `dot ssh-cert revoke` — revokes active certificates
35
+ - **Backends**: `step-ca` (Smallstep) and local CA key (`ssh-keygen`)
36
+ - **Default TTL**: 16 hours (override via `SSH_CERT_TTL` environment variable)
37
+ - **CA URL**: Set `SSH_CERT_CA_URL` for `step-ca` integration
38
+
39
+ ## Reporting a Vulnerability
40
+
41
+ If you discover a security vulnerability, don't open a public issue. Follow the instructions in the Security Policy.
@@ -0,0 +1,44 @@
1
+ # Security Release Checklist
2
+
3
+ Use this checklist before cutting any new release (e.g., `v0.x.x`) to ensure supply-chain integrity.
4
+
5
+ ## 1. Supply Chain & Installer
6
+ - [ ] **Pinned Version**: Update `install.sh` `VERSION` variable to match the release tag.
7
+ - [ ] **Docs Sync**: Ensure `README.md` and `.github/PULL_REQUEST_TEMPLATE.md` installer URLs point to the new tag (not `main`).
8
+ - [ ] **Clean Build**: Verify `install.sh` does not curl random scripts from third parties without pinning.
9
+ - [ ] **SOUP Register**: Review [SOUP_REGISTER.md](/home/seb/.dotfiles/docs/security/SOUP_REGISTER.md) and confirm all active external components have an owner and validation path.
10
+
11
+ ## 2. Secrets & Leak Prevention
12
+ - [ ] **SSH Keys**: Scan `dot_ssh/` to ensure no private keys (`id_rsa`, `id_ed25519`) are committed.
13
+ - [ ] **Env Vars**: Check for hardcoded API tokens in `dot_config/` (use `age` encryption or environment variables instead).
14
+ - [ ] **Git History**: Run `git secrets` or similar to scan for accidental commits of credentials.
15
+
16
+ ## 3. Platform Safety
17
+ - [ ] **WSL Check**: Verify `install.sh` detects WSL and does not try to install systemd services or macOS defaults.
18
+ - [ ] **Root usage**: Ensure no script requires `sudo` unnecessarily (Principle of Least Privilege).
19
+
20
+ ## 4. Toolchain
21
+ - [ ] **Binary Integrity**: Check that `dot_local/bin/` scripts are pure shell/executable and match expected checksums (no binary blobs).
22
+ - [ ] **Dependency Scan**: Run `npm audit` / `cargo audit` if applicable (currently Node.js legacy is removed).
23
+
24
+ ## 5. MCP (Model Context Protocol) Hardening
25
+ - [ ] **Launcher Policy**: Verify `dot mcp` shows only allowlisted launchers (`npx`, `node`, `uvx`).
26
+ - [ ] **Filesystem Scope**: Ensure no MCP server has broad access (`/`, `/home`, `/Users`).
27
+ - [ ] **Default Profile**: Confirm only the `strict-local` server set is enabled by default.
28
+ - [ ] **Token Validation**: Confirm required API tokens are set (`GITHUB_TOKEN`, `BRAVE_API_KEY`).
29
+ - [ ] **Arg Policy**: No wildcard (`*`) or `--unsafe` arguments in MCP server configs.
30
+ - [ ] **Env Placeholders**: All `${VAR}` references in MCP config have corresponding environment variables.
31
+
32
+ Run `dot mcp --strict --json` to validate all MCP server configurations and capture an audit artifact.
33
+
34
+ ## 6. Release Attestation
35
+ - [ ] **SBOM Generation**: Verify `dotfiles-sbom.spdx.json` is generated in release workflow.
36
+ - [ ] **Attestation Signing**: Confirm `actions/attest-build-provenance` signs the release artifacts.
37
+ - [ ] **Attestation Verification**: Verify with `gh attestation verify <artifact> --repo sebastienrousseau/dotfiles`.
38
+ - [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on master.
39
+ - [ ] **Automation Keying**: Confirm `ACTIONS_BOT_SIGNING_KEY` exists and matches the signer in `dot_config/git/allowed_signers`.
40
+
41
+ ## 7. Final Verification
42
+ - [ ] **Docker Test**: Run `docker build -f Dockerfile.test .` to verify clean install.
43
+ - [ ] **Doctor**: Run `dot doctor` locally.
44
+ - [ ] **MCP Check**: Run `dot mcp` to verify MCP configuration.
@@ -0,0 +1,32 @@
1
+ # SOUP Register
2
+
3
+ ## Purpose
4
+
5
+ Controlled inventory for software of unknown pedigree used by the dotfiles platform.
6
+
7
+ ## Active components
8
+
9
+ | Component | Source | Version control | Verification path | Owner | Status |
10
+ | :--- | :--- | :--- | :--- | :--- | :--- |
11
+ | Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](/home/seb/.dotfiles/install/lib/package_managers.sh) | Repo maintainer | Conditional |
12
+ | Chezmoi installer | `get.chezmoi.io` | Pinned by `CHEZMOI_INSTALLER_SHA256` when used | SHA-256 in `install/lib/chezmoi.sh` | Repo maintainer | Controlled |
13
+ | GitHub Actions marketplace actions | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pins | Repo maintainer | Controlled |
14
+ | Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](/home/seb/.dotfiles/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
15
+ | Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](/home/seb/.dotfiles/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
16
+ | Checkov action | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pin | Repo maintainer | Controlled |
17
+ | Nix inputs | GitHub flakes | Locked in [flake.lock](/home/seb/.dotfiles/flake.lock) | `narHash` and revision lock | Repo maintainer | Controlled |
18
+ | GitHub release metadata queries | GitHub API | Discovery only, not release validation | `update-deps.yml` query path | Repo maintainer | Monitored |
19
+
20
+ ## Validation record
21
+
22
+ 1. Record version or commit SHA.
23
+ 2. Record checksum, signature, or attestation method.
24
+ 3. Record workflow or script that consumes the component.
25
+ 4. Record owner and review date.
26
+ 5. Reject moving inputs in production or release paths unless checksum-gated.
27
+
28
+ ## Exit criteria
29
+
30
+ - No unsigned automation commits.
31
+ - No unverified executable download in installer or release path.
32
+ - Every SOUP item has owner, version control method, and validation record.
@@ -0,0 +1,120 @@
1
+ # Threat Model
2
+
3
+ Security analysis of the dotfiles distribution. Covers trust boundaries, threat actors, attack surfaces, and mitigations.
4
+
5
+ ## Trust Boundary
6
+
7
+ The primary trust boundary is the **local machine**. Dotfiles are deployed to and executed on the user's own system. All configuration files, scripts, and templates run with the user's privileges.
8
+
9
+ ```text
10
+ ┌─────────────────────────────────────────────────┐
11
+ │ Local Machine (trusted zone) │
12
+ │ ┌─────────────────┐ ┌──────────────────────┐ │
13
+ │ │ ~/.dotfiles/ │ │ ~/.config/ (deployed)│ │
14
+ │ │ (source repo) │──│ Shell configs, nvim │ │
15
+ │ └─────────────────┘ └──────────────────────┘ │
16
+ │ │
17
+ │ ┌─────────────────┐ ┌──────────────────────┐ │
18
+ │ │ ~/.local/bin/ │ │ ~/.cache/shell/ │ │
19
+ │ │ (user scripts) │ │ (cached eval output) │ │
20
+ │ └─────────────────┘ └──────────────────────┘ │
21
+ └─────────────────────────────────────────────────┘
22
+
23
+ ─────┼──────── Trust boundary ────────
24
+
25
+ ┌─────────────────────────────────────────────────┐
26
+ │ External (untrusted zone) │
27
+ │ GitHub (repo hosting), Homebrew, Nix, │
28
+ │ Zinit plugins, Neovim plugins, npm, pip │
29
+ └─────────────────────────────────────────────────┘
30
+ ```
31
+
32
+ ## Threat Actors
33
+
34
+ | Actor | Motivation | Capability |
35
+ |-------|-----------|------------|
36
+ | Supply chain attacker | Inject malicious code via dependency | Compromise upstream packages (Homebrew, npm, Zinit plugins) |
37
+ | Secrets harvester | Steal API keys, SSH keys, tokens | Scrape git history, shell history, env vars |
38
+ | Privilege escalation | Gain root access | Exploit `sudo` aliases, writable scripts in PATH |
39
+ | Network attacker | Intercept credentials | MITM on install scripts, curl-pipe-bash |
40
+
41
+ ## Attack Surfaces
42
+
43
+ ### 1. Shell Startup Scripts
44
+
45
+ **Risk:** Malicious code in sourced files executes with user privileges on every shell start.
46
+
47
+ **Mitigations:**
48
+ - All shell scripts pass `shellcheck --severity=error`
49
+ - `set -euo pipefail` enforced in all operational scripts
50
+ - `eval` usage hardened with process substitution (`. /dev/stdin`)
51
+ - Input validation on dynamic function generation
52
+ - `DOTFILES_ULTRA_FAST=1` bypasses all non-core sourcing
53
+
54
+ ### 2. Secrets Exposure
55
+
56
+ **Risk:** API keys, tokens, and SSH keys leaked via git history, shell history, or environment.
57
+
58
+ **Mitigations:**
59
+ - [Gitleaks](https://github.com/gitleaks/gitleaks) pre-commit hook blocks secrets in commits
60
+ - Atuin `history_filter` excludes sensitive patterns
61
+ - Age encryption for local secret storage
62
+ - `dot secrets set` uses secure prompts (no shell history)
63
+ - `.gitignore` excludes `key.txt`, `.env`, credential files
64
+
65
+ ### 3. Supply Chain Dependencies
66
+
67
+ **Risk:** Compromised upstream packages injected into the toolchain.
68
+
69
+ **Mitigations:**
70
+ - Nix Flakes provide reproducible, pinned dependencies
71
+ - Zinit plugin versions pinned (`ver"0.8.0"`)
72
+ - Neovim plugin versions locked via `lazy-lock.json`
73
+ - `install.sh` uses HTTPS for all downloads
74
+ - Homebrew formula integrity via bottle checksums
75
+
76
+ ### 4. Path Manipulation
77
+
78
+ **Risk:** Attacker places malicious binary in a PATH directory that shadows legitimate tools.
79
+
80
+ **Mitigations:**
81
+ - PATH construction is deterministic (template-generated)
82
+ - `~/.local/bin` is user-controlled and checked for writability
83
+ - No world-writable directories in PATH
84
+ - `prependpath` function validates directory existence
85
+
86
+ ### 5. Template Injection
87
+
88
+ **Risk:** Chezmoi template variables could inject shell code if not properly quoted.
89
+
90
+ **Mitigations:**
91
+ - Template variables come from `.chezmoidata.toml` (user-controlled)
92
+ - No external/network data used in templates
93
+ - Template validation via `chezmoi apply --dry-run` in CI
94
+
95
+ ### 6. Cached Eval Files
96
+
97
+ **Risk:** Stale or tampered cache files in `~/.cache/shell/` sourced at startup.
98
+
99
+ **Mitigations:**
100
+ - `_cached_eval` validates cache against binary mtime
101
+ - Cache files are user-owned (0644)
102
+ - Cache directory is under `$XDG_CACHE_HOME` (user-controlled)
103
+ - Cache can be cleared with `rm -rf ~/.cache/shell/`
104
+
105
+ ## Residual Risks
106
+
107
+ | Risk | Likelihood | Impact | Status |
108
+ |------|-----------|--------|--------|
109
+ | Zinit plugin compromise | Low | High | Mitigated by version pinning |
110
+ | Shell history leak | Medium | Medium | Mitigated by Atuin filter |
111
+ | Stale Nix closure | Low | Low | Accepted (manual `nix flake update`) |
112
+ | macOS Keychain access | Low | Medium | Accepted (OS-level protection) |
113
+
114
+ ## Recommendations
115
+
116
+ 1. Run `gitleaks detect` before every push (pre-commit hook enforced)
117
+ 2. Rotate secrets on a 90-day schedule
118
+ 3. Audit `lazy-lock.json` diffs when updating Neovim plugins
119
+ 4. Pin Homebrew versions for security-critical tools
120
+ 5. Use `DOTFILES_ULTRA_FAST=1` in CI to minimize attack surface
@@ -0,0 +1,224 @@
1
+ # Verification and Validation Report
2
+
3
+ ## Document Control
4
+
5
+ | Field | Value |
6
+ |-------|-------|
7
+ | Document ID | VV-DOT-001 |
8
+ | Version | 0.2.500 |
9
+ | Date | 2026-03-20 |
10
+ | Author | Repository Maintainer |
11
+ | Status | Active |
12
+ | Classification | Internal |
13
+ | Standard | ISO 13485:2016 Sections 7.3.6 / 7.3.7 (adapted) |
14
+
15
+ ---
16
+
17
+ ## Purpose
18
+
19
+ This document constitutes the formal Verification and Validation (V&V) report for the chezmoi-managed dotfiles repository, adapted from ISO 13485:2016 Sections 7.3.6 (Design and Development Verification) and 7.3.7 (Design and Development Validation) for infrastructure-as-code.
20
+
21
+ **Verification** confirms that each design output meets its corresponding design input requirement through inspection, analysis, and testing. **Validation** confirms that the deployed system satisfies its intended use under representative operating conditions (Linux, macOS, WSL).
22
+
23
+ All verification activities are executed through automated CI pipelines, pre-commit hooks, and the repository test framework. Evidence is retained in CI logs, test output, and this document.
24
+
25
+ ---
26
+
27
+ ## Verification Matrix
28
+
29
+ | Req ID | Requirement | Verification Method | Test File(s) | Result |
30
+ |--------|-------------|---------------------|--------------|--------|
31
+ | VR-01 | Shell scripts pass ShellCheck (severity=error) | Static analysis via `shellcheck --severity=error -e SC1091 -e SC2030 -e SC2031` | `ci.yml`, `ci-enforced.yml`, pre-commit hook | Pass |
32
+ | VR-02 | All scripts have `set -euo pipefail` | Pattern scan across all `.sh` files; CI enforcement | `ci-enforced.yml`, `compliance-guard.yml` | Pass |
33
+ | VR-03 | No secrets in source control (gitleaks clean) | Gitleaks scan with `config/gitleaks.toml` ruleset | Pre-commit hook, `security-enhanced.yml` | Pass |
34
+ | VR-04 | Cross-platform compatibility (BSD + GNU) | Dual-platform CI matrix (ubuntu-latest, macos-latest) | `cross-platform-test.yml` | Pass |
35
+ | VR-05 | TLS enforcement (no insecure curl/wget) | Pattern blocking for `curl -k`, `--insecure`, `wget --no-check-certificate` | Pre-commit hook, `compliance-guard.yml` | Pass |
36
+ | VR-06 | Permission controls (no chmod 777/666) | CI pattern scan blocks world-writable permissions | Pre-commit hook, `compliance-guard.yml` | Pass |
37
+ | VR-07 | Signed commits enforced | Pre-push hook verifies `git verify-commit` for all commits in range | `scripts/git-hooks/pre-push`, `compliance-guard.yml` | Pass |
38
+ | VR-08 | Conventional commit format | Pre-commit hook validates `feat:`, `fix:`, `docs:` prefixes | Pre-commit hook (conventional-commits) | Pass |
39
+ | VR-09 | Template rendering correctness | `chezmoi apply --dry-run` on Linux and macOS CI runners | `ci.yml` (Linux + macOS matrix), `tests/unit/test_*.sh` | Pass |
40
+ | VR-10 | Alias system functional | Unit tests source alias files and verify command availability | `tests/unit/aliases/test_*.sh` (104 files) | Pass |
41
+ | VR-11 | Neovim config loads without errors | Headless Neovim launch with error detection | `tests/unit/neovim/test_*.sh` (15 files) | Pass |
42
+ | VR-12 | Fish/Zsh/Nushell configs valid | Syntax validation and functional tests per shell | `tests/unit/fish/` (33), `tests/unit/shell/` (12), `tests/unit/nushell/` (5) | Pass |
43
+ | VR-13 | CI pipelines execute successfully | GitHub Actions workflow status across all triggers | `ci.yml`, `ci-enforced.yml`, `compliance-guard.yml`, `cross-platform-test.yml`, `security-enhanced.yml`, `codeql.yml` | Pass |
44
+ | VR-14 | Pre-commit hooks functional | Hook execution via `pre-commit run --all-files` | `config/pre-commit-config.yaml` | Pass |
45
+ | VR-15 | Age encryption operational | Chezmoi age-encrypted file decryption during apply | `chezmoi apply --dry-run` (encrypted targets), integration tests | Pass |
46
+
47
+ ---
48
+
49
+ ## Validation Summary
50
+
51
+ ### Coverage Metrics
52
+
53
+ | Metric | Value | Threshold | Status |
54
+ |--------|-------|-----------|--------|
55
+ | Total test files | 430 | N/A | Measured |
56
+ | Total assertions | 2,217 | N/A | Measured |
57
+ | Pass rate | 100% | 100% | Pass |
58
+ | Module coverage | 100% | >= 95% | Pass |
59
+
60
+ ### Category Breakdown
61
+
62
+ | Category | Test Files | Status |
63
+ |----------|-----------|--------|
64
+ | Alias files | 104 | Tested |
65
+ | Function files | 76 | Tested |
66
+ | Fish functions + conf.d | 33 | Tested |
67
+ | Misc / compliance | 34 | Tested |
68
+ | Dot CLI | 30 | Tested |
69
+ | Diagnostics | 28 | Tested |
70
+ | Shell configs | 20 | Tested |
71
+ | Ops | 18 | Tested |
72
+ | Install | 17 | Tested |
73
+ | Security | 16 | Tested |
74
+ | Neovim Lua configs | 15 | Tested |
75
+ | Theme | 11 | Tested |
76
+ | Tools | 7 | Tested |
77
+ | Nushell configs | 6 | Tested |
78
+ | Secrets | 5 | Tested |
79
+ | Integration tests | 10 | Tested |
80
+ | **Total** | **430** | **All pass** |
81
+
82
+ ### Validation Environments
83
+
84
+ | Environment | OS | Shell | Bash Version | Status |
85
+ |-------------|-----|-------|--------------|--------|
86
+ | CI (Linux) | Ubuntu latest | Bash | 5.x | Validated |
87
+ | CI (macOS) | macOS latest | Zsh | 3.2 (system) | Validated |
88
+ | Local (Linux) | CachyOS / Arch | Fish, Zsh, Bash | 5.x | Validated |
89
+ | Local (WSL) | Ubuntu | Bash | 5.x | Validated |
90
+
91
+ ---
92
+
93
+ ## Test Framework Architecture
94
+
95
+ ### Directory Structure
96
+
97
+ ```
98
+ tests/
99
+ ├── framework/
100
+ │ ├── test_runner.sh # Test executor — discovers and runs all test_*.sh files
101
+ │ ├── assertions.sh # 16 assertion functions (assert_equals, assert_contains, etc.)
102
+ │ └── mocks.sh # Mock utilities for isolating external dependencies
103
+ ├── unit/
104
+ │ ├── aliases/ # Alias and command-surface tests
105
+ │ ├── functions/ # Function behavior tests
106
+ │ ├── dot-cli/ # `dot` command workflow tests
107
+ │ ├── shell/ # Shell integration and completion tests
108
+ │ ├── fish/ # Fish function and completion tests
109
+ │ ├── nushell/ # Nushell configuration tests
110
+ │ ├── nvim/ # Neovim configuration tests
111
+ │ └── test_*.sh # 425 unit test files total
112
+ ├── integration/
113
+ │ └── test_*.sh # 11 integration test files
114
+ └── performance/
115
+ └── benchmark_runner.sh # Performance regression benchmarks
116
+ ```
117
+
118
+ ### Execution Model
119
+
120
+ 1. `test_runner.sh` recursively discovers all `test_*.sh` files under `tests/`.
121
+ 2. Each test file is executed in a subshell with `assertions.sh` sourced.
122
+ 3. Tests source bash files directly from the repository (not Go templates).
123
+ 4. `mocks.sh` provides stubs for external tools (`chezmoi`, `git`, `brew`, etc.).
124
+ 5. Exit codes and assertion counts are aggregated into a final report.
125
+
126
+ ### Assertion Library
127
+
128
+ | Function | Purpose |
129
+ |----------|---------|
130
+ | `assert_equals` | Exact string equality |
131
+ | `assert_not_equals` | String inequality |
132
+ | `assert_contains` | Substring match |
133
+ | `assert_not_contains` | Substring absence |
134
+ | `assert_starts_with` | Prefix match |
135
+ | `assert_ends_with` | Suffix match |
136
+ | `assert_matches` | Regex match |
137
+ | `assert_file_exists` | File presence |
138
+ | `assert_file_not_exists` | File absence |
139
+ | `assert_directory_exists` | Directory presence |
140
+ | `assert_command_exists` | Command availability |
141
+ | `assert_exit_code` | Process exit code |
142
+ | `assert_empty` | Empty string |
143
+ | `assert_not_empty` | Non-empty string |
144
+ | `assert_true` | Boolean truth |
145
+ | `assert_false` | Boolean false |
146
+
147
+ ---
148
+
149
+ ## Traceability Matrix
150
+
151
+ This matrix maps compliance controls from COMPLIANCE.md to verification requirements defined in this document.
152
+
153
+ ### SOC 2 Type II Traceability
154
+
155
+ | SOC 2 Control | Description | Verification Requirement(s) |
156
+ |---------------|-------------|----------------------------|
157
+ | CC6.1 | Logical Access Security | VR-06 (Permission controls), VR-15 (Age encryption) |
158
+ | CC6.8 | Unauthorized Code Protection | VR-07 (Signed commits), VR-03 (No secrets) |
159
+ | CC7.1 | System Operations | VR-05 (TLS enforcement), VR-13 (CI pipelines) |
160
+ | CC7.2 | Change Detection | VR-14 (Pre-commit hooks), VR-08 (Conventional commits) |
161
+ | CC8.1 | Change Management | VR-07 (Signed commits), VR-08 (Conventional commits), VR-13 (CI pipelines) |
162
+ | A1.2 | Audit Logs | VR-13 (CI pipelines — logs retained in GitHub Actions) |
163
+
164
+ ### ISO 27001 Traceability
165
+
166
+ | ISO Control | Description | Verification Requirement(s) |
167
+ |-------------|-------------|----------------------------|
168
+ | A.9.1.1 | Access Control Policy | VR-06 (Permission controls), VR-15 (Age encryption) |
169
+ | A.9.4.1 | Information Access Restriction | VR-06 (No chmod 777/666) |
170
+ | A.12.1.2 | Change Management | VR-07 (Signed commits), VR-08 (Conventional commits) |
171
+ | A.12.6.1 | Technical Vulnerability Management | VR-03 (Gitleaks), VR-05 (TLS enforcement) |
172
+ | A.13.1.1 | Network Controls | VR-05 (TLS enforcement) |
173
+ | A.14.2.5 | Secure Engineering | VR-01 (ShellCheck), VR-02 (set -euo pipefail), VR-04 (Cross-platform) |
174
+ | A.14.2.8 | System Security Testing | VR-09 (Template rendering), VR-10 (Aliases), VR-11 (Neovim), VR-12 (Shell configs) |
175
+
176
+ ### GDPR / Privacy Traceability
177
+
178
+ | Requirement | Description | Verification Requirement(s) |
179
+ |-------------|-------------|----------------------------|
180
+ | Data Minimization | Limit data collection | VR-03 (No secrets in source) |
181
+ | Integrity | Protect against tampering | VR-07 (Signed commits), VR-14 (Pre-commit hooks) |
182
+ | Encryption | Protect data at rest | VR-15 (Age encryption operational) |
183
+
184
+ ---
185
+
186
+ ## Acceptance Criteria
187
+
188
+ All of the following criteria must be satisfied for this V&V report to remain valid.
189
+
190
+ | Criterion | Verification Method | Required Outcome |
191
+ |-----------|---------------------|------------------|
192
+ | All unit and integration tests pass | `./tests/framework/test_runner.sh` | Exit code 0, 0 failures |
193
+ | ShellCheck clean | `shellcheck --severity=error` on all `.sh` files | Zero findings |
194
+ | Gitleaks clean | `gitleaks detect --config config/gitleaks.toml` | Zero findings |
195
+ | Chezmoi dry-run clean | `chezmoi apply --dry-run` on Linux and macOS | Exit code 0, no errors |
196
+ | Pre-commit hooks pass | `pre-commit run --all-files` | Exit code 0 |
197
+ | Cross-platform CI green | `cross-platform-test.yml` on ubuntu-latest and macos-latest | All jobs pass |
198
+ | Module coverage at threshold | Test runner coverage report | >= 95% (currently 100%) |
199
+ | No world-writable permissions | `compliance-guard.yml` pattern scan | Zero `chmod 777` or `chmod 666` matches |
200
+ | No insecure TLS patterns | `compliance-guard.yml` pattern scan | Zero `curl -k` or `wget --no-check-certificate` matches |
201
+ | All commits signed | `git verify-commit` on HEAD~50..HEAD range | All commits verified |
202
+
203
+ ---
204
+
205
+ ## Sign-off
206
+
207
+ | Role | Name | Date | Signature |
208
+ |------|------|------|-----------|
209
+ | Repository Owner | | | |
210
+ | Security Reviewer | | | |
211
+ | Quality Assurance | | | |
212
+ | Release Manager | | | |
213
+
214
+ ---
215
+
216
+ ## References
217
+
218
+ - [ISO 13485:2016](https://www.iso.org/standard/59752.html) — Medical devices, Quality management systems
219
+ - [ISO 27001:2022](https://www.iso.org/standard/27001) — Information security management
220
+ - [SOC 2 Type II](https://www.aicpa.org/soc2) — Trust Services Criteria
221
+ - [SLSA Framework](https://slsa.dev/) — Supply chain Levels for Software Artifacts
222
+ - [ShellCheck](https://www.shellcheck.net/) — Static analysis for shell scripts
223
+ - [Gitleaks](https://gitleaks.io/) — Secrets detection
224
+ - [Chezmoi](https://www.chezmoi.io/) — Dotfiles manager