@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,340 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck disable=SC2034
4
+ # =============================================================================
5
+ # heal-tools.sh — Tool installation helpers for heal.sh
6
+ # Sourced by heal.sh; inherits set -euo pipefail, ui.sh, and shared variables.
7
+ # =============================================================================
8
+
9
+ # Helper to check command (mise-aware, mirrors doctor.sh)
10
+ check_cmd() {
11
+ local cmd="$1"
12
+ if command -v "$cmd" &>/dev/null; then
13
+ return 0
14
+ fi
15
+ # Fallback: check if installed via mise
16
+ if command -v mise &>/dev/null; then
17
+ if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
18
+ return 0
19
+ fi
20
+ fi
21
+ return 1
22
+ }
23
+
24
+ detect_pkg_manager() {
25
+ if command -v brew >/dev/null 2>&1; then
26
+ echo "brew"
27
+ elif command -v apt-get >/dev/null 2>&1; then
28
+ echo "apt"
29
+ elif command -v dnf >/dev/null 2>&1; then
30
+ echo "dnf"
31
+ elif command -v pacman >/dev/null 2>&1; then
32
+ echo "pacman"
33
+ elif command -v nix-env >/dev/null 2>&1; then
34
+ echo "nix"
35
+ else
36
+ echo ""
37
+ fi
38
+ }
39
+
40
+ install_package() {
41
+ local pkg="$1"
42
+ local pkg_mgr
43
+ pkg_mgr=$(detect_pkg_manager)
44
+
45
+ case "$pkg_mgr" in
46
+ brew) brew install --quiet "$pkg" >/dev/null 2>&1 ;;
47
+ apt)
48
+ if ! command -v sudo >/dev/null 2>&1; then
49
+ log_error "sudo not found — cannot install '$pkg' via apt"
50
+ return 1
51
+ fi
52
+ sudo apt-get install -y -qq "$pkg" >/dev/null 2>&1
53
+ ;;
54
+ dnf)
55
+ if ! command -v sudo >/dev/null 2>&1; then
56
+ log_error "sudo not found — cannot install '$pkg' via dnf"
57
+ return 1
58
+ fi
59
+ sudo dnf install -y -q "$pkg" >/dev/null 2>&1
60
+ ;;
61
+ pacman)
62
+ if ! command -v sudo >/dev/null 2>&1; then
63
+ log_error "sudo not found — cannot install '$pkg' via pacman"
64
+ return 1
65
+ fi
66
+ sudo pacman -S --noconfirm --quiet "$pkg" >/dev/null 2>&1
67
+ ;;
68
+ nix) nix-env -iA "nixpkgs.$pkg" >/dev/null 2>&1 ;;
69
+ *)
70
+ log_error "No supported package manager found. Install '$pkg' manually."
71
+ return 1
72
+ ;;
73
+ esac
74
+ }
75
+
76
+ # Map command names to package names per package manager
77
+ get_package_name() {
78
+ local cmd="$1"
79
+
80
+ case "$cmd" in
81
+ rg) echo "ripgrep" ;;
82
+ bat) echo "bat" ;;
83
+ fzf) echo "fzf" ;;
84
+ zsh) echo "zsh" ;;
85
+ age) echo "age" ;;
86
+ *) echo "$cmd" ;;
87
+ esac
88
+ }
89
+
90
+ # =============================================================================
91
+ # Animated Package Installer — delegates to ui.sh ui_run_cmd
92
+ # =============================================================================
93
+
94
+ # Usage: _pkg_install "label" completed total command [args...]
95
+ _pkg_install() { ui_run_cmd "$@"; }
96
+
97
+ # Resolve latest GitHub release tag for a repo
98
+ _gh_latest_tag() {
99
+ curl -fsSLI -o /dev/null -w '%{url_effective}' "https://github.com/$1/releases/latest" | sed 's|.*/||'
100
+ }
101
+
102
+ # Install a single package (dispatcher for _pkg_install to call in subshell)
103
+ _do_install() {
104
+ local cmd="$1"
105
+ local pkg_mgr="$2"
106
+ local bin_dir="$HOME/.local/bin"
107
+ mkdir -p "$bin_dir"
108
+
109
+ # Binary/curl installers for tools not in standard apt repos
110
+ case "$cmd" in
111
+ starship)
112
+ local installer
113
+ installer=$(umask 077 && mktemp)
114
+ if ! curl -fsSL -o "$installer" https://starship.rs/install.sh; then
115
+ rm -f "$installer"
116
+ log_error "Failed to download starship installer"
117
+ return 1
118
+ fi
119
+ if ! head -1 "$installer" | grep -q '^#!/'; then
120
+ rm -f "$installer"
121
+ log_error "starship installer does not look like a shell script"
122
+ return 1
123
+ fi
124
+ sh "$installer" --yes
125
+ local rc=$?
126
+ rm -f "$installer"
127
+ return $rc
128
+ ;;
129
+ atuin)
130
+ local installer
131
+ installer=$(umask 077 && mktemp)
132
+ if ! curl -fsSL -o "$installer" https://setup.atuin.sh; then
133
+ rm -f "$installer"
134
+ log_error "Failed to download atuin installer"
135
+ return 1
136
+ fi
137
+ if ! head -1 "$installer" | grep -q '^#!/'; then
138
+ rm -f "$installer"
139
+ log_error "atuin installer does not look like a shell script"
140
+ return 1
141
+ fi
142
+ bash "$installer" --yes
143
+ local rc=$?
144
+ rm -f "$installer"
145
+ return $rc
146
+ ;;
147
+ nushell)
148
+ local arch tag ver
149
+ arch=$(uname -m)
150
+ tag=$(_gh_latest_tag "nushell/nushell")
151
+ ver="${tag#v}"
152
+ local tmp
153
+ tmp=$(mktemp -d)
154
+ curl -fsSL -o "$tmp/nu.tar.gz" \
155
+ "https://github.com/nushell/nushell/releases/download/${tag}/nu-${ver}-${arch}-unknown-linux-musl.tar.gz" &&
156
+ tar xzf "$tmp/nu.tar.gz" -C "$tmp" --strip-components=1 &&
157
+ install -m 755 "$tmp/nu" "$bin_dir/nu"
158
+ local rc=$?
159
+ rm -rf "$tmp"
160
+ return $rc
161
+ ;;
162
+ pueue)
163
+ local arch
164
+ arch=$(uname -m)
165
+ curl -fsSL -o "$bin_dir/pueue" \
166
+ "https://github.com/Nukesor/pueue/releases/latest/download/pueue-${arch}-unknown-linux-musl" &&
167
+ chmod +x "$bin_dir/pueue"
168
+ curl -fsSL -o "$bin_dir/pueued" \
169
+ "https://github.com/Nukesor/pueue/releases/latest/download/pueued-${arch}-unknown-linux-musl" &&
170
+ chmod +x "$bin_dir/pueued"
171
+ return $?
172
+ ;;
173
+ wasmtime)
174
+ local arch tag
175
+ arch=$(uname -m)
176
+ tag=$(_gh_latest_tag "bytecodealliance/wasmtime")
177
+ local tmp
178
+ tmp=$(mktemp -d)
179
+ # xz-utils required for .tar.xz extraction
180
+ command -v xz >/dev/null 2>&1 || sudo apt-get install -y -qq xz-utils >/dev/null 2>&1 || true
181
+ curl -fsSL -o "$tmp/wasmtime.tar.xz" \
182
+ "https://github.com/bytecodealliance/wasmtime/releases/download/${tag}/wasmtime-${tag}-${arch}-linux.tar.xz" &&
183
+ tar xJf "$tmp/wasmtime.tar.xz" -C "$tmp" --strip-components=1 &&
184
+ install -m 755 "$tmp/wasmtime" "$bin_dir/wasmtime"
185
+ local rc=$?
186
+ rm -rf "$tmp"
187
+ return $rc
188
+ ;;
189
+ sops)
190
+ local arch tag
191
+ arch=$(uname -m)
192
+ [[ "$arch" == "x86_64" ]] && arch="amd64"
193
+ [[ "$arch" == "aarch64" ]] && arch="arm64"
194
+ tag=$(_gh_latest_tag "getsops/sops")
195
+ curl -fsSL -o "$bin_dir/sops" \
196
+ "https://github.com/getsops/sops/releases/download/${tag}/sops-${tag}.linux.${arch}" &&
197
+ chmod +x "$bin_dir/sops"
198
+ return $?
199
+ ;;
200
+ hyperfine)
201
+ local arch tag
202
+ arch=$(uname -m)
203
+ tag=$(_gh_latest_tag "sharkdp/hyperfine")
204
+ local tmp
205
+ tmp=$(mktemp -d)
206
+ curl -fsSL -o "$tmp/hyperfine.tar.gz" \
207
+ "https://github.com/sharkdp/hyperfine/releases/download/${tag}/hyperfine-${tag}-${arch}-unknown-linux-musl.tar.gz" &&
208
+ tar xzf "$tmp/hyperfine.tar.gz" -C "$tmp" --strip-components=1 &&
209
+ install -m 755 "$tmp/hyperfine" "$bin_dir/hyperfine"
210
+ local rc=$?
211
+ rm -rf "$tmp"
212
+ return $rc
213
+ ;;
214
+ yazi)
215
+ local arch
216
+ arch=$(uname -m)
217
+ local url="https://github.com/sxyazi/yazi/releases/latest/download/yazi-${arch}-unknown-linux-musl.zip"
218
+ local tmp
219
+ tmp=$(mktemp -d)
220
+ command -v unzip >/dev/null 2>&1 || sudo apt-get install -y -qq unzip
221
+ curl -fsSL -o "$tmp/yazi.zip" "$url" &&
222
+ (cd "$tmp" && unzip -oq yazi.zip) &&
223
+ install -m 755 "$tmp"/yazi-*/yazi "$bin_dir/yazi"
224
+ local rc=$?
225
+ rm -rf "$tmp"
226
+ return $rc
227
+ ;;
228
+ zellij)
229
+ local arch
230
+ arch=$(uname -m)
231
+ local url="https://github.com/zellij-org/zellij/releases/latest/download/zellij-${arch}-unknown-linux-musl.tar.gz"
232
+ local tmp
233
+ tmp=$(mktemp -d)
234
+ curl -fsSL -o "$tmp/zellij.tar.gz" "$url" &&
235
+ tar xzf "$tmp/zellij.tar.gz" -C "$tmp" &&
236
+ install -m 755 "$tmp/zellij" "$bin_dir/zellij"
237
+ local rc=$?
238
+ rm -rf "$tmp"
239
+ return $rc
240
+ ;;
241
+ esac
242
+
243
+ # System package manager
244
+ local pkg
245
+ pkg=$(get_package_name "$cmd")
246
+ install_package "$pkg"
247
+ }
248
+
249
+ heal_missing_dependencies() {
250
+ log_step "Checking dependencies"
251
+ # All tools that dot doctor checks — unified list
252
+ local deps=(
253
+ zsh chezmoi starship rg bat fzf zoxide atuin yazi zellij
254
+ nushell pueue wasmtime sops age hyperfine
255
+ )
256
+ local all_missing=()
257
+
258
+ for cmd in "${deps[@]}"; do
259
+ local check_name="$cmd"
260
+ [[ "$cmd" == "nushell" ]] && check_name="nu"
261
+ if check_cmd "$check_name"; then continue; fi
262
+ if [[ "$cmd" == "bat" ]] && check_cmd "batcat"; then continue; fi
263
+ all_missing+=("$cmd")
264
+ ISSUES_FOUND=$((ISSUES_FOUND + 1))
265
+ done
266
+
267
+ MISSING_DEPS_FOUND=${#all_missing[@]}
268
+
269
+ if [[ ${#all_missing[@]} -eq 0 ]]; then
270
+ log_success "All dependencies present"
271
+ return 0
272
+ fi
273
+
274
+ local total=${#all_missing[@]}
275
+ local completed=0
276
+ local installed=0
277
+ local pkg_mgr
278
+ pkg_mgr=$(detect_pkg_manager)
279
+
280
+ echo ""
281
+ for cmd in "${all_missing[@]}"; do
282
+ if [[ "$DRY_RUN" == "1" ]]; then
283
+ log_dry "install '$cmd'"
284
+ completed=$((completed + 1))
285
+ continue
286
+ fi
287
+
288
+ if [[ -z "$pkg_mgr" ]]; then
289
+ printf ' \033[38;5;196m✗\033[0m %s (no package manager)\n' "$cmd"
290
+ completed=$((completed + 1))
291
+ continue
292
+ fi
293
+
294
+ if _pkg_install "$cmd" "$completed" "$total" _do_install "$cmd" "$pkg_mgr"; then
295
+ FIXES_APPLIED=$((FIXES_APPLIED + 1))
296
+ installed=$((installed + 1))
297
+ persist_log "HEAL: installed $cmd"
298
+
299
+ # Post-install hooks (run in parent scope)
300
+ case "$cmd" in
301
+ bat)
302
+ if [[ "$pkg_mgr" == "apt" ]] && command -v batcat >/dev/null 2>&1 && ! command -v bat >/dev/null 2>&1; then
303
+ mkdir -p "$HOME/.local/bin"
304
+ ln -sf "$(command -v batcat)" "$HOME/.local/bin/bat"
305
+ fi
306
+ ;;
307
+ atuin) export PATH="$HOME/.atuin/bin:$PATH" ;;
308
+ esac
309
+ fi
310
+ completed=$((completed + 1))
311
+ done
312
+
313
+ if [[ "$DRY_RUN" != "1" ]]; then
314
+ echo ""
315
+ printf ' \033[1;38;5;42mDone!\033[0m Installed %d/%d packages.\n' "$installed" "$total"
316
+ fi
317
+ }
318
+
319
+ heal_mise_tools() {
320
+ if ! command -v mise >/dev/null 2>&1; then
321
+ return 0
322
+ fi
323
+
324
+ # Avoid blocking every heal run. Only ensure mise tools when deps are missing
325
+ # or when explicitly requested.
326
+ if [[ "${DOTFILES_HEAL_MISE_INSTALL:-0}" != "1" ]] && [[ "${MISSING_DEPS_FOUND:-0}" -eq 0 ]]; then
327
+ return 0
328
+ fi
329
+
330
+ if [[ "$DRY_RUN" == "1" ]]; then
331
+ log_dry "run 'mise install' to ensure all tools are present"
332
+ else
333
+ if _pkg_install "mise tools" 0 1 mise install; then
334
+ # Start pueue daemon if it was just installed but not running
335
+ if command -v pueued >/dev/null && ! pueue status >/dev/null 2>&1; then
336
+ pueued -d 2>/dev/null || true
337
+ fi
338
+ fi
339
+ fi
340
+ }
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck disable=SC2034
4
+ # =============================================================================
5
+ # Dotfiles Heal Script - Auto-repair common dotfiles issues
6
+ # Runs diagnostics and attempts automatic fixes
7
+ # Usage: ./scripts/ops/heal.sh [OPTIONS]
8
+ # =============================================================================
9
+
10
+ set -euo pipefail
11
+
12
+ _cleanup_files=()
13
+ LOCK_DIR=""
14
+ cleanup() {
15
+ rm -f "${_cleanup_files[@]:-}"
16
+ if [[ -n "$LOCK_DIR" ]]; then
17
+ rmdir "$LOCK_DIR" 2>/dev/null || true
18
+ fi
19
+ }
20
+ trap cleanup EXIT
21
+
22
+ # Configuration
23
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
24
+ # shellcheck source=../dot/lib/ui.sh
25
+ # shellcheck disable=SC1091
26
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
27
+ # shellcheck source=../dot/lib/log.sh
28
+ # shellcheck disable=SC1091
29
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
30
+ DOT_COMMAND="heal"
31
+ REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
32
+ DOTFILES_SOURCE="$REPO_ROOT"
33
+ BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
34
+ STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles"
35
+ HEAL_LOG="$STATE_DIR/heal.log"
36
+
37
+ # Logging — delegates to shared ui.sh primitives
38
+ ui_init
39
+ log() { printf '%b\n' "$*"; }
40
+ log_info() { ui_info "$@"; }
41
+ log_success() { ui_ok "$@"; }
42
+ log_warn() { ui_warn "$@"; }
43
+ log_error() { ui_err "$@"; }
44
+ log_step() {
45
+ echo ""
46
+ ui_section "$*"
47
+ }
48
+ log_dry() { ui_warn "DRY-RUN" "Would: $*"; }
49
+
50
+ # Persistent logging
51
+ persist_log() {
52
+ mkdir -p "$STATE_DIR"
53
+ echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >>"$HEAL_LOG"
54
+ }
55
+
56
+ # Options
57
+ DRY_RUN=0
58
+ FORCE=0
59
+ FIXES_APPLIED=0
60
+ ISSUES_FOUND=0
61
+ CHEZMOI_APPLIED=0
62
+ MISSING_DEPS_FOUND=0
63
+
64
+ usage() {
65
+ cat <<EOF
66
+ Dotfiles Heal - Auto-repair common issues
67
+
68
+ Usage: $(basename "$0") [OPTIONS]
69
+
70
+ Options:
71
+ -n, --dry-run Preview what would be fixed without making changes
72
+ -f, --force Skip confirmation prompts
73
+ -h, --help Show this help message
74
+
75
+ Environment:
76
+ DOTFILES_NONINTERACTIVE=1 Skip all interactive prompts (same as --force)
77
+
78
+ Repairs:
79
+ - Missing tools (zsh, starship, rg, bat, fzf, zoxide, atuin, yazi, zellij,
80
+ nushell, pueue, wasmtime, sops, age, hyperfine)
81
+ - Broken symlinks in \$HOME (depth 3)
82
+ - Chezmoi drift (re-applies dotfiles)
83
+ - Missing critical files (.zshrc, .bashrc, .profile)
84
+ - Missing XDG config directories
85
+
86
+ EOF
87
+ }
88
+
89
+ # Parse arguments
90
+ while [[ $# -gt 0 ]]; do
91
+ case "$1" in
92
+ -n | --dry-run)
93
+ DRY_RUN=1
94
+ shift
95
+ ;;
96
+ -f | --force)
97
+ FORCE=1
98
+ shift
99
+ ;;
100
+ -h | --help)
101
+ usage
102
+ exit 0
103
+ ;;
104
+ *)
105
+ log_error "Unknown option: $1"
106
+ usage
107
+ exit 1
108
+ ;;
109
+ esac
110
+ done
111
+
112
+ # Prevent concurrent execution
113
+ # Prefer XDG runtime dir when it exists and is writable; fallback to /tmp.
114
+ LOCK_BASE="/tmp"
115
+ if [[ -n "${XDG_RUNTIME_DIR:-}" ]] && [[ -d "${XDG_RUNTIME_DIR}" ]] && [[ -w "${XDG_RUNTIME_DIR}" ]]; then
116
+ LOCK_BASE="${XDG_RUNTIME_DIR}"
117
+ fi
118
+ LOCK_FILE="${LOCK_BASE}/dotfiles-heal.lock"
119
+ LOCK_DIR="${LOCK_FILE}.d"
120
+ if command -v flock >/dev/null 2>&1; then
121
+ exec 9>"$LOCK_FILE"
122
+ if ! flock -n 9; then
123
+ # Fallback path for systems where flock exists but cannot lock reliably.
124
+ if ! mkdir "$LOCK_DIR" 2>/dev/null; then
125
+ ui_warn "Already running" "Another instance is active"
126
+ exit 0
127
+ fi
128
+ fi
129
+ else
130
+ # Portable fallback when flock is unavailable (e.g. default macOS envs).
131
+ if ! mkdir "$LOCK_DIR" 2>/dev/null; then
132
+ ui_warn "Already running" "Another instance is active"
133
+ exit 0
134
+ fi
135
+ fi
136
+
137
+ # =============================================================================
138
+ # Load modules (inherit scope: set -euo pipefail, ui.sh, and all variables)
139
+ # =============================================================================
140
+
141
+ # shellcheck source=heal-tools.sh
142
+ # shellcheck disable=SC1091
143
+ source "$SCRIPT_DIR/heal-tools.sh"
144
+
145
+ # shellcheck source=heal-system.sh
146
+ # shellcheck disable=SC1091
147
+ source "$SCRIPT_DIR/heal-system.sh"
148
+
149
+ # shellcheck source=heal-chezmoi.sh
150
+ # shellcheck disable=SC1091
151
+ source "$SCRIPT_DIR/heal-chezmoi.sh"
152
+
153
+ # =============================================================================
154
+ # Main
155
+ # =============================================================================
156
+
157
+ main() {
158
+ echo ""
159
+ printf ' \033[1mDotfiles Heal\033[0m\n'
160
+ echo ""
161
+
162
+ if [[ "$DRY_RUN" == "1" ]]; then
163
+ log_info "Dry-run mode (no changes will be made)"
164
+ fi
165
+
166
+ # Confirm before making changes (unless --force, --dry-run, or non-interactive)
167
+ if [[ "$DRY_RUN" != "1" ]] && [[ "$FORCE" != "1" ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
168
+ log_warn "This will auto-repair your dotfiles environment."
169
+ read -rp " Continue? [y/N] " response
170
+ if [[ ! "$response" =~ ^[Yy]$ ]]; then
171
+ log_info "Aborted."
172
+ exit 0
173
+ fi
174
+ echo ""
175
+ fi
176
+
177
+ # Create backup before making changes
178
+ if [[ "$DRY_RUN" != "1" ]]; then
179
+ _pkg_install "backup" 0 1 create_pre_heal_backup 2>/dev/null || true
180
+ fi
181
+
182
+ # Run all repairs
183
+ heal_missing_dependencies || true
184
+ heal_mise_tools || true
185
+
186
+ # Quick checks (no animation needed)
187
+ heal_chezmoi_drift || true
188
+ heal_broken_symlinks || true
189
+ heal_missing_critical_files || true
190
+ heal_missing_xdg_dirs || true
191
+
192
+ # Pre-warm shell caches for fast startup (< 50ms target)
193
+ local prewarm_script="$SCRIPT_DIR/prewarm.sh"
194
+ if [[ -f "$prewarm_script" ]] && [[ "$DRY_RUN" != "1" ]]; then
195
+ log_step "Performance"
196
+ _pkg_install "shell cache pre-warm" 0 1 bash "$prewarm_script" || true
197
+ fi
198
+
199
+ # Summary
200
+ echo ""
201
+ if [[ "$DRY_RUN" == "1" ]]; then
202
+ if [[ $ISSUES_FOUND -eq 0 ]]; then
203
+ printf ' \033[1;38;5;42mHealthy.\033[0m No issues found.\n'
204
+ else
205
+ printf ' Found %d issue(s). Run without --dry-run to apply fixes.\n' "$ISSUES_FOUND"
206
+ fi
207
+ else
208
+ if [[ $ISSUES_FOUND -eq 0 ]]; then
209
+ printf ' \033[1;38;5;42mHealthy.\033[0m No issues found.\n'
210
+ elif [[ $FIXES_APPLIED -gt 0 ]]; then
211
+ printf ' \033[1;38;5;42mDone!\033[0m Applied %d fix(es) for %d issue(s).\n' "$FIXES_APPLIED" "$ISSUES_FOUND"
212
+ persist_log "HEAL_COMPLETE: $FIXES_APPLIED fixes applied"
213
+ dot_log info "heal_complete" "fixes=$FIXES_APPLIED" "issues=$ISSUES_FOUND"
214
+ else
215
+ printf ' Found %d issue(s) but no fixes could be applied.\n' "$ISSUES_FOUND"
216
+ printf ' Run \033[38;5;211mdot doctor\033[0m for diagnostics.\n'
217
+ fi
218
+ fi
219
+ echo ""
220
+ }
221
+
222
+ main
@@ -0,0 +1,106 @@
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
+
10
+ ZWC_CACHE_DIRS_DEFAULT=("$HOME/.config/shell" "$HOME/.config/zsh")
11
+
12
+ repair_zwc_cache() {
13
+ local repaired=0
14
+ local failed=0
15
+ local file
16
+ local dirs=()
17
+ local raw_dirs="${DOTFILES_ZWC_CACHE_DIRS:-}"
18
+
19
+ if [[ -n "$raw_dirs" ]]; then
20
+ # shellcheck disable=SC2206
21
+ dirs=($raw_dirs)
22
+ else
23
+ dirs=("${ZWC_CACHE_DIRS_DEFAULT[@]}")
24
+ fi
25
+
26
+ while IFS= read -r -d '' file; do
27
+ if [[ ! -w "$file" ]]; then
28
+ if rm -f "$file" >/dev/null 2>&1; then
29
+ ((repaired++)) || true
30
+ else
31
+ ((failed++)) || true
32
+ fi
33
+ fi
34
+ done < <(find "${dirs[@]}" -type f -name '*.zwc' -print0 2>/dev/null || true)
35
+
36
+ if ((failed > 0)); then
37
+ ui_err "Zsh cache repair" "failed to remove ${failed} stale .zwc file(s)"
38
+ return
39
+ fi
40
+
41
+ if ((repaired > 0)); then
42
+ ui_warn "Zsh cache repair" "removed ${repaired} stale read-only .zwc file(s)"
43
+ else
44
+ ui_ok "Zsh cache repair" "no stale .zwc permissions detected"
45
+ fi
46
+ }
47
+
48
+ resolve_zsh_bin() {
49
+ if [[ -n "${DOTFILES_ZSH_BIN:-}" ]]; then
50
+ printf "%s\n" "${DOTFILES_ZSH_BIN}"
51
+ return
52
+ fi
53
+ if command -v zsh >/dev/null 2>&1; then
54
+ command -v zsh
55
+ return
56
+ fi
57
+ printf "%s\n" ""
58
+ }
59
+
60
+ validate_dot_cli() {
61
+ local dot_bin="${HOME}/.local/bin/dot"
62
+ local zsh_out dot_alias dot_path
63
+ local zsh_bin
64
+
65
+ if [[ ! -x "$dot_bin" ]]; then
66
+ ui_err "dot CLI binary" "missing executable at ${dot_bin}"
67
+ return
68
+ fi
69
+ ui_ok "dot CLI binary" "$dot_bin"
70
+
71
+ zsh_bin="$(resolve_zsh_bin)"
72
+ if [[ -z "$zsh_bin" || ! -x "$zsh_bin" ]]; then
73
+ ui_warn "dot CLI resolution" "zsh not available; skipping shell validation"
74
+ return
75
+ fi
76
+
77
+ zsh_out="$("$zsh_bin" -lic '
78
+ alias dot 2>/dev/null || true
79
+ whence -p dot 2>/dev/null || true
80
+ ' 2>/dev/null || true)"
81
+ dot_alias="$(printf "%s\n" "$zsh_out" | head -n 1)"
82
+ dot_path="$(printf "%s\n" "$zsh_out" | tail -n 1)"
83
+
84
+ if [[ "$dot_alias" == *"cd_with_history"* ]]; then
85
+ ui_warn "dot alias collision" "legacy sessions may still map dot to navigation; run: unalias dot && exec zsh"
86
+ fi
87
+
88
+ if [[ "$dot_path" == "$dot_bin" ]]; then
89
+ ui_ok "dot CLI resolution" "$dot_path"
90
+ elif [[ -n "$dot_path" ]]; then
91
+ ui_warn "dot CLI resolution" "resolved to ${dot_path} (expected ${dot_bin})"
92
+ else
93
+ ui_err "dot CLI resolution" "dot not found in a fresh zsh login shell"
94
+ fi
95
+ }
96
+
97
+ main() {
98
+ ui_init
99
+ ui_header "Post-apply checks"
100
+ repair_zwc_cache
101
+ validate_dot_cli
102
+ }
103
+
104
+ if [[ "${DOTFILES_POST_APPLY_TESTING:-0}" != "1" ]]; then
105
+ main
106
+ fi