@sebastienrousseau/dotfiles 0.2.499 → 0.2.501

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (567) hide show
  1. package/CHANGELOG.md +452 -0
  2. package/LICENSE +1283 -0
  3. package/README.md +322 -0
  4. package/docs/.vitepress/reports/localization-readability-audit.md +73 -0
  5. package/docs/AI.md +108 -0
  6. package/docs/CNAME +1 -0
  7. package/docs/COPYRIGHT +4 -3
  8. package/docs/NAMING_CONVENTIONS.md +102 -0
  9. package/docs/README.md +82 -0
  10. package/docs/_config.yml +59 -0
  11. package/docs/adr/ADR-001-ci-cd-pipeline.md +118 -0
  12. package/docs/adr/ADR-002-shell-performance.md +130 -0
  13. package/docs/adr/ADR-003-security-first.md +158 -0
  14. package/docs/adr/ADR-004-cli-architecture.md +171 -0
  15. package/docs/adr/ADR-005-chezmoi-choice.md +99 -0
  16. package/docs/adr/ADR-006-shell-selection.md +124 -0
  17. package/docs/adr/ADR-007-multi-shell-parity.md +62 -0
  18. package/docs/adr/ADR-008-alias-system-architecture.md +95 -0
  19. package/docs/adr/ADR-009-wallpaper-driven-theming.md +131 -0
  20. package/docs/adr/ADR-010-starship-transient-prompt.md +144 -0
  21. package/docs/adr/ADR-011-nushell-tier3-keep.md +144 -0
  22. package/docs/adr/README.md +39 -0
  23. package/docs/architecture/ARCHITECTURE.md +117 -0
  24. package/docs/architecture/INTEROP.md +44 -0
  25. package/docs/architecture/REPO_LAYOUT.md +241 -0
  26. package/docs/architecture/WALKTHROUGH.md +86 -0
  27. package/docs/architecture/fleet-deployment.md +77 -0
  28. package/docs/archive/EUXIS_2026_REVIEW.md +127 -0
  29. package/docs/archive/LEGACY_ROADMAP.md +160 -0
  30. package/docs/archive/MILESTONE_v0.2.493.md +47 -0
  31. package/docs/{PLAN.md → archive/PLAN.md} +50 -12
  32. package/docs/archive/REPO_AUDIT.md +31 -0
  33. package/docs/guides/INSTALL.md +144 -0
  34. package/docs/guides/NEOVIM_IDE_GUIDE.md +61 -0
  35. package/docs/guides/THEMING.md +230 -0
  36. package/docs/guides/TROUBLESHOOTING.md +176 -0
  37. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +792 -0
  38. package/docs/index.md +43 -0
  39. package/docs/interop/A2A.md +39 -0
  40. package/docs/interop/POWERSHELL.md +102 -0
  41. package/docs/manual/00-introduction.md +89 -0
  42. package/docs/manual/01-concepts/01-architecture.md +138 -0
  43. package/docs/manual/01-concepts/02-trust-model.md +182 -0
  44. package/docs/manual/01-concepts/03-theme-engine.md +186 -0
  45. package/docs/manual/01-concepts/04-fleet.md +148 -0
  46. package/docs/manual/01-concepts/05-self-healing.md +204 -0
  47. package/docs/manual/02-tutorials/01-first-install.md +197 -0
  48. package/docs/manual/02-tutorials/02-add-wallpaper.md +216 -0
  49. package/docs/manual/02-tutorials/03-create-profile.md +244 -0
  50. package/docs/manual/02-tutorials/04-encrypt-secret.md +281 -0
  51. package/docs/manual/02-tutorials/05-deploy-fleet.md +283 -0
  52. package/docs/manual/03-reference/01-dot-cli.md +417 -0
  53. package/docs/manual/03-reference/02-config-files.md +265 -0
  54. package/docs/manual/03-reference/03-environment.md +124 -0
  55. package/docs/manual/03-reference/04-templates.md +190 -0
  56. package/docs/manual/03-reference/05-feature-flags.md +128 -0
  57. package/docs/manual/04-cookbook/01-recipes.md +285 -0
  58. package/docs/manual/04-cookbook/02-troubleshooting.md +351 -0
  59. package/docs/manual/04-cookbook/03-faq.md +175 -0
  60. package/docs/manual/05-appendices/A-platform-matrix.md +101 -0
  61. package/docs/manual/05-appendices/B-security-checklist.md +84 -0
  62. package/docs/manual/05-appendices/C-glossary.md +40 -0
  63. package/docs/manual/05-appendices/D-bibliography.md +58 -0
  64. package/docs/manual/05-appendices/E-license.md +38 -0
  65. package/docs/manual/_toc.yml +58 -0
  66. package/docs/manual/command-index.md +62 -0
  67. package/docs/manual/concept-index.md +168 -0
  68. package/docs/operations/ATTESTATION.md +44 -0
  69. package/docs/operations/CI_CADENCE.md +107 -0
  70. package/docs/operations/CI_COMPOSITES.md +156 -0
  71. package/docs/operations/COMPLETIONS.md +123 -0
  72. package/docs/operations/COVERAGE.md +148 -0
  73. package/docs/operations/DRIFT.md +107 -0
  74. package/docs/operations/MAINTENANCE.md +63 -0
  75. package/docs/operations/MIGRATION.md +109 -0
  76. package/docs/operations/OPERATIONS.md +188 -0
  77. package/docs/operations/PERFORMANCE.md +133 -0
  78. package/docs/operations/RELIABILITY.md +122 -0
  79. package/docs/{ROADMAP.md → operations/ROADMAP.md} +57 -39
  80. package/docs/operations/TESTING.md +199 -0
  81. package/docs/operations/TRACEABILITY.md +35 -0
  82. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +65 -0
  83. package/docs/operations/VERSION_SYNC.md +393 -0
  84. package/docs/reference/ALIASES.md +131 -0
  85. package/docs/reference/ALIASES_CHEATSHEET.md +32 -0
  86. package/docs/reference/ALIASES_DEPRECATIONS.md +13 -0
  87. package/docs/reference/FEATURES.md +66 -0
  88. package/docs/reference/FONTS.md +112 -0
  89. package/docs/reference/PROFILES.md +69 -0
  90. package/docs/reference/SCREENSHOTS.md +121 -0
  91. package/docs/reference/SCRIPTS.md +71 -0
  92. package/docs/reference/SUPPORT_MATRIX.md +80 -0
  93. package/docs/reference/THEMES.md +117 -0
  94. package/docs/reference/TOOLS.md +109 -0
  95. package/docs/reference/UTILS.md +155 -0
  96. package/docs/security/AI_ACT_COMPLIANCE.md +94 -0
  97. package/docs/security/AUDIT_BYPASS.md +103 -0
  98. package/docs/security/AUTOMATION_SECRETS.md +26 -0
  99. package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
  100. package/docs/security/COMPLIANCE.md +458 -0
  101. package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
  102. package/docs/security/ENCRYPTION.md +57 -0
  103. package/docs/security/FMEA.md +159 -0
  104. package/docs/security/HISTORY_FILTERING.md +132 -0
  105. package/docs/security/INCIDENT_RESPONSE.md +579 -0
  106. package/docs/security/INSTALL_VERIFICATION.md +122 -0
  107. package/docs/security/KEYS.md +49 -0
  108. package/docs/security/KEY_ROTATION.md +223 -0
  109. package/docs/security/MCP_POLICY.md +78 -0
  110. package/docs/security/POLICY_RELEASES.md +37 -0
  111. package/docs/security/README.md +28 -0
  112. package/docs/security/SCORECARD.md +80 -0
  113. package/docs/security/SECRETS.md +158 -0
  114. package/docs/security/SECURITY.md +45 -0
  115. package/docs/security/SECURITY_CHECKLIST.md +55 -0
  116. package/docs/security/SHELL_EXEMPTIONS.md +145 -0
  117. package/docs/security/SOUP_REGISTER.md +36 -0
  118. package/docs/security/THREAT_MODEL.md +130 -0
  119. package/docs/security/VERIFICATION_VALIDATION.md +228 -0
  120. package/docs/themes/README.md +10 -0
  121. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +30 -0
  122. package/docs/themes/hero-shot.svg +78 -0
  123. package/dot_config/.module-manifest.json +69 -0
  124. package/dot_config/ai/identity.md +23 -0
  125. package/dot_config/ai/patterns/architect.md +16 -0
  126. package/dot_config/ai/patterns/hardener.md +15 -0
  127. package/dot_config/ai/patterns/refactor.md +15 -0
  128. package/dot_config/aider/aider.conf.yml +32 -0
  129. package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
  130. package/dot_config/ansible/ansible.cfg +11 -0
  131. package/dot_config/atuin/config.toml.tmpl +47 -0
  132. package/dot_config/bat/config +23 -0
  133. package/dot_config/brave-flags.conf.tmpl +7 -0
  134. package/dot_config/btop/btop.conf +16 -0
  135. package/dot_config/btop/themes/tokyonight.theme +34 -0
  136. package/dot_config/bun/bunfig.toml.tmpl +33 -0
  137. package/dot_config/claude/mcp_servers.json +20 -0
  138. package/dot_config/containers/containers.conf +14 -0
  139. package/dot_config/curl/dot_curlrc +18 -0
  140. package/dot_config/dlv/config.yml +39 -0
  141. package/dot_config/docker/config.json +15 -0
  142. package/dot_config/dotfiles/agent-card.json +29 -0
  143. package/dot_config/dotfiles/agent-profiles.json +92 -0
  144. package/dot_config/dotfiles/boot/README.md +13 -0
  145. package/dot_config/dotfiles/grub/README.md +13 -0
  146. package/dot_config/dotfiles/lock/README.md +13 -0
  147. package/dot_config/dotfiles/mcp-lock.json +33 -0
  148. package/dot_config/dotfiles/mcp-policy.json +52 -0
  149. package/dot_config/dotfiles/mcp-registry.json +47 -0
  150. package/dot_config/dotfiles/model-registry.json +20 -0
  151. package/dot_config/dotfiles/policy-bundles.json +38 -0
  152. package/dot_config/dotfiles/prompt-registry.json +16 -0
  153. package/dot_config/dotfiles/versions.env +18 -0
  154. package/dot_config/duf/duf.conf +6 -0
  155. package/dot_config/duti/defaults.duti +5 -0
  156. package/dot_config/emoji/emoji.txt +34 -0
  157. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  158. package/dot_config/environment.d/90-wayland.conf +19 -0
  159. package/dot_config/fastfetch/config.jsonc +28 -0
  160. package/dot_config/firefox/user.js.tmpl +58 -0
  161. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  162. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  163. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  164. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  165. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  166. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  167. package/dot_config/fish/conf.d/init.fish.tmpl +172 -0
  168. package/dot_config/fish/config.fish.tmpl +44 -0
  169. package/dot_config/fish/fish_plugins +1 -0
  170. package/dot_config/fish/functions/_.fish +3 -0
  171. package/dot_config/fish/functions/_cached_eval.fish +131 -0
  172. package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
  173. package/dot_config/fish/functions/als.fish +46 -0
  174. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  175. package/dot_config/fish/functions/c.fish +3 -0
  176. package/dot_config/fish/functions/cat.fish +9 -0
  177. package/dot_config/fish/functions/d.fish +7 -0
  178. package/dot_config/fish/functions/dot.fish +34 -0
  179. package/dot_config/fish/functions/h.fish +3 -0
  180. package/dot_config/fish/functions/l.fish +7 -0
  181. package/dot_config/fish/functions/la.fish +7 -0
  182. package/dot_config/fish/functions/ll.fish +7 -0
  183. package/dot_config/fish/functions/log_error.fish +13 -0
  184. package/dot_config/fish/functions/log_info.fish +13 -0
  185. package/dot_config/fish/functions/lr.fish +7 -0
  186. package/dot_config/fish/functions/lra.fish +7 -0
  187. package/dot_config/fish/functions/ls.fish +7 -0
  188. package/dot_config/fish/functions/lt.fish +7 -0
  189. package/dot_config/fish/functions/lta.fish +7 -0
  190. package/dot_config/fish/functions/notify-run.fish +11 -0
  191. package/dot_config/fish/functions/q.fish +3 -0
  192. package/dot_config/fish/functions/silent-run.fish +7 -0
  193. package/dot_config/fish/functions/yy.fish +8 -0
  194. package/dot_config/flatpak/flatpak.list +4 -0
  195. package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
  196. package/dot_config/foot/foot.ini.tmpl +33 -0
  197. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  198. package/dot_config/fzf/fzf.zsh +48 -0
  199. package/dot_config/gem/gemrc +9 -0
  200. package/dot_config/gh/config.yml +12 -0
  201. package/dot_config/ghostty/config.tmpl +165 -0
  202. package/dot_config/git/allowed_signers.tmpl +18 -0
  203. package/dot_config/git/attributes +12 -0
  204. package/dot_config/git/commit-template +10 -0
  205. package/dot_config/git/hooks/executable_commit-msg +146 -0
  206. package/dot_config/git/ignore +27 -0
  207. package/dot_config/gnupg/gpg-agent.conf +11 -0
  208. package/dot_config/go/golangci.yml +118 -0
  209. package/dot_config/go/gopls.json +30 -0
  210. package/dot_config/goose/config.yaml +29 -0
  211. package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
  212. package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
  213. package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
  214. package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
  215. package/dot_config/htop/htoprc +20 -0
  216. package/dot_config/inputrc +2 -0
  217. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  218. package/dot_config/just/justfile +122 -0
  219. package/dot_config/k9s/config.yaml +65 -0
  220. package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
  221. package/dot_config/kanshi/config.tmpl +22 -0
  222. package/dot_config/karabiner/karabiner.json +14 -0
  223. package/dot_config/kitty/kitty.conf.tmpl +53 -0
  224. package/dot_config/lazydocker/config.yml +186 -0
  225. package/dot_config/lazygit/config.yml +35 -0
  226. package/dot_config/mako/config +47 -0
  227. package/dot_config/mas/masapps.txt +5 -0
  228. package/dot_config/micro/settings.json +3 -0
  229. package/dot_config/mimeapps.list +77 -0
  230. package/dot_config/minikube/config.json +13 -0
  231. package/dot_config/mise/config.toml +99 -0
  232. package/dot_config/mongosh/mongoshrc.js +68 -0
  233. package/dot_config/mpv/input.conf +47 -0
  234. package/dot_config/mpv/mpv.conf +47 -0
  235. package/dot_config/mycli/myclirc +67 -0
  236. package/dot_config/nano/nanorc +28 -0
  237. package/dot_config/ncdu/config +12 -0
  238. package/dot_config/niri/config.kdl.tmpl +327 -0
  239. package/dot_config/nushell/aliases.nu +18 -0
  240. package/dot_config/nushell/cached_eval.nu +80 -0
  241. package/dot_config/nushell/completions.nu.tmpl +52 -0
  242. package/dot_config/nushell/config.nu.tmpl +86 -0
  243. package/dot_config/nushell/env.nu.tmpl +102 -0
  244. package/dot_config/nushell/functions.nu.tmpl +17 -0
  245. package/dot_config/nvim/init.lua +18 -0
  246. package/dot_config/nvim/lazy-lock.json +58 -0
  247. package/dot_config/nvim/lua/config/autocmds.lua +107 -0
  248. package/dot_config/nvim/lua/config/keymaps.lua +92 -0
  249. package/dot_config/nvim/lua/config/lazy.lua +44 -0
  250. package/dot_config/nvim/lua/config/options.lua +49 -0
  251. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  252. package/dot_config/nvim/lua/plugins/coding.lua +216 -0
  253. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  254. package/dot_config/nvim/lua/plugins/dap.lua +412 -0
  255. package/dot_config/nvim/lua/plugins/editor.lua +55 -0
  256. package/dot_config/nvim/lua/plugins/git.lua +10 -0
  257. package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
  258. package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
  259. package/dot_config/nvim/lua/plugins/rust.lua +34 -0
  260. package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
  261. package/dot_config/nvim/lua/plugins/ui.lua +509 -0
  262. package/dot_config/paru/paru.conf +10 -0
  263. package/dot_config/pip/pip.conf.tmpl +32 -0
  264. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  265. package/dot_config/pueue/pueue.yml +34 -0
  266. package/dot_config/pypoetry/config.toml +6 -0
  267. package/dot_config/pyrightconfig.json +5 -0
  268. package/dot_config/raycast/README.md +13 -0
  269. package/dot_config/redis/redisclirc +41 -0
  270. package/dot_config/ripgrep/ripgreprc +21 -0
  271. package/dot_config/shell/00-core-paths.sh.tmpl +134 -0
  272. package/dot_config/shell/05-core-safety.sh +48 -0
  273. package/dot_config/shell/10-secrets.sh +41 -0
  274. package/dot_config/shell/40-fzf-defaults.sh.tmpl +17 -0
  275. package/dot_config/shell/40-ls-colors.sh +49 -0
  276. package/dot_config/shell/50-logic-functions-core.sh.tmpl +11 -0
  277. package/dot_config/shell/50-logic-functions.sh.tmpl +11 -0
  278. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +65 -0
  279. package/dot_config/shell/90-ux-aliases.sh.tmpl +121 -0
  280. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +55 -0
  281. package/dot_config/shell/Brewfile +207 -0
  282. package/dot_config/shell/Brewfile.cask +92 -0
  283. package/dot_config/shell/Brewfile.cli +127 -0
  284. package/dot_config/shell/README.md +284 -0
  285. package/dot_config/shell/als_data.txt.tmpl +65 -0
  286. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  287. package/dot_config/shell/custom/context_suggest.zsh +68 -0
  288. package/dot_config/shell/custom/error_analysis.zsh +45 -0
  289. package/dot_config/sops/dot_sops.yaml +23 -0
  290. package/dot_config/starship.toml.tmpl +202 -0
  291. package/dot_config/swaylock/config +43 -0
  292. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  293. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  294. package/dot_config/systemd/user/pueued.service +12 -0
  295. package/dot_config/systemd/user/ssh-agent.service +12 -0
  296. package/dot_config/task/Taskfile.yml +86 -0
  297. package/dot_config/tflint/tflint.hcl +9 -0
  298. package/dot_config/tmux/tmux.conf.tmpl +223 -0
  299. package/dot_config/topgrade.toml.tmpl +54 -0
  300. package/dot_config/user-dirs.dirs +10 -0
  301. package/dot_config/vscode/extensions.txt +11 -0
  302. package/dot_config/vscode/settings.json.tmpl +82 -0
  303. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  304. package/dot_config/waybar/style.css.tmpl +211 -0
  305. package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
  306. package/dot_config/wget/wgetrc +12 -0
  307. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  308. package/dot_config/yarn/yarnrc.yml +36 -0
  309. package/dot_config/yazi/keymap.toml +67 -0
  310. package/dot_config/yazi/theme.toml +102 -0
  311. package/dot_config/yazi/yazi.toml +40 -0
  312. package/dot_config/zathura/zathurarc +52 -0
  313. package/dot_config/zellij/config.kdl.tmpl +79 -0
  314. package/dot_config/zsh/dot_zprofile +7 -0
  315. package/dot_config/zsh/dot_zshenv +5 -0
  316. package/dot_config/zsh/dot_zshrc.tmpl +635 -0
  317. package/dot_config/zsh/rc.d/00-alias-shims.zsh +99 -0
  318. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
  319. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
  320. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  321. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +214 -0
  322. package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
  323. package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
  324. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  325. package/dot_local/bin/executable_ai-update +195 -0
  326. package/dot_local/bin/executable_ai_core +152 -0
  327. package/dot_local/bin/executable_antigravity +11 -0
  328. package/dot_local/bin/executable_b64 +84 -0
  329. package/dot_local/bin/executable_bm +79 -0
  330. package/dot_local/bin/executable_cb +39 -0
  331. package/dot_local/bin/executable_dot +596 -0
  332. package/dot_local/bin/executable_dot-ai +36 -0
  333. package/dot_local/bin/executable_dot-bootstrap +77 -0
  334. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  335. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  336. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  337. package/dot_local/bin/executable_dot-theme-sync +952 -0
  338. package/dot_local/bin/executable_dot_completion +57 -0
  339. package/dot_local/bin/executable_dtags +28 -0
  340. package/dot_local/bin/executable_epoch +67 -0
  341. package/dot_local/bin/executable_extract +41 -0
  342. package/dot_local/bin/executable_gbd +52 -0
  343. package/dot_local/bin/executable_gd +42 -0
  344. package/dot_local/bin/executable_git-ai-commit +175 -0
  345. package/dot_local/bin/executable_git-ai-diff +169 -0
  346. package/dot_local/bin/executable_gl +101 -0
  347. package/dot_local/bin/executable_hash +161 -0
  348. package/dot_local/bin/executable_hashsum +160 -0
  349. package/dot_local/bin/executable_hex +115 -0
  350. package/dot_local/bin/executable_jsonv +78 -0
  351. package/dot_local/bin/executable_jwt +94 -0
  352. package/dot_local/bin/executable_kill-port +75 -0
  353. package/dot_local/bin/executable_lorem +118 -0
  354. package/dot_local/bin/executable_mkscript +35 -0
  355. package/dot_local/bin/executable_monitor +56 -0
  356. package/dot_local/bin/executable_myip +51 -0
  357. package/dot_local/bin/executable_notify +24 -0
  358. package/dot_local/bin/executable_open +38 -0
  359. package/dot_local/bin/executable_pw +27 -0
  360. package/dot_local/bin/executable_rec-start +46 -0
  361. package/dot_local/bin/executable_rec-stop +35 -0
  362. package/dot_local/bin/executable_regex +132 -0
  363. package/dot_local/bin/executable_start-niri +8 -0
  364. package/dot_local/bin/executable_tmux-sessionizer +314 -0
  365. package/dot_local/bin/executable_tour +177 -0
  366. package/dot_local/bin/executable_up +23 -0
  367. package/dot_local/bin/executable_update +142 -0
  368. package/dot_local/bin/executable_uuid +87 -0
  369. package/dot_local/bin/executable_win +32 -0
  370. package/dot_local/bin/executable_yamlv +57 -0
  371. package/dot_local/share/bash-completion/completions/dot +72 -0
  372. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  373. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  374. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  375. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  376. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  377. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  378. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  379. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  380. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  381. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  382. package/dot_local/share/man/man1/dot.1 +149 -0
  383. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  384. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  385. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  386. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  387. package/dot_local/share/zsh/completions/.keep +0 -0
  388. package/dot_local/share/zsh/completions/_dot +283 -0
  389. package/install.sh +350 -0
  390. package/package.json +1 -1
  391. package/scripts/ci/check-copyright-headers.sh +96 -0
  392. package/scripts/ci/check-dangerous-chmod.sh +19 -0
  393. package/scripts/ci/check-deps-dev.sh +236 -0
  394. package/scripts/ci/check-insecure-tls.sh +61 -0
  395. package/scripts/ci/check-regression-traceability.sh +67 -0
  396. package/scripts/ci/check-shell-preamble.sh +106 -0
  397. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  398. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  399. package/scripts/ci/run-coverage.sh +362 -0
  400. package/scripts/ci/validate-chezmoidata.sh +25 -0
  401. package/scripts/ci/validate-ci-config.sh +224 -0
  402. package/scripts/demo/record.sh +42 -0
  403. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  404. package/scripts/diagnostics/alias-governance.sh +137 -0
  405. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  406. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  407. package/scripts/diagnostics/benchmark.sh +381 -0
  408. package/scripts/diagnostics/conflicts.sh +72 -0
  409. package/scripts/diagnostics/doctor-unified.sh +38 -0
  410. package/scripts/diagnostics/doctor.sh +709 -0
  411. package/scripts/diagnostics/drift-dashboard.sh +201 -0
  412. package/scripts/diagnostics/health.sh +614 -0
  413. package/scripts/diagnostics/history-analysis.sh +85 -0
  414. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  415. package/scripts/diagnostics/perf.sh +452 -0
  416. package/scripts/diagnostics/scorecard.sh +118 -0
  417. package/scripts/diagnostics/secret-governance.sh +58 -0
  418. package/scripts/diagnostics/security-score.sh +438 -0
  419. package/scripts/diagnostics/smoke-test.sh +87 -0
  420. package/scripts/diagnostics/snapshot.sh +89 -0
  421. package/scripts/diagnostics/verify.sh +107 -0
  422. package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
  423. package/scripts/diagnostics/version-locks.sh +79 -0
  424. package/scripts/diagnostics/workstation-attestation.sh +186 -0
  425. package/scripts/docs/build-manual.sh +883 -0
  426. package/scripts/docs/check-manual.sh +213 -0
  427. package/scripts/dot/commands/agent.sh +474 -0
  428. package/scripts/dot/commands/ai.sh +481 -0
  429. package/scripts/dot/commands/aliases.sh +250 -0
  430. package/scripts/dot/commands/appearance.sh +80 -0
  431. package/scripts/dot/commands/core.sh +185 -0
  432. package/scripts/dot/commands/diagnostics.sh +229 -0
  433. package/scripts/dot/commands/fleet.sh +399 -0
  434. package/scripts/dot/commands/lint.sh +177 -0
  435. package/scripts/dot/commands/manual.sh +168 -0
  436. package/scripts/dot/commands/meta.sh +248 -0
  437. package/scripts/dot/commands/patterns.sh +54 -0
  438. package/scripts/dot/commands/restore.sh +231 -0
  439. package/scripts/dot/commands/secrets.sh +223 -0
  440. package/scripts/dot/commands/security.sh +76 -0
  441. package/scripts/dot/commands/tools.sh +469 -0
  442. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  443. package/scripts/dot/lib/bento.sh +50 -0
  444. package/scripts/dot/lib/log.sh +200 -0
  445. package/scripts/dot/lib/platform.sh +99 -0
  446. package/scripts/dot/lib/ui.sh +518 -0
  447. package/scripts/dot/lib/utils.sh +377 -0
  448. package/scripts/fonts/install-nerd-fonts.sh +68 -0
  449. package/scripts/fonts/patch-fonts.sh +35 -0
  450. package/scripts/git-hooks/install.sh +11 -0
  451. package/scripts/git-hooks/pre-commit +12 -0
  452. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  453. package/scripts/git-hooks/pre-push +92 -0
  454. package/scripts/git-hooks/prepare-commit-msg +29 -0
  455. package/scripts/lib/secrets_provider.sh +158 -0
  456. package/scripts/maintenance/check-updates.sh +131 -0
  457. package/scripts/ops/ai-setup.sh +55 -0
  458. package/scripts/ops/bundle.sh +77 -0
  459. package/scripts/ops/chaos.sh +49 -0
  460. package/scripts/ops/chezmoi-apply.sh +270 -0
  461. package/scripts/ops/chezmoi-diff.sh +15 -0
  462. package/scripts/ops/chezmoi-remove.sh +45 -0
  463. package/scripts/ops/chezmoi-update.sh +48 -0
  464. package/scripts/ops/heal-chezmoi.sh +86 -0
  465. package/scripts/ops/heal-system.sh +128 -0
  466. package/scripts/ops/heal-tools.sh +340 -0
  467. package/scripts/ops/heal.sh +222 -0
  468. package/scripts/ops/post-apply-repair.sh +106 -0
  469. package/scripts/ops/prewarm.sh +127 -0
  470. package/scripts/ops/release.sh +252 -0
  471. package/scripts/ops/rollback.sh +589 -0
  472. package/scripts/ops/setup.sh +137 -0
  473. package/scripts/ops/teleport.sh +33 -0
  474. package/scripts/qa/coverage-baseline.sh +60 -0
  475. package/scripts/qa/docs-coverage.sh +111 -0
  476. package/scripts/qa/powershell-contract.ps1 +95 -0
  477. package/scripts/qa/reliability-audit.sh +138 -0
  478. package/scripts/qa/traceability-coverage.sh +116 -0
  479. package/scripts/qa/validate-examples.sh +26 -0
  480. package/scripts/qa/wsl-contract.sh +11 -0
  481. package/scripts/release/package-policy-bundles.sh +125 -0
  482. package/scripts/secrets/age-init.sh +70 -0
  483. package/scripts/secrets/create-secrets-file.sh +45 -0
  484. package/scripts/secrets/encrypt-ssh-key.sh +43 -0
  485. package/scripts/security/backup.sh +57 -0
  486. package/scripts/security/dns-doh.sh +51 -0
  487. package/scripts/security/encryption-check.sh +54 -0
  488. package/scripts/security/enforce-policies.sh +334 -0
  489. package/scripts/security/firewall.sh +90 -0
  490. package/scripts/security/lock-configs.sh +57 -0
  491. package/scripts/security/lock-screen.sh +55 -0
  492. package/scripts/security/manage-secrets.sh +428 -0
  493. package/scripts/security/ssh-cert.sh +203 -0
  494. package/scripts/security/telemetry-kill.sh +50 -0
  495. package/scripts/security/usb-safety.sh +51 -0
  496. package/scripts/theme/apply-gnome-theme.sh +328 -0
  497. package/scripts/theme/extract-theme.py +677 -0
  498. package/scripts/theme/install-boot-logo.sh +62 -0
  499. package/scripts/theme/install-catppuccin-themes.sh +370 -0
  500. package/scripts/theme/install-cursors.sh +25 -0
  501. package/scripts/theme/install-file-icons.sh +26 -0
  502. package/scripts/theme/install-grub-theme.sh +61 -0
  503. package/scripts/theme/install-lock-icon.sh +30 -0
  504. package/scripts/theme/merge-wallpaper.sh +145 -0
  505. package/scripts/theme/rebuild-themes.sh +309 -0
  506. package/scripts/theme/switch.sh +431 -0
  507. package/scripts/theme/wallpaper-rotate.sh +136 -0
  508. package/scripts/theme/wallpaper-sync.sh +397 -0
  509. package/scripts/tools/cmatrix.sh +21 -0
  510. package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
  511. package/scripts/tools/emoji-picker.sh +48 -0
  512. package/scripts/tools/figlet-banner.sh +18 -0
  513. package/scripts/tools/log-rotate.sh +30 -0
  514. package/scripts/tools/lolcat-wrap.sh +19 -0
  515. package/scripts/tools/pipes.sh +48 -0
  516. package/scripts/tuning/linux.sh +185 -0
  517. package/scripts/tuning/macos.sh +55 -0
  518. package/scripts/uninstall.sh +85 -0
  519. package/scripts/version-sync.sh +487 -0
  520. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  521. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  522. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  523. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  524. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  525. package/templates/projects/go/README.md +4 -0
  526. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  527. package/templates/projects/go/go.sum +0 -0
  528. package/templates/projects/molecule/README.md +7 -0
  529. package/templates/projects/molecule/converge.yml +7 -0
  530. package/templates/projects/molecule/molecule.yml +16 -0
  531. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  532. package/templates/projects/node/README.md +4 -0
  533. package/templates/projects/node/package-lock.json +12 -0
  534. package/templates/projects/node/src/index.js +1 -0
  535. package/templates/projects/packer/README.md +15 -0
  536. package/templates/projects/packer/main.pkr.hcl +15 -0
  537. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  538. package/templates/projects/python/README.md +4 -0
  539. package/templates/projects/python/pyproject.toml +15 -0
  540. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  541. package/templates/projects/python/tests/test_basic.py +1 -0
  542. package/docs/ARCHITECTURE.md +0 -62
  543. package/docs/COMPLIANCE.md +0 -47
  544. package/docs/OPERATIONS.md +0 -103
  545. package/docs/PR_DESCRIPTION.md +0 -150
  546. package/docs/ROADMAP_legacy.md +0 -556
  547. package/docs/SECURITY_CHECKLIST.md +0 -25
  548. package/docs/TASK.md +0 -99
  549. package/docs/WALKTHROUGH.md +0 -46
  550. package/scripts/backup.sh +0 -142
  551. package/scripts/banner.sh +0 -20
  552. package/scripts/benchmark.sh +0 -20
  553. package/scripts/build.sh +0 -41
  554. package/scripts/clean.sh +0 -31
  555. package/scripts/compile.sh +0 -54
  556. package/scripts/copy.sh +0 -108
  557. package/scripts/doctor.sh +0 -79
  558. package/scripts/dotfiles.sh +0 -63
  559. package/scripts/download.sh +0 -35
  560. package/scripts/help.sh +0 -57
  561. package/scripts/lock-configs.sh +0 -57
  562. package/scripts/package.sh +0 -46
  563. package/scripts/ssh.sh +0 -55
  564. package/scripts/teleport.sh +0 -23
  565. package/scripts/test-aliases.sh +0 -25
  566. package/scripts/test_smoke.sh +0 -88
  567. package/scripts/unpack.sh +0 -28
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ # shellcheck source=../dot/lib/ui.sh
7
+ # shellcheck disable=SC1091
8
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
+ # shellcheck source=../dot/lib/log.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
12
+ export DOT_COMMAND="apply"
13
+
14
+ # Temp file cleanup
15
+ _TMPFILES=()
16
+ cleanup() { rm -f "${_TMPFILES[@]}"; }
17
+ trap cleanup EXIT
18
+
19
+ # Help flag
20
+ case "${1:-}" in
21
+ -h | --help)
22
+ cat <<HELP
23
+ chezmoi-apply.sh - Apply dotfiles with enhanced diagnostics
24
+
25
+ Usage:
26
+ dot apply [OPTIONS] [-- CHEZMOI_ARGS]
27
+
28
+ Environment Variables:
29
+ DOTFILES_CHEZMOI_APPLY_FLAGS Extra flags for chezmoi apply
30
+ DOTFILES_CHEZMOI_VERBOSE=1 Enable verbose output
31
+ DOTFILES_CHEZMOI_KEEP_GOING=1 Continue on errors
32
+ DOTFILES_NONINTERACTIVE=1 Force non-interactive mode
33
+ DOTFILES_ALIAS_STRICT_MODE=1 Run alias governance checks
34
+ DOTFILES_SNAPSHOT_ON_APPLY=1 Create baseline snapshot (default)
35
+ DOTFILES_POST_APPLY_REPAIR=1 Run post-apply repairs (default)
36
+ DOTFILES_CHEZMOI_STATUS=1 Show status after apply (default)
37
+ HELP
38
+ exit 0
39
+ ;;
40
+ esac
41
+
42
+ args=("$@")
43
+ if [[ -n "${DOTFILES_CHEZMOI_APPLY_FLAGS:-}" ]]; then
44
+ # Safely parse space-separated flags into array
45
+ read -ra flag_array <<<"$DOTFILES_CHEZMOI_APPLY_FLAGS"
46
+ args+=("${flag_array[@]}")
47
+ fi
48
+
49
+ if [[ "${DOTFILES_CHEZMOI_VERBOSE:-0}" = "1" ]]; then
50
+ args+=("--verbose")
51
+ fi
52
+
53
+ if [[ "${DOTFILES_CHEZMOI_KEEP_GOING:-0}" = "1" ]]; then
54
+ args+=("--keep-going")
55
+ fi
56
+
57
+ has_flag() {
58
+ local needle="$1"
59
+ local arg
60
+ for arg in "${args[@]}"; do
61
+ [[ "$arg" == "$needle" ]] && return 0
62
+ done
63
+ return 1
64
+ }
65
+
66
+ # In non-interactive runs, prevent TTY prompts from blocking apply.
67
+ if [[ "${DOTFILES_NONINTERACTIVE:-0}" == "1" ]] && ! has_flag "--force"; then
68
+ args+=("--force")
69
+ fi
70
+
71
+ ui_init
72
+
73
+ # Prevent concurrent execution
74
+ LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/dotfiles-chezmoi-apply.lock"
75
+ exec 9>"$LOCK_FILE"
76
+ if ! flock -n 9; then
77
+ ui_warn "Already running" "Another instance is active"
78
+ exit 0
79
+ fi
80
+
81
+ run_step() {
82
+ local title="$1"
83
+ shift
84
+ local out
85
+ out="$(umask 077 && mktemp)"
86
+ _TMPFILES+=("$out")
87
+ if [[ "$UI_ENABLED" = "1" ]]; then
88
+ if gum spin --spinner dot --title "$title" -- "$@" >"$out" 2>&1; then
89
+ ui_ok "$title"
90
+ if [[ "${DOTFILES_CHEZMOI_VERBOSE:-0}" = "1" ]] && [[ -s "$out" ]]; then
91
+ cat "$out"
92
+ fi
93
+ else
94
+ ui_err "$title"
95
+ cat "$out"
96
+ rm -f "$out"
97
+ exit 1
98
+ fi
99
+ else
100
+ echo "$title..."
101
+ if "$@" >"$out" 2>&1; then
102
+ if [[ "${DOTFILES_CHEZMOI_VERBOSE:-0}" = "1" ]] && [[ -s "$out" ]]; then
103
+ cat "$out"
104
+ fi
105
+ else
106
+ cat "$out"
107
+ rm -f "$out"
108
+ exit 1
109
+ fi
110
+ fi
111
+ rm -f "$out"
112
+ }
113
+
114
+ dot_log info "apply_start"
115
+ _apply_start=$(date +%s)
116
+ ui_header "Applying dotfiles"
117
+ if [[ "${DOTFILES_ALIAS_STRICT_MODE:-0}" == "1" ]]; then
118
+ governance_script="$SCRIPT_DIR/../diagnostics/alias-governance.sh"
119
+ if [[ -f "$governance_script" ]]; then
120
+ run_step "Alias governance (strict)" env DOTFILES_ALIAS_POLICY=strict bash "$governance_script"
121
+ fi
122
+ fi
123
+ run_step "Chezmoi apply" chezmoi apply "${args[@]}"
124
+
125
+ if [[ "${DOTFILES_SNAPSHOT_ON_APPLY:-1}" = "1" ]]; then
126
+ snapshot_script="$SCRIPT_DIR/../diagnostics/snapshot.sh"
127
+ snapshot_dir="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles/snapshots"
128
+ snapshot_file="${snapshot_dir}/baseline.json"
129
+ if [[ -f "$snapshot_script" && ! -f "$snapshot_file" ]]; then
130
+ mkdir -p "$snapshot_dir"
131
+ bash "$snapshot_script" --baseline >/dev/null 2>&1 || true
132
+ fi
133
+ fi
134
+
135
+ check_cmd() {
136
+ local cmd="$1"
137
+ if command -v "$cmd" &>/dev/null; then
138
+ return 0
139
+ fi
140
+ if command -v mise &>/dev/null; then
141
+ if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
142
+ return 0
143
+ fi
144
+ fi
145
+ return 1
146
+ }
147
+
148
+ echo ""
149
+ ui_header "AI provider CLI checks (optional)"
150
+
151
+ # binary|mise_package|label
152
+ _AI_PROVIDERS=(
153
+ "claude|npm:@anthropic-ai/claude-code|Claude Code"
154
+ "copilot|npm:@github/copilot|Copilot CLI"
155
+ "gemini|npm:@google/gemini-cli|Gemini CLI"
156
+ "sgpt|pipx:shell-gpt|Shell-GPT"
157
+ "ollama|aqua:ollama/ollama|Ollama"
158
+ "opencode|npm:opencode-ai|OpenCode"
159
+ "aider|pipx:aider-chat|Aider"
160
+ "kiro-cli|kiro-cli|Kiro CLI"
161
+ "autohand|npm:autohand-cli|Autohand Code"
162
+ "vibe|pipx:mistral-vibe|Mistral Vibe"
163
+ "qwen|npm:@qwen-code/qwen-code|Qwen Code"
164
+ "zai|npm:@guizmo-ai/zai-cli|ZAI"
165
+ )
166
+
167
+ _ai_missing=()
168
+ for _entry in "${_AI_PROVIDERS[@]}"; do
169
+ IFS='|' read -r _bin _pkg _label <<<"$_entry"
170
+ if check_cmd "$_bin"; then
171
+ ui_ok "$_label"
172
+ else
173
+ ui_info "$_label" "not installed"
174
+ _ai_missing+=("$_entry")
175
+ fi
176
+ done
177
+
178
+ if [[ ${#_ai_missing[@]} -gt 0 ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
179
+ if command -v mise &>/dev/null; then
180
+ echo ""
181
+ _ai_install_action=""
182
+ if command -v gum &>/dev/null; then
183
+ _ai_install_action=$(printf '%s\n' "Install all" "Choose which to install" "Skip" |
184
+ gum choose --header "Missing AI providers — install via mise?") || _ai_install_action=""
185
+ else
186
+ ui_info "Tip" "Install all missing AI providers with: mise install"
187
+ ui_info "Tip" "Or individually: mise use -g <package>@latest"
188
+ fi
189
+
190
+ _ai_to_install=()
191
+ case "$_ai_install_action" in
192
+ "Install all")
193
+ _ai_to_install=("${_ai_missing[@]}")
194
+ ;;
195
+ "Choose which to install")
196
+ _ai_pick_choices=()
197
+ for _entry in "${_ai_missing[@]}"; do
198
+ IFS='|' read -r _bin _pkg _label <<<"$_entry"
199
+ _ai_pick_choices+=("$_label")
200
+ done
201
+ _ai_picked=$(printf '%s\n' "${_ai_pick_choices[@]}" |
202
+ gum choose --no-limit --header "Select providers to install (Space to toggle, Enter to confirm)") || _ai_picked=""
203
+ if [[ -n "$_ai_picked" ]]; then
204
+ while IFS= read -r _selected; do
205
+ [[ -z "$_selected" ]] && continue
206
+ for _entry in "${_ai_missing[@]}"; do
207
+ IFS='|' read -r _bin _pkg _label <<<"$_entry"
208
+ if [[ "$_label" == "$_selected" ]]; then
209
+ _ai_to_install+=("$_entry")
210
+ fi
211
+ done
212
+ done <<<"$_ai_picked"
213
+ fi
214
+ ;;
215
+ esac
216
+
217
+ if [[ ${#_ai_to_install[@]} -gt 0 ]]; then
218
+ echo ""
219
+ for _entry in "${_ai_to_install[@]}"; do
220
+ IFS='|' read -r _bin _pkg _label <<<"$_entry"
221
+ if command -v gum &>/dev/null; then
222
+ if gum spin --spinner dot --title "Installing $_label ($_pkg)" -- \
223
+ mise use -g "$_pkg@latest" 2>&1; then
224
+ ui_ok "$_label" "installed"
225
+ else
226
+ ui_warn "$_label" "install failed (continuing)"
227
+ fi
228
+ else
229
+ ui_info "Installing" "$_label via mise ($_pkg)"
230
+ mise use -g "$_pkg@latest" 2>&1 || ui_warn "$_label" "install failed (continuing)"
231
+ fi
232
+ done
233
+ fi
234
+ else
235
+ ui_warn "mise" "not found — install mise first to manage AI providers"
236
+ fi
237
+ fi
238
+
239
+ if [[ "${DOTFILES_CHEZMOI_STATUS:-1}" = "1" ]]; then
240
+ printf "\n"
241
+ ui_header "Status"
242
+ status_out="$(chezmoi status || true)"
243
+ if [[ -z "$status_out" ]]; then
244
+ ui_ok "Clean"
245
+ else
246
+ printf "%s\n" "$status_out"
247
+ fi
248
+ fi
249
+
250
+ if [[ "${DOTFILES_POST_APPLY_REPAIR:-1}" = "1" ]]; then
251
+ post_apply_script="$SCRIPT_DIR/post-apply-repair.sh"
252
+ if [[ -f "$post_apply_script" ]]; then
253
+ printf "\n"
254
+ bash "$post_apply_script" || true
255
+ fi
256
+ fi
257
+
258
+ if [[ "${DOTFILES_PREWARM_ON_APPLY:-1}" = "1" ]]; then
259
+ prewarm_script="$SCRIPT_DIR/prewarm.sh"
260
+ if [[ -f "$prewarm_script" ]]; then
261
+ printf "\n"
262
+ run_step "Pre-warming shell caches" bash "$prewarm_script"
263
+ fi
264
+ fi
265
+
266
+ printf "\n"
267
+ _apply_end=$(date +%s)
268
+ dot_log info "apply_end" "duration_s=$((_apply_end - _apply_start))"
269
+ dot_metric "chezmoi_apply_duration" "$((_apply_end - _apply_start))" "s"
270
+ ui_info "Shell reload" "Run 'exec zsh' or restart your terminal to reload aliases/functions."
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ excludes=(scripts)
6
+ if [[ -n "${DOTFILES_CHEZMOI_DIFF_EXCLUDES:-}" ]]; then
7
+ IFS=',' read -r -a excludes <<<"${DOTFILES_CHEZMOI_DIFF_EXCLUDES}"
8
+ fi
9
+
10
+ args=()
11
+ for ex in "${excludes[@]}"; do
12
+ args+=("--exclude" "$ex")
13
+ done
14
+
15
+ chezmoi diff "${args[@]}" "$@"
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ if [[ $# -lt 1 ]]; then
6
+ echo "Usage: dot remove <path> [--source] [--dry-run]" >&2
7
+ exit 1
8
+ fi
9
+
10
+ remove_source=0
11
+ args=()
12
+ paths=()
13
+
14
+ for arg in "$@"; do
15
+ case "$arg" in
16
+ --source)
17
+ remove_source=1
18
+ ;;
19
+ --dry-run)
20
+ args+=("--dry-run")
21
+ ;;
22
+ *)
23
+ paths+=("$arg")
24
+ ;;
25
+ esac
26
+ done
27
+
28
+ if [[ ${#paths[@]} -eq 0 ]]; then
29
+ echo "No path provided." >&2
30
+ exit 1
31
+ fi
32
+
33
+ # shellcheck disable=SC1091
34
+ if [[ $remove_source -eq 0 ]]; then
35
+ args+=("--keep-source")
36
+ fi
37
+
38
+ printf "About to run: chezmoi remove %s %s\n" "${args[*]}" "${paths[*]}"
39
+ read -r -p "Proceed? [y/N] " confirm
40
+ if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
41
+ echo "Aborted."
42
+ exit 1
43
+ fi
44
+
45
+ chezmoi remove "${args[@]}" "${paths[@]}"
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ args=()
6
+ if [[ -n "${DOTFILES_CHEZMOI_UPDATE_FLAGS:-}" ]]; then
7
+ # Safely parse space-separated flags into array
8
+ read -ra flag_array <<<"$DOTFILES_CHEZMOI_UPDATE_FLAGS"
9
+ args+=("${flag_array[@]}")
10
+ fi
11
+
12
+ if [[ "${DOTFILES_CHEZMOI_VERBOSE:-0}" = "1" ]]; then
13
+ args+=("--verbose")
14
+ fi
15
+
16
+ ASYNC=false
17
+ if [[ "${DOTFILES_ASYNC_UPDATE:-0}" = "1" ]]; then
18
+ ASYNC=true
19
+ fi
20
+ if [[ "${1:-}" == "--async" ]]; then
21
+ ASYNC=true
22
+ shift
23
+ fi
24
+
25
+ STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles/update"
26
+ mkdir -p "$STATE_DIR"
27
+ LOG_FILE="$STATE_DIR/last.log"
28
+ STATUS_FILE="$STATE_DIR/last.status"
29
+ NOTICE_FILE="$STATE_DIR/notice"
30
+
31
+ run_update() {
32
+ echo "Updating dotfiles..."
33
+ chezmoi update "${args[@]}"
34
+ }
35
+
36
+ if $ASYNC; then
37
+ echo "Update running in background..."
38
+ {
39
+ run_update
40
+ echo $? >"$STATUS_FILE"
41
+ } >"$LOG_FILE" 2>&1 &
42
+ date -u +%Y-%m-%dT%H:%M:%SZ >"$NOTICE_FILE"
43
+ disown || true
44
+ exit 0
45
+ fi
46
+
47
+ run_update
48
+ echo $? >"$STATUS_FILE"
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck disable=SC2034
4
+ # =============================================================================
5
+ # heal-chezmoi.sh — Chezmoi drift and backup repair functions for heal.sh
6
+ # Sourced by heal.sh; inherits set -euo pipefail, ui.sh, and shared variables.
7
+ # =============================================================================
8
+
9
+ create_pre_heal_backup() {
10
+ local rollback_script="$REPO_ROOT/scripts/ops/rollback.sh"
11
+ if [[ -f "$rollback_script" ]]; then
12
+ log_info "Creating backup before heal..."
13
+ bash "$rollback_script" backup --force 2>/dev/null || true
14
+ else
15
+ # Minimal inline backup
16
+ local timestamp
17
+ timestamp=$(date +"%Y%m%d_%H%M%S")
18
+ local backup_path="$BACKUP_DIR/backup_${timestamp}_pre_heal"
19
+ mkdir -p "$backup_path"
20
+ for f in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.profile"; do
21
+ if [[ -f "$f" ]]; then
22
+ cp -a "$f" "$backup_path/" 2>/dev/null || true
23
+ fi
24
+ done
25
+ log_info "Backup created at $backup_path"
26
+ fi
27
+ }
28
+
29
+ heal_chezmoi_drift() {
30
+ if ! command -v chezmoi >/dev/null 2>&1; then return 0; fi
31
+
32
+ local status_output
33
+ status_output=$(chezmoi status 2>/dev/null || echo "")
34
+
35
+ if [[ -z "$status_output" ]]; then
36
+ printf ' \033[38;5;42m✓\033[0m chezmoi state\n'
37
+ return 0
38
+ fi
39
+
40
+ # Partition the drift: column 2 is what `chezmoi apply` would fix
41
+ # (destination differs from source). Column 1 is source-only drift
42
+ # (unstaged edits in the chezmoi source tree). Apply can't help with
43
+ # the second case — that needs `git commit` in the source repo.
44
+ local applicable
45
+ local source_only
46
+ applicable=$(printf '%s\n' "$status_output" | awk 'substr($0,2,1)!=" "' | wc -l | tr -d ' ')
47
+ source_only=$(printf '%s\n' "$status_output" | awk 'substr($0,1,1)!=" " && substr($0,2,1)==" "' | wc -l | tr -d ' ')
48
+
49
+ ISSUES_FOUND=$((ISSUES_FOUND + 1))
50
+
51
+ if [[ "$DRY_RUN" == "1" ]]; then
52
+ log_dry "run 'chezmoi apply --force' to re-sync ($applicable file(s))"
53
+ return 0
54
+ fi
55
+
56
+ # Skip the apply if every file is source-only drift; nothing to fix.
57
+ if [[ "$applicable" -eq 0 ]]; then
58
+ printf ' \033[38;5;220m⚠\033[0m chezmoi state %s file(s) modified in source only — commit or revert in the source repo\n' "$source_only"
59
+ return 0
60
+ fi
61
+
62
+ # Capture apply output so we can surface failure reasons.
63
+ local apply_log
64
+ apply_log=$(mktemp)
65
+ if chezmoi apply --force >"$apply_log" 2>&1; then
66
+ FIXES_APPLIED=$((FIXES_APPLIED + 1))
67
+ CHEZMOI_APPLIED=1
68
+ persist_log "HEAL: chezmoi apply --force"
69
+
70
+ # Verify: did apply actually clean the drift?
71
+ local remaining
72
+ remaining=$(chezmoi status 2>/dev/null | awk 'substr($0,2,1)!=" "' | wc -l | tr -d ' ')
73
+ if [[ "$remaining" -eq 0 ]]; then
74
+ printf ' \033[38;5;42m✓\033[0m chezmoi re-apply %s file(s) synced\n' "$applicable"
75
+ else
76
+ # shellcheck disable=SC2016
77
+ printf ' \033[38;5;220m⚠\033[0m chezmoi re-apply %s applied, %s still drifted — run `chezmoi diff` to inspect\n' \
78
+ "$((applicable - remaining))" "$remaining"
79
+ fi
80
+ else
81
+ printf ' \033[38;5;196m✗\033[0m chezmoi re-apply failed; see %s\n' "$apply_log"
82
+ tail -5 "$apply_log" | sed 's/^/ /'
83
+ return 1
84
+ fi
85
+ rm -f "$apply_log"
86
+ }
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck disable=SC2034
4
+ # =============================================================================
5
+ # heal-system.sh — System-level repair functions for heal.sh
6
+ # Sourced by heal.sh; inherits set -euo pipefail, ui.sh, and shared variables.
7
+ # =============================================================================
8
+
9
+ heal_broken_symlinks() {
10
+ local broken=()
11
+
12
+ while IFS= read -r -d '' link; do
13
+ local filename
14
+ filename=$(basename "$link")
15
+
16
+ # Skip known false positives (e.g., Chrome lock files in backups)
17
+ [[ "$link" == *"google-chrome-backup"* ]] && continue
18
+ [[ "$filename" == "SingletonLock" || "$filename" == "SingletonCookie" || "$filename" == "SingletonSocket" ]] && continue
19
+
20
+ if [[ ! -e "$link" ]]; then
21
+ broken+=("$link")
22
+ fi
23
+ done < <(find "$HOME" -maxdepth 3 -type l -print0 2>/dev/null || true)
24
+
25
+ # Special handling for common transient/app locks that dot doctor reported
26
+ local lock_patterns=("SingletonLock" "SingletonCookie")
27
+
28
+ if [[ ${#broken[@]} -eq 0 ]]; then
29
+ printf ' \033[38;5;42m✓\033[0m symlinks\n'
30
+ return 0
31
+ fi
32
+
33
+ ISSUES_FOUND=$((ISSUES_FOUND + ${#broken[@]}))
34
+
35
+ for link in "${broken[@]}"; do
36
+ local target
37
+ target=$(readlink "$link" 2>/dev/null || echo "unknown")
38
+ local filename
39
+ filename=$(basename "$link")
40
+
41
+ local is_lock=0
42
+ for pat in "${lock_patterns[@]}"; do
43
+ if [[ "$filename" == *"$pat"* ]]; then
44
+ is_lock=1
45
+ break
46
+ fi
47
+ done
48
+
49
+ if [[ "$DRY_RUN" == "1" ]]; then
50
+ log_dry "remove broken symlink: $link -> $target"
51
+ else
52
+ if [[ "$is_lock" == "0" ]] && [[ "$FORCE" != "1" ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
53
+ read -rp "Remove broken symlink $link -> $target? [y/N] " response
54
+ if [[ ! "$response" =~ ^[Yy]$ ]]; then
55
+ continue
56
+ fi
57
+ fi
58
+ if rm -f "$link" 2>/dev/null; then
59
+ printf ' \033[38;5;42m✓\033[0m removed %s\n' "$link"
60
+ FIXES_APPLIED=$((FIXES_APPLIED + 1))
61
+ persist_log "HEAL: removed broken symlink $link"
62
+ else
63
+ printf ' \033[38;5;214m⚠\033[0m could not remove %s\n' "$link"
64
+ fi
65
+ fi
66
+ done
67
+ }
68
+
69
+ heal_missing_critical_files() {
70
+ local critical_files=("$HOME/.zshrc" "$HOME/.bashrc" "$HOME/.profile")
71
+ local missing=()
72
+
73
+ for file in "${critical_files[@]}"; do
74
+ if [[ ! -f "$file" ]] && [[ ! -L "$file" ]]; then
75
+ missing+=("$file")
76
+ ISSUES_FOUND=$((ISSUES_FOUND + 1))
77
+ fi
78
+ done
79
+
80
+ if [[ ${#missing[@]} -eq 0 ]]; then
81
+ printf ' \033[38;5;42m✓\033[0m shell configs\n'
82
+ return 0
83
+ fi
84
+
85
+ if ! command -v chezmoi >/dev/null 2>&1; then return 1; fi
86
+
87
+ if [[ "$DRY_RUN" == "1" ]]; then
88
+ log_dry "regenerate missing files via chezmoi"
89
+ elif [[ "$CHEZMOI_APPLIED" != "1" ]]; then
90
+ if _pkg_install "shell configs" 0 1 chezmoi apply --force; then
91
+ CHEZMOI_APPLIED=1
92
+ local restored=0
93
+ for file in "${missing[@]}"; do
94
+ if [[ -f "$file" ]] || [[ -L "$file" ]]; then
95
+ restored=$((restored + 1))
96
+ fi
97
+ done
98
+ FIXES_APPLIED=$((FIXES_APPLIED + restored))
99
+ persist_log "HEAL: regenerated $restored critical file(s)"
100
+ fi
101
+ fi
102
+ }
103
+
104
+ heal_missing_xdg_dirs() {
105
+ local xdg_dirs=("$HOME/.config/shell" "$HOME/.config/nvim" "$HOME/.config/git")
106
+ local missing=()
107
+
108
+ for dir in "${xdg_dirs[@]}"; do
109
+ [[ -d "$dir" ]] || missing+=("$dir")
110
+ done
111
+
112
+ if [[ ${#missing[@]} -eq 0 ]]; then
113
+ printf ' \033[38;5;42m✓\033[0m xdg directories\n'
114
+ return 0
115
+ fi
116
+
117
+ ISSUES_FOUND=$((ISSUES_FOUND + ${#missing[@]}))
118
+ for dir in "${missing[@]}"; do
119
+ if [[ "$DRY_RUN" == "1" ]]; then
120
+ log_dry "create directory: $dir"
121
+ else
122
+ mkdir -p "$dir"
123
+ printf ' \033[38;5;42m✓\033[0m %s\n' "$(basename "$dir")"
124
+ FIXES_APPLIED=$((FIXES_APPLIED + 1))
125
+ persist_log "HEAL: created directory $dir"
126
+ fi
127
+ done
128
+ }