@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Alias governance checks:
4
+ # - duplicate alias names
5
+ # - risky overrides must be gated
6
+ # - no hardcoded /Users paths
7
+
8
+ set -euo pipefail
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+ manifest_script="$SCRIPT_DIR/aliases-manifest.sh"
12
+ deprecations_file="$SCRIPT_DIR/../dot/data/alias-deprecations.tsv"
13
+ policy="${DOTFILES_ALIAS_POLICY:-standard}"
14
+ if [[ -n "${CI:-}" && "${DOTFILES_ALIAS_POLICY:-}" == "" ]]; then
15
+ policy="strict"
16
+ fi
17
+
18
+ if [[ ! -x "$manifest_script" ]]; then
19
+ echo "ERROR: aliases-manifest.sh not found or not executable" >&2
20
+ exit 1
21
+ fi
22
+
23
+ tmp_manifest="$(umask 077 && mktemp)"
24
+ trap 'rm -f "$tmp_manifest"' EXIT
25
+
26
+ bash "$manifest_script" >"$tmp_manifest"
27
+
28
+ errors=0
29
+
30
+ echo "Alias Governance"
31
+ echo ""
32
+ echo "Policy: $policy"
33
+ echo ""
34
+
35
+ version_ge() {
36
+ local a="${1#v}" b="${2#v}"
37
+ local IFS=.
38
+ local i
39
+ read -r -a av <<<"$a"
40
+ read -r -a bv <<<"$b"
41
+ for i in 0 1 2; do
42
+ local ai="${av[$i]:-0}"
43
+ local bi="${bv[$i]:-0}"
44
+ ((10#$ai > 10#$bi)) && return 0
45
+ ((10#$ai < 10#$bi)) && return 1
46
+ done
47
+ return 0
48
+ }
49
+
50
+ repo_version="0.0.0"
51
+ if [[ -f "$SCRIPT_DIR/../../package.json" ]]; then
52
+ repo_version="$(sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([0-9][0-9.]*\)".*/\1/p' "$SCRIPT_DIR/../../package.json" | head -1)"
53
+ fi
54
+ repo_version="${repo_version:-0.0.0}"
55
+
56
+ # 1) Duplicate alias names
57
+ dupes="$(awk -F'\t' '{count[$1]++} END {for (k in count) if (count[k] > 1) print k}' "$tmp_manifest" | sort)"
58
+ if [[ -n "$dupes" ]]; then
59
+ if [[ "$policy" == "strict" ]]; then
60
+ echo "ERROR: duplicate alias names detected:"
61
+ printf "%s\n" "$dupes" | sed 's/^/ - /'
62
+ errors=$((errors + 1))
63
+ else
64
+ echo "WARN: duplicate alias names detected (review recommended):"
65
+ printf "%s\n" "$dupes" | sed 's/^/ - /'
66
+ fi
67
+ else
68
+ echo "OK: no duplicate alias names"
69
+ fi
70
+
71
+ # 2) Risky overrides must be gated
72
+ while IFS=$'\t' read -r name _value file _line; do
73
+ case "$name" in
74
+ cd | sudo | su | cp | mv | rm | mkdir | alias)
75
+ # GNU coreutils aliases are intentionally centralized overrides.
76
+ if [[ "$file" == *"/aliases/gnu/"* ]]; then
77
+ continue
78
+ fi
79
+ if ! rg -q 'DOTFILES_(ENABLE|SAFE|ALIAS)' "$file"; then
80
+ echo "ERROR: risky override '$name' in $file is not gated by a DOTFILES_* flag"
81
+ errors=$((errors + 1))
82
+ fi
83
+ ;;
84
+ esac
85
+ done <"$tmp_manifest"
86
+
87
+ if [[ $errors -eq 0 ]]; then
88
+ echo "OK: risky overrides are gated"
89
+ fi
90
+
91
+ # 3) Hardcoded /Users path check (alias value only)
92
+ hardcoded="$(awk -F'\t' '$2 ~ /\/Users\// {print $1 "\t" $2 "\t" $3 ":" $4}' "$tmp_manifest")"
93
+ if [[ -n "$hardcoded" ]]; then
94
+ echo "ERROR: hardcoded /Users paths detected in aliases:"
95
+ printf "%s\n" "$hardcoded" | sed 's/^/ - /'
96
+ errors=$((errors + 1))
97
+ else
98
+ echo "OK: no hardcoded /Users paths in aliases"
99
+ fi
100
+
101
+ # 4) Deprecation window enforcement
102
+ if [[ -f "$deprecations_file" ]]; then
103
+ expired_hits=0
104
+ while IFS=$'\t' read -r alias_name replacement remove_in; do
105
+ [[ -z "${alias_name:-}" ]] && continue
106
+ [[ "${alias_name:0:1}" == "#" ]] && continue
107
+ if version_ge "$repo_version" "$remove_in"; then
108
+ alias_found=0
109
+ if awk -F'\t' -v n="$alias_name" '$1==n{found=1} END{exit(found?0:1)}' "$tmp_manifest"; then
110
+ alias_found=1
111
+ fi
112
+ function_found=0
113
+ if rg -q --glob '*.sh' --glob '*.aliases.sh' --glob '*.tmpl' "^[[:space:]]*(function[[:space:]]+)?${alias_name}[[:space:]]*\\(\\)" "$SCRIPT_DIR/../../.chezmoitemplates/aliases" "$SCRIPT_DIR/../../scripts/dot"; then
114
+ function_found=1
115
+ fi
116
+ if [[ $alias_found -eq 1 || $function_found -eq 1 ]]; then
117
+ [[ $expired_hits -eq 0 ]] && echo "ERROR: expired deprecated aliases still present:"
118
+ echo " - $alias_name (remove_in=$remove_in, replacement=$replacement)"
119
+ expired_hits=$((expired_hits + 1))
120
+ fi
121
+ fi
122
+ done < <(cut -f1-3 "$deprecations_file")
123
+ if [[ $expired_hits -gt 0 ]]; then
124
+ errors=$((errors + 1))
125
+ else
126
+ echo "OK: no expired deprecated aliases (repo version: v$repo_version)"
127
+ fi
128
+ fi
129
+
130
+ echo ""
131
+ if [[ $errors -eq 0 ]]; then
132
+ echo "Alias governance checks passed."
133
+ exit 0
134
+ fi
135
+
136
+ echo "Alias governance checks failed: $errors issue(s)." >&2
137
+ exit 1
@@ -0,0 +1,73 @@
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/utils.sh
7
+ # shellcheck disable=SC1091
8
+ source "$SCRIPT_DIR/../dot/lib/utils.sh"
9
+
10
+ src_dir="$(require_source_dir)"
11
+ manifest="$src_dir/scripts/diagnostics/aliases-manifest.sh"
12
+ if [[ ! -x "$manifest" ]]; then
13
+ echo "Alias manifest not found: $manifest" >&2
14
+ exit 1
15
+ fi
16
+
17
+ cat <<'HEADER'
18
+ # Alias Cheatsheet
19
+
20
+ Auto-generated from alias manifest.
21
+
22
+ ## Core shortcuts
23
+ HEADER
24
+
25
+ # Core list we care about (preserve ordering).
26
+ core_aliases=(c q e h _ i l ll la lr lra lt lta a d)
27
+
28
+ tmp_manifest="$(umask 077 && mktemp)"
29
+ trap 'rm -f "$tmp_manifest"' EXIT
30
+ bash "$manifest" >"$tmp_manifest"
31
+
32
+ pick_alias() {
33
+ local name="$1"
34
+ shift
35
+ local value=""
36
+ local pattern
37
+ while [[ $# -gt 0 ]]; do
38
+ pattern="$1"
39
+ value="$(awk -F$'\t' -v key="$name" -v pat="$pattern" '$1==key && $3 ~ pat {print $2; exit}' "$tmp_manifest")"
40
+ [[ -n "$value" ]] && {
41
+ printf '%s\n' "$value"
42
+ return 0
43
+ }
44
+ shift
45
+ done
46
+ value="$(awk -F$'\t' -v key="$name" '$1==key {print $2; exit}' "$tmp_manifest")"
47
+ [[ -n "$value" ]] && printf '%s\n' "$value"
48
+ }
49
+
50
+ for a in "${core_aliases[@]}"; do
51
+ case "$a" in
52
+ a)
53
+ line="$(pick_alias "$a" "/ai/")"
54
+ ;;
55
+ d)
56
+ line="$(pick_alias "$a" "/system/" "/configuration/" "/docker/")"
57
+ ;;
58
+ *)
59
+ line="$(pick_alias "$a")"
60
+ ;;
61
+ esac
62
+ if [[ -n "$line" ]]; then
63
+ printf '%s\n' "- \`$a\` $line"
64
+ fi
65
+ done
66
+
67
+ cat <<'FOOTER'
68
+
69
+ ## Notes
70
+
71
+ - Regenerate: `dot aliases cheatsheet`
72
+ - Apply changes: `chezmoi apply`
73
+ FOOTER
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Emit alias manifest as TSV:
4
+ # name<TAB>value<TAB>file<TAB>line
5
+
6
+ set -euo pipefail
7
+
8
+ resolve_source_dir() {
9
+ if [[ -n "${CHEZMOI_SOURCE_DIR:-}" && -d "${CHEZMOI_SOURCE_DIR}" ]]; then
10
+ printf "%s\n" "${CHEZMOI_SOURCE_DIR}"
11
+ return
12
+ fi
13
+ if [[ -d "$HOME/.dotfiles" ]]; then
14
+ printf "%s\n" "$HOME/.dotfiles"
15
+ return
16
+ fi
17
+ if [[ -d "$HOME/.local/share/chezmoi" ]]; then
18
+ printf "%s\n" "$HOME/.local/share/chezmoi"
19
+ return
20
+ fi
21
+ return 1
22
+ }
23
+
24
+ src_dir="${1:-$(resolve_source_dir)}"
25
+
26
+ rg -n \
27
+ -e '^[[:space:]]*alias[[:space:]]+[A-Za-z0-9_.:-]+=' \
28
+ -e '^[[:space:]]*[^#"'\'']*&&[[:space:]]*alias[[:space:]]+[A-Za-z0-9_.:-]+=' \
29
+ "$src_dir/.chezmoitemplates/aliases" \
30
+ "$src_dir/.chezmoitemplates/functions" |
31
+ sed -E 's#^([^:]+):([0-9]+):.*alias[[:space:]]+([A-Za-z0-9_.:-]+)=(.*)$#\3\t\4\t\1\t\2#'
@@ -1,16 +1,56 @@
1
1
  #!/usr/bin/env bash
2
- # Enhanced Shell Benchmark with Per-Component Profiling
3
- # Usage: dot benchmark [--detailed|--profile|--compare]
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Shell Performance Benchmark.
4
+ ##
5
+ ## Measures shell startup time with per-component profiling. Uses hyperfine
6
+ ## for statistical accuracy or falls back to basic timing. Tracks history
7
+ ## for regression detection.
8
+ ##
9
+ ## # Usage
10
+ ## dot benchmark # Basic startup timing
11
+ ## dot benchmark --detailed # Per-component breakdown
12
+ ## dot benchmark --profile # zprof analysis
13
+ ## dot benchmark --compare # Compare with history
14
+ ## dot benchmark --waterfall # ASCII waterfall chart of component timings
15
+ ##
16
+ ## # Dependencies
17
+ ## - python3: Millisecond timing (required)
18
+ ## - hyperfine: Statistical benchmarking (optional, falls back to basic)
19
+ ## - jq: JSON parsing for results (optional)
20
+ ## - zsh: Target shell (required)
21
+ ##
22
+ ## # Metrics
23
+ ## | Rating | Threshold | Description |
24
+ ## |--------|-----------|-------------|
25
+ ## | Excellent | <100ms | Instant response |
26
+ ## | Good | <200ms | Responsive |
27
+ ## | Acceptable | <500ms | Noticeable delay |
28
+ ## | Slow | >500ms | Optimization needed |
29
+ ##
30
+ ## # Platform Notes
31
+ ## - macOS: Full support
32
+ ## - Linux: Full support
33
+ ## - WSL: May show higher times due to filesystem overhead
34
+ ##
35
+ ## # Output Files
36
+ ## Benchmarks saved to ~/.local/share/dotfiles/benchmarks/
37
+ ##
38
+ ## # Idempotency
39
+ ## Safe to run repeatedly. Creates timestamped history files.
4
40
 
5
41
  set -euo pipefail
6
42
 
7
- # Colors
8
- RED='\033[0;31m'
9
- GREEN='\033[0;32m'
10
- YELLOW='\033[1;33m'
11
- BLUE='\033[0;34m'
12
- CYAN='\033[0;36m'
13
- NC='\033[0m'
43
+ _cleanup_files=()
44
+ trap 'rm -f "${_cleanup_files[@]}"' EXIT
45
+
46
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
47
+ # shellcheck source=../dot/lib/ui.sh
48
+ # shellcheck disable=SC1091
49
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
50
+ # shellcheck source=../dot/lib/log.sh
51
+ # shellcheck disable=SC1091
52
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
53
+ export DOT_COMMAND="benchmark"
14
54
 
15
55
  BENCHMARK_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/benchmarks"
16
56
  mkdir -p "$BENCHMARK_DIR"
@@ -19,6 +59,7 @@ mkdir -p "$BENCHMARK_DIR"
19
59
  DETAILED=false
20
60
  PROFILE=false
21
61
  COMPARE=false
62
+ WATERFALL=false
22
63
  while [[ $# -gt 0 ]]; do
23
64
  case "$1" in
24
65
  --detailed | -d)
@@ -33,14 +74,21 @@ while [[ $# -gt 0 ]]; do
33
74
  COMPARE=true
34
75
  shift
35
76
  ;;
77
+ --waterfall | -w)
78
+ WATERFALL=true
79
+ shift
80
+ ;;
36
81
  *) shift ;;
37
82
  esac
38
83
  done
39
84
 
85
+ ui_init
86
+
40
87
  print_header() {
41
- echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
42
- echo -e "${CYAN} Shell Performance Benchmark${NC}"
43
- echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
88
+ echo ""
89
+ ui_dot_banner "Diagnostics"
90
+ ui_header "Shell Performance Benchmark"
91
+ echo ""
44
92
  }
45
93
 
46
94
  # Basic timing function
@@ -54,11 +102,14 @@ time_command() {
54
102
 
55
103
  # Per-component profiling using zprof
56
104
  run_zsh_profile() {
57
- echo -e "${BLUE}Running Zsh profiler (zprof)...${NC}\n"
105
+ ui_header "Zsh profiler (zprof)"
106
+ echo ""
58
107
 
59
108
  zsh -c '
60
109
  zmodload zsh/zprof
110
+ # shellcheck disable=SC1091
61
111
  source ~/.zshenv 2>/dev/null
112
+ # shellcheck disable=SC1091
62
113
  source ~/.config/zsh/.zshrc 2>/dev/null
63
114
  zprof
64
115
  ' 2>/dev/null | head -30
@@ -66,22 +117,26 @@ run_zsh_profile() {
66
117
 
67
118
  # Benchmark individual components
68
119
  benchmark_components() {
69
- echo -e "${BLUE}Per-Component Timing:${NC}\n"
120
+ ui_header "Per-Component Timing"
121
+ echo ""
70
122
  printf "%-35s %8s\n" "Component" "Time (ms)"
71
123
  echo "───────────────────────────────────────────────"
72
124
 
73
125
  # zshenv (bootloader)
74
126
  local zshenv_time
127
+ # shellcheck disable=SC1091
75
128
  zshenv_time=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
76
129
  printf "%-35s %8s\n" "zshenv (bootloader)" "${zshenv_time}ms"
77
130
 
78
131
  # Core shell options
79
132
  local options_time
133
+ # shellcheck disable=SC1091
80
134
  options_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
81
135
  printf "%-35s %8s\n" "rc.d/30-options.zsh" "${options_time}ms"
82
136
 
83
137
  # Zinit plugins
84
138
  local zinit_time
139
+ # shellcheck disable=SC1091
85
140
  zinit_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
86
141
  printf "%-35s %8s\n" "rc.d/20-zinit.zsh (plugins)" "${zinit_time}ms"
87
142
 
@@ -103,21 +158,110 @@ benchmark_components() {
103
158
  echo "───────────────────────────────────────────────"
104
159
  }
105
160
 
161
+ # Render ASCII waterfall chart from component timings
162
+ render_waterfall() {
163
+ ui_header "Startup Waterfall"
164
+ echo ""
165
+
166
+ local -a names=()
167
+ local -a times=()
168
+ local total_time=0
169
+
170
+ # zshenv
171
+ local t
172
+ # shellcheck disable=SC1091
173
+ t=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
174
+ names+=("zshenv (bootloader)")
175
+ times+=("$t")
176
+ total_time=$((total_time + t))
177
+
178
+ # rc.d modules
179
+ # shellcheck disable=SC1091
180
+ t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
181
+ names+=("rc.d/30-options.zsh")
182
+ times+=("$t")
183
+ total_time=$((total_time + t))
184
+
185
+ # shellcheck disable=SC1091
186
+ t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
187
+ names+=("rc.d/20-zinit (plugins)")
188
+ times+=("$t")
189
+ total_time=$((total_time + t))
190
+
191
+ # Tool inits
192
+ for tool in starship atuin zoxide fzf direnv; do
193
+ if command -v "$tool" >/dev/null 2>&1; then
194
+ case "$tool" in
195
+ starship) t=$(time_command "starship init zsh >/dev/null") ;;
196
+ atuin) t=$(time_command "atuin init zsh >/dev/null") ;;
197
+ zoxide) t=$(time_command "zoxide init zsh >/dev/null") ;;
198
+ fzf) t=$(time_command "true") ;;
199
+ direnv) t=$(time_command "direnv hook zsh >/dev/null") ;;
200
+ esac
201
+ names+=("$tool init")
202
+ times+=("$t")
203
+ total_time=$((total_time + t))
204
+ fi
205
+ done
206
+
207
+ if [[ "$total_time" -eq 0 ]]; then
208
+ ui_warn "No timing data" "Could not measure components"
209
+ return
210
+ fi
211
+
212
+ # Render bars
213
+ local bar_width=30
214
+ local i
215
+ for i in "${!names[@]}"; do
216
+ local name="${names[$i]}"
217
+ local ms="${times[$i]}"
218
+ local pct=$((ms * 100 / total_time))
219
+ local filled=$((ms * bar_width / total_time))
220
+ local empty=$((bar_width - filled))
221
+
222
+ local bar=""
223
+ local j
224
+ for ((j = 0; j < filled; j++)); do bar+="$_GL_BAR_FILL"; done
225
+ for ((j = 0; j < empty; j++)); do bar+="$_GL_BAR_EMPTY"; done
226
+
227
+ if [[ "$UI_COLOR" = "1" ]]; then
228
+ printf " %-22s %s%s%s%s%s %4dms (%2d%%)\n" \
229
+ "$name" "$GREEN" "${bar:0:$filled}" "$NORMAL$GRAY" "${bar:$filled}" "$NORMAL" "$ms" "$pct"
230
+ else
231
+ printf " %-22s %s %4dms (%2d%%)\n" "$name" "$bar" "$ms" "$pct"
232
+ fi
233
+ done
234
+
235
+ echo " ──────────────────────────────────────────────────────────"
236
+ printf " %-22s %*s %4dms\n" "Total" "$bar_width" "" "$total_time"
237
+ echo ""
238
+ }
239
+
106
240
  # Run hyperfine benchmark
107
241
  run_hyperfine() {
108
242
  if ! command -v hyperfine >/dev/null 2>&1; then
109
- echo -e "${YELLOW}hyperfine not installed. Using basic timing.${NC}"
243
+ if [[ "$UI_ENABLED" = "1" ]]; then
244
+ ui_warn "hyperfine" "not installed, using basic timing"
245
+ else
246
+ printf '%b\n' "${YELLOW}hyperfine not installed. Using basic timing.${NC}"
247
+ fi
110
248
  local times=()
111
249
  for _ in {1..5}; do
112
250
  times+=("$(time_command "zsh -i -c exit")")
113
251
  done
114
252
  local sum=0
115
253
  for t in "${times[@]}"; do sum=$((sum + t)); done
116
- echo -e "\n${GREEN}Average startup time: $((sum / 5))ms${NC}"
254
+ if [[ "$UI_ENABLED" = "1" ]]; then
255
+ ui_ok "Average startup time" "$((sum / 5))ms"
256
+ else
257
+ printf '%b\n' "\n${GREEN}Average startup time: $((sum / 5))ms${NC}"
258
+ fi
117
259
  return
118
260
  fi
119
261
 
120
- echo -e "\n${BLUE}Running hyperfine benchmark (10 runs, 3 warmup)...${NC}\n"
262
+ echo ""
263
+ ui_header "Running hyperfine benchmark"
264
+ echo ""
121
265
  hyperfine --warmup 3 --runs 10 --shell=none \
122
266
  --export-json "$BENCHMARK_DIR/latest.json" \
123
267
  'zsh -i -c exit'
@@ -131,30 +275,56 @@ run_hyperfine() {
131
275
  local max_ms
132
276
  max_ms=$(jq '.results[0].max * 1000 | floor' "$BENCHMARK_DIR/latest.json")
133
277
 
134
- echo -e "\n${GREEN}Results:${NC}"
135
- echo " Mean: ${mean_ms}ms"
136
- echo " Min: ${min_ms}ms"
137
- echo " Max: ${max_ms}ms"
278
+ echo ""
279
+ ui_header "Results"
280
+ if [[ "$UI_ENABLED" = "1" ]]; then
281
+ ui_kv "Mean:" "${mean_ms}ms"
282
+ ui_kv "Min:" "${min_ms}ms"
283
+ ui_kv "Max:" "${max_ms}ms"
284
+ else
285
+ echo " Mean: ${mean_ms}ms"
286
+ echo " Min: ${min_ms}ms"
287
+ echo " Max: ${max_ms}ms"
288
+ fi
138
289
 
139
290
  # Performance rating
140
291
  if [[ $mean_ms -lt 100 ]]; then
141
- echo -e "\n${GREEN}⚡ Excellent (<100ms)${NC}"
292
+ if [[ "$UI_ENABLED" = "1" ]]; then
293
+ ui_ok "Performance" "Excellent (<100ms)"
294
+ else
295
+ printf '%b\n' "\n${GREEN}⚡ Excellent (<100ms)${NC}"
296
+ fi
142
297
  elif [[ $mean_ms -lt 200 ]]; then
143
- echo -e "\n${GREEN}✓ Good (<200ms)${NC}"
298
+ if [[ "$UI_ENABLED" = "1" ]]; then
299
+ ui_ok "Performance" "Good (<200ms)"
300
+ else
301
+ printf '%b\n' "\n${GREEN}✓ Good (<200ms)${NC}"
302
+ fi
144
303
  elif [[ $mean_ms -lt 500 ]]; then
145
- echo -e "\n${YELLOW}⚠ Acceptable (<500ms)${NC}"
304
+ if [[ "$UI_ENABLED" = "1" ]]; then
305
+ ui_warn "Performance" "Acceptable (<500ms)"
306
+ else
307
+ printf '%b\n' "\n${YELLOW}⚠ Acceptable (<500ms)${NC}"
308
+ fi
146
309
  else
147
- echo -e "\n${RED}✗ Slow (>500ms) - optimization needed${NC}"
310
+ if [[ "$UI_ENABLED" = "1" ]]; then
311
+ ui_err "Performance" "Slow (>500ms)"
312
+ else
313
+ printf '%b\n' "\n${RED}✗ Slow (>500ms) - optimization needed${NC}"
314
+ fi
148
315
  fi
149
316
 
150
317
  # Save with timestamp for history
151
318
  cp "$BENCHMARK_DIR/latest.json" "$BENCHMARK_DIR/$(date +%Y%m%d_%H%M%S).json"
319
+ dot_log info "benchmark_complete" "mean_ms=$mean_ms" "min_ms=$min_ms" "max_ms=$max_ms"
320
+ dot_metric "shell_startup_mean" "$mean_ms" "ms"
152
321
  fi
153
322
  }
154
323
 
155
324
  # Compare with previous benchmarks
156
325
  compare_benchmarks() {
157
- echo -e "${BLUE}Benchmark History:${NC}\n"
326
+ ui_header "Benchmark History"
327
+ echo ""
158
328
 
159
329
  local files
160
330
  files=$(find "$BENCHMARK_DIR" -name "*.json" -type f | sort -r | head -10)
@@ -188,6 +358,8 @@ if $PROFILE; then
188
358
  run_zsh_profile
189
359
  elif $COMPARE; then
190
360
  compare_benchmarks
361
+ elif $WATERFALL; then
362
+ render_waterfall
191
363
  elif $DETAILED; then
192
364
  benchmark_components
193
365
  echo ""
@@ -196,6 +368,14 @@ else
196
368
  run_hyperfine
197
369
  fi
198
370
 
199
- echo -e "\n${CYAN}Tip: Run 'dot benchmark --detailed' for per-component timing${NC}"
200
- echo -e "${CYAN} Run 'dot benchmark --profile' for zprof analysis${NC}"
201
- echo -e "${CYAN} Run 'dot benchmark --compare' for history${NC}\n"
371
+ if [[ "$UI_ENABLED" = "1" ]]; then
372
+ echo ""
373
+ ui_info "Tip" "dot benchmark --detailed"
374
+ ui_info "Tip" "dot benchmark --profile"
375
+ ui_info "Tip" "dot benchmark --waterfall"
376
+ else
377
+ printf '%b\n' "\n${CYAN}Tip: Run 'dot benchmark --detailed' for per-component timing${NC}"
378
+ printf '%b\n' "${CYAN} Run 'dot benchmark --profile' for zprof analysis${NC}"
379
+ printf '%b\n' "${CYAN} Run 'dot benchmark --waterfall' for ASCII waterfall chart${NC}"
380
+ fi
381
+ printf '%b\n' "${CYAN} Run 'dot benchmark --compare' for history${NC}\n"
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Alias/Command Conflicts Report
4
+ # Usage: dot conflicts
5
+
6
+ set -euo pipefail
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ # shellcheck source=../dot/lib/ui.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
12
+
13
+ ui_init
14
+
15
+ resolve_source_dir() {
16
+ if [[ -n "${CHEZMOI_SOURCE_DIR:-}" && -d "$CHEZMOI_SOURCE_DIR" ]]; then
17
+ printf "%s\n" "$CHEZMOI_SOURCE_DIR"
18
+ return
19
+ fi
20
+ if [[ -d "$HOME/.dotfiles" ]]; then
21
+ printf "%s\n" "$HOME/.dotfiles"
22
+ return
23
+ fi
24
+ if [[ -d "$HOME/.local/share/chezmoi" ]]; then
25
+ printf "%s\n" "$HOME/.local/share/chezmoi"
26
+ return
27
+ fi
28
+ return 1
29
+ }
30
+
31
+ src_dir=$(resolve_source_dir)
32
+ manifest="$src_dir/scripts/diagnostics/aliases-manifest.sh"
33
+ if [[ ! -x "$manifest" ]]; then
34
+ ui_err "Alias manifest" "not found"
35
+ exit 1
36
+ fi
37
+
38
+ tmp_manifest=$(umask 077 && mktemp)
39
+ trap 'rm -f "$tmp_manifest"' EXIT
40
+ bash "$manifest" >"$tmp_manifest"
41
+
42
+ ui_header "Alias & Command Conflicts"
43
+
44
+ ui_section "Duplicate alias definitions"
45
+
46
+ dupes=$(awk -F$'\t' '{print $1}' "$tmp_manifest" | sort | uniq -d)
47
+ if [[ -z "$dupes" ]]; then
48
+ ui_ok "Aliases" "No duplicate alias names"
49
+ else
50
+ while IFS= read -r name; do
51
+ [[ -z "$name" ]] && continue
52
+ ui_warn "Alias" "${name} defined multiple times"
53
+ awk -F$'\t' -v k="$name" '$1==k {printf " - %s (%s:%s)\n", $2, $3, $4}' "$tmp_manifest"
54
+ done <<<"$dupes"
55
+ fi
56
+
57
+ ui_section "Alias shadows real commands"
58
+ shadow_found=false
59
+ while IFS=$'\t' read -r name value _; do
60
+ if command -v "$name" >/dev/null 2>&1; then
61
+ shadow_found=true
62
+ ui_warn "Shadow" "${name} -> ${value} (also command)"
63
+ fi
64
+ done <"$tmp_manifest"
65
+
66
+ if ! $shadow_found; then
67
+ ui_ok "Shadowing" "No alias shadows detected"
68
+ fi
69
+
70
+ ui_section "Quick actions"
71
+ ui_info "List aliases" "dot aliases list"
72
+ ui_info "Regenerate cheatsheet" "dot aliases cheatsheet"