@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
@@ -1,241 +0,0 @@
1
- # Dotfiles Test Suite
2
-
3
- A comprehensive shell testing framework for validating dotfiles functionality.
4
-
5
- ## Directory Structure
6
-
7
- ```
8
- scripts/tests/
9
- ├── framework/
10
- │ ├── test_runner.sh # Main test runner
11
- │ ├── assertions.sh # Assert functions
12
- │ └── mocks.sh # Mock utilities
13
- ├── unit/
14
- │ ├── test_extract.sh # Tests for extract function
15
- │ ├── test_backup.sh # Tests for backup function
16
- │ ├── test_genpass.sh # Tests for genpass function
17
- │ ├── test_rd.sh # Tests for rd function
18
- │ └── test_cd_aliases.sh # Tests for cd aliases
19
- ├── integration/
20
- │ └── test_install.sh # Tests for install.sh
21
- └── README.md # This file
22
- ```
23
-
24
- ## Quick Start
25
-
26
- ### Run All Unit Tests
27
-
28
- ```bash
29
- ./scripts/tests/framework/test_runner.sh
30
- ```
31
-
32
- ### Run Specific Test
33
-
34
- ```bash
35
- # Run only extract tests
36
- ./scripts/tests/framework/test_runner.sh extract
37
-
38
- # Run only backup tests
39
- ./scripts/tests/framework/test_runner.sh backup
40
-
41
- # Run only genpass tests
42
- ./scripts/tests/framework/test_runner.sh genpass
43
- ```
44
-
45
- ### Run with Integration Tests
46
-
47
- ```bash
48
- # Using environment variable
49
- RUN_INTEGRATION=1 ./scripts/tests/framework/test_runner.sh
50
-
51
- # Using flag
52
- ./scripts/tests/framework/test_runner.sh -i
53
- ```
54
-
55
- ### Run Individual Test File
56
-
57
- ```bash
58
- # Source assertions and run directly
59
- source ./scripts/tests/framework/assertions.sh
60
- source ./scripts/tests/unit/test_extract.sh
61
- print_summary
62
- ```
63
-
64
- ## Test Framework
65
-
66
- ### Assertions
67
-
68
- The framework provides these assertion functions:
69
-
70
- | Function | Description |
71
- |----------|-------------|
72
- | `assert_equals expected actual [msg]` | Assert two values are equal |
73
- | `assert_not_equals unexpected actual [msg]` | Assert two values differ |
74
- | `assert_exit_code code command` | Assert command exits with code |
75
- | `assert_output_contains needle command` | Assert output contains string |
76
- | `assert_output_not_contains needle command` | Assert output lacks string |
77
- | `assert_output_matches pattern command` | Assert output matches regex |
78
- | `assert_file_exists path [msg]` | Assert file exists |
79
- | `assert_file_not_exists path [msg]` | Assert file doesn't exist |
80
- | `assert_dir_exists path [msg]` | Assert directory exists |
81
- | `assert_dir_not_exists path [msg]` | Assert directory doesn't exist |
82
- | `assert_true condition [msg]` | Assert condition is true |
83
- | `assert_false condition [msg]` | Assert condition is false |
84
- | `assert_empty value [msg]` | Assert string is empty |
85
- | `assert_not_empty value [msg]` | Assert string is not empty |
86
- | `assert_file_contains file needle [msg]` | Assert file contains text |
87
-
88
- ### Mocks
89
-
90
- The mock library provides utilities for test isolation:
91
-
92
- | Function | Description |
93
- |----------|-------------|
94
- | `mock_init` | Initialize mock environment |
95
- | `mock_command name output [exit_code]` | Create mock command |
96
- | `mock_command_spy name [output] [exit_code]` | Create mock that records calls |
97
- | `mock_get_calls name` | Get spy call history |
98
- | `mock_call_count name` | Get number of spy calls |
99
- | `mock_file content [filename]` | Create temp file with content |
100
- | `mock_dir [prefix]` | Create temp directory |
101
- | `mock_archive type [content]` | Create mock archive file |
102
- | `mock_env var_name value` | Set environment variable |
103
- | `mock_cleanup` | Clean up all mocks |
104
-
105
- ## Writing Tests
106
-
107
- ### Basic Test Structure
108
-
109
- ```bash
110
- #!/usr/bin/env bash
111
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
112
- source "$SCRIPT_DIR/../framework/assertions.sh"
113
- source "$SCRIPT_DIR/../framework/mocks.sh"
114
-
115
- # Source function being tested
116
- source "$REPO_ROOT/.chezmoitemplates/functions/myfunction.sh"
117
-
118
- # Test case
119
- test_start "my_function_basic"
120
- output=$(myfunction "arg" 2>&1)
121
- assert_equals "expected" "$output" "should return expected"
122
-
123
- # Another test
124
- test_start "my_function_error"
125
- output=$(myfunction 2>&1)
126
- exit_code=$?
127
- assert_equals "1" "$exit_code" "should fail without args"
128
- ```
129
-
130
- ### Using Mocks
131
-
132
- ```bash
133
- test_start "function_with_mock"
134
- # Create temp directory
135
- test_dir=$(mock_dir "test")
136
- test_file="$test_dir/file.txt"
137
- echo "content" > "$test_file"
138
-
139
- # Run test
140
- result=$(myfunction "$test_file")
141
-
142
- # Verify
143
- assert_equals "expected" "$result"
144
-
145
- # Cleanup is automatic via trap
146
- ```
147
-
148
- ### Test Naming Convention
149
-
150
- - Test files: `test_<functionality>.sh`
151
- - Test functions: Descriptive names with `test_start`
152
- - Example: `test_start "extract_handles_missing_file"`
153
-
154
- ## Environment Variables
155
-
156
- | Variable | Default | Description |
157
- |----------|---------|-------------|
158
- | `RUN_INTEGRATION` | `0` | Set to `1` to run integration tests |
159
- | `VERBOSE` | `0` | Set to `1` for verbose output |
160
- | `REPO_ROOT` | Auto-detected | Repository root directory |
161
- | `TESTS_DIR` | Auto-detected | Tests directory |
162
-
163
- ## Test Categories
164
-
165
- ### Unit Tests
166
-
167
- Located in `scripts/tests/unit/`. These test individual functions in isolation:
168
-
169
- - **test_extract.sh** - Archive extraction function
170
- - **test_backup.sh** - Backup creation function
171
- - **test_genpass.sh** - Password generation function
172
- - **test_rd.sh** - Directory removal function (with security tests)
173
- - **test_cd_aliases.sh** - Directory navigation aliases
174
-
175
- ### Integration Tests
176
-
177
- Located in `scripts/tests/integration/`. These test complete workflows:
178
-
179
- - **test_install.sh** - Installation script validation
180
-
181
- ## CI/CD Integration
182
-
183
- Add to your CI pipeline:
184
-
185
- ```yaml
186
- # GitHub Actions example
187
- - name: Run Tests
188
- run: |
189
- chmod +x ./scripts/tests/framework/test_runner.sh
190
- ./scripts/tests/framework/test_runner.sh
191
-
192
- - name: Run Integration Tests
193
- run: |
194
- RUN_INTEGRATION=1 ./scripts/tests/framework/test_runner.sh
195
- ```
196
-
197
- ## Best Practices
198
-
199
- 1. **Isolation**: Each test should be independent
200
- 2. **Cleanup**: Use mocks that auto-cleanup via traps
201
- 3. **No Sleep**: Avoid `sleep` or hardcoded delays
202
- 4. **Descriptive Names**: Test names should describe what's being tested
203
- 5. **Edge Cases**: Test error conditions, not just happy paths
204
- 6. **Security**: Include tests for dangerous input rejection
205
-
206
- ## Troubleshooting
207
-
208
- ### Tests Not Found
209
-
210
- Ensure test files match the pattern `test_*.sh` and are executable:
211
-
212
- ```bash
213
- chmod +x scripts/tests/unit/test_*.sh
214
- chmod +x scripts/tests/integration/test_*.sh
215
- ```
216
-
217
- ### Function Not Available
218
-
219
- If a test shows "function not available", the source file may not exist:
220
-
221
- ```bash
222
- # Check if function file exists
223
- ls -la .chezmoitemplates/functions/
224
- ```
225
-
226
- ### Mock Cleanup Issues
227
-
228
- If mocks aren't cleaning up, ensure you're not running with `set -e` before mock operations that might fail.
229
-
230
- ## Contributing
231
-
232
- When adding new functions to the dotfiles:
233
-
234
- 1. Create corresponding test file in `unit/`
235
- 2. Test happy path and error conditions
236
- 3. Include security-relevant test cases
237
- 4. Run full test suite before committing
238
-
239
- ---
240
-
241
- Made with ❤️ by [Sebastien Rousseau](https://github.com/sebastienrousseau)
@@ -1,91 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- # standard-benchmarks.sh
4
- # Measures shell startup time (total and per-component).
5
- # Optional threshold enforcement via DOTFILES_BENCH_MAX_MS.
6
-
7
- set -euo pipefail
8
-
9
- log_info() { echo -e "\n[INFO] $*"; }
10
-
11
- MAX_MS="${DOTFILES_BENCH_MAX_MS:-}"
12
-
13
- # ── Section 1: Total startup benchmark ──────────────────────────
14
- log_info "=== Total Startup Benchmark ==="
15
-
16
- if command -v hyperfine >/dev/null; then
17
- log_info "Running benchmark with hyperfine..."
18
- tmp_json="$(mktemp)"
19
- hyperfine --warmup 3 --min-runs 10 --export-json "$tmp_json" "zsh -i -c exit"
20
-
21
- if [[ -n "$MAX_MS" ]] && command -v python3 >/dev/null; then
22
- python3 - "$tmp_json" "$MAX_MS" <<'PY'
23
- import json, sys
24
- path, max_ms = sys.argv[1], float(sys.argv[2])
25
- with open(path, "r", encoding="utf-8") as f:
26
- data = json.load(f)
27
- mean_s = data["results"][0]["mean"]
28
- mean_ms = mean_s * 1000.0
29
- print(f"[INFO] Mean startup: {mean_ms:.1f} ms (limit: {max_ms:.1f} ms)")
30
- if mean_ms > max_ms:
31
- print(f"[FAIL] Startup time exceeded limit: {mean_ms:.1f} ms > {max_ms:.1f} ms")
32
- sys.exit(1)
33
- PY
34
- fi
35
- rm -f "$tmp_json"
36
- else
37
- log_info "Hyperfine not found. Using simple loop..."
38
- echo "Running 10 iterations of 'zsh -i -c exit'..."
39
- for _ in {1..10}; do
40
- time zsh -i -c exit
41
- done
42
- fi
43
-
44
- # ── Section 2: Component-level profiling ────────────────────────
45
- log_info "=== Component-Level Profile ==="
46
- log_info "Profiling individual zshrc components via zsh/zprof..."
47
-
48
- # Use zsh's built-in zprof module if available
49
- if command -v zsh >/dev/null; then
50
- zsh -c '
51
- zmodload zsh/zprof 2>/dev/null
52
- # Source the real zshrc (DOTFILES_SOURCED guard is reset in a fresh shell)
53
- [[ -f "$HOME/.zshrc" ]] && source "$HOME/.zshrc"
54
- zprof
55
- ' 2>/dev/null | head -40
56
-
57
- echo ""
58
- log_info "Component timing (manual measurement):"
59
-
60
- # Measure key init commands individually
61
- _bench_component() {
62
- local label="$1"
63
- shift
64
- local start end elapsed
65
- if command -v perl >/dev/null 2>&1; then
66
- start=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
67
- zsh -c "$*" >/dev/null 2>&1 || true
68
- end=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
69
- else
70
- start=$(($(date +%s) * 1000))
71
- zsh -c "$*" >/dev/null 2>&1 || true
72
- end=$(($(date +%s) * 1000))
73
- fi
74
- elapsed=$((end - start))
75
- printf " %-30s %4d ms\n" "$label" "$elapsed"
76
- }
77
-
78
- _bench_component "bare zsh (baseline)" "exit"
79
- _bench_component "zinit + plugins" "source \"\${XDG_DATA_HOME:-\$HOME/.local/share}/zinit/zinit.git/zinit.zsh\" 2>/dev/null; exit"
80
- _bench_component "compinit" "autoload -Uz compinit && compinit -C; exit"
81
- _bench_component "starship init" "command -v starship >/dev/null && eval \"\$(starship init zsh)\"; exit"
82
- _bench_component "atuin init" "command -v atuin >/dev/null && eval \"\$(atuin init zsh)\"; exit"
83
- _bench_component "zoxide init" "command -v zoxide >/dev/null && eval \"\$(zoxide init zsh)\"; exit"
84
- _bench_component "fnm env" "command -v fnm >/dev/null && eval \"\$(fnm env --use-on-cd)\"; exit"
85
- _bench_component "fzf completions" "[[ -f /opt/homebrew/opt/fzf/shell/completion.zsh ]] && source /opt/homebrew/opt/fzf/shell/completion.zsh; exit"
86
-
87
- echo ""
88
- log_info "Component profiling complete."
89
- else
90
- echo "[WARN] zsh not found, skipping component profiling."
91
- fi
@@ -1,283 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC2034
3
- # Assertion library for shell tests
4
- # Provides a comprehensive set of assertion functions for testing shell scripts
5
- #
6
- # Security note: This file uses eval to execute test commands and conditions.
7
- # This is intentional and necessary for the test assertion framework to work.
8
- # These functions are only used in test code and should never be called with
9
- # untrusted input. All eval calls carry a shellcheck disable directive.
10
-
11
- TESTS_RUN=0
12
- TESTS_PASSED=0
13
- TESTS_FAILED=0
14
- CURRENT_TEST=""
15
-
16
- # Colors
17
- RED='\033[0;31m'
18
- GREEN='\033[0;32m'
19
- YELLOW='\033[0;33m'
20
- NC='\033[0m'
21
-
22
- # Start a new test case
23
- test_start() {
24
- CURRENT_TEST="$1"
25
- ((TESTS_RUN++)) || true
26
- }
27
-
28
- # Assert two values are equal
29
- assert_equals() {
30
- local expected="$1" actual="$2" msg="${3:-values should be equal}"
31
- if [[ "$expected" == "$actual" ]]; then
32
- ((TESTS_PASSED++)) || true
33
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
34
- return 0
35
- else
36
- ((TESTS_FAILED++)) || true
37
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
38
- echo -e " Expected: '$expected'"
39
- echo -e " Actual: '$actual'"
40
- return 1
41
- fi
42
- }
43
-
44
- # Assert two values are not equal
45
- assert_not_equals() {
46
- local unexpected="$1" actual="$2" msg="${3:-values should differ}"
47
- if [[ "$unexpected" != "$actual" ]]; then
48
- ((TESTS_PASSED++)) || true
49
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
50
- return 0
51
- else
52
- ((TESTS_FAILED++)) || true
53
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
54
- echo -e " Unexpected: '$unexpected'"
55
- echo -e " Actual: '$actual'"
56
- return 1
57
- fi
58
- }
59
-
60
- # Assert a command exits with expected code
61
- assert_exit_code() {
62
- local expected="$1"
63
- shift
64
- local cmd="$*"
65
- local actual
66
- set +e
67
- # shellcheck disable=SC2086
68
- eval "$cmd" </dev/null >/dev/null 2>&1
69
- actual=$?
70
- set -e
71
- assert_equals "$expected" "$actual" "exit code for: $cmd"
72
- }
73
-
74
- # Assert command output contains expected string
75
- assert_output_contains() {
76
- local needle="$1"
77
- shift
78
- local cmd="$*"
79
- local output
80
- # shellcheck disable=SC2086
81
- output=$(eval "$cmd" 2>&1) || true
82
- if [[ "$output" == *"$needle"* ]]; then
83
- ((TESTS_PASSED++)) || true
84
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains '$needle'"
85
- return 0
86
- else
87
- ((TESTS_FAILED++)) || true
88
- echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain '$needle'"
89
- echo -e " Actual output: $output"
90
- return 1
91
- fi
92
- }
93
-
94
- # Assert command output does NOT contain a string
95
- assert_output_not_contains() {
96
- local needle="$1"
97
- shift
98
- local cmd="$*"
99
- local output
100
- # shellcheck disable=SC2086
101
- output=$(eval "$cmd" 2>&1) || true
102
- if [[ "$output" != *"$needle"* ]]; then
103
- ((TESTS_PASSED++)) || true
104
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output does not contain '$needle'"
105
- return 0
106
- else
107
- ((TESTS_FAILED++)) || true
108
- echo -e " ${RED}✗${NC} $CURRENT_TEST: output should not contain '$needle'"
109
- echo -e " Actual output: $output"
110
- return 1
111
- fi
112
- }
113
-
114
- # Assert command output matches regex pattern
115
- assert_output_matches() {
116
- local pattern="$1"
117
- shift
118
- local cmd="$*"
119
- local output
120
- # shellcheck disable=SC2086
121
- output=$(eval "$cmd" 2>&1) || true
122
- if [[ "$output" =~ $pattern ]]; then
123
- ((TESTS_PASSED++)) || true
124
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output matches pattern '$pattern'"
125
- return 0
126
- else
127
- ((TESTS_FAILED++)) || true
128
- echo -e " ${RED}✗${NC} $CURRENT_TEST: output should match pattern '$pattern'"
129
- echo -e " Actual output: $output"
130
- return 1
131
- fi
132
- }
133
-
134
- # Assert file exists
135
- assert_file_exists() {
136
- local file="$1" msg="${2:-file should exist}"
137
- if [[ -f "$file" ]]; then
138
- ((TESTS_PASSED++)) || true
139
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
140
- return 0
141
- else
142
- ((TESTS_FAILED++)) || true
143
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file not found)"
144
- return 1
145
- fi
146
- }
147
-
148
- # Assert file does not exist
149
- assert_file_not_exists() {
150
- local file="$1" msg="${2:-file should not exist}"
151
- if [[ ! -f "$file" ]]; then
152
- ((TESTS_PASSED++)) || true
153
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
154
- return 0
155
- else
156
- ((TESTS_FAILED++)) || true
157
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file exists)"
158
- return 1
159
- fi
160
- }
161
-
162
- # Assert directory exists
163
- assert_dir_exists() {
164
- local dir="$1" msg="${2:-directory should exist}"
165
- if [[ -d "$dir" ]]; then
166
- ((TESTS_PASSED++)) || true
167
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
168
- return 0
169
- else
170
- ((TESTS_FAILED++)) || true
171
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir not found)"
172
- return 1
173
- fi
174
- }
175
-
176
- # Assert directory does not exist
177
- assert_dir_not_exists() {
178
- local dir="$1" msg="${2:-directory should not exist}"
179
- if [[ ! -d "$dir" ]]; then
180
- ((TESTS_PASSED++)) || true
181
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
182
- return 0
183
- else
184
- ((TESTS_FAILED++)) || true
185
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir exists)"
186
- return 1
187
- fi
188
- }
189
-
190
- # Assert a condition is true
191
- assert_true() {
192
- local condition="$1" msg="${2:-condition should be true}"
193
- # shellcheck disable=SC2086
194
- if eval "$condition"; then
195
- ((TESTS_PASSED++)) || true
196
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
197
- return 0
198
- else
199
- ((TESTS_FAILED++)) || true
200
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
201
- return 1
202
- fi
203
- }
204
-
205
- # Assert a condition is false
206
- assert_false() {
207
- local condition="$1" msg="${2:-condition should be false}"
208
- # shellcheck disable=SC2086
209
- if ! eval "$condition"; then
210
- ((TESTS_PASSED++)) || true
211
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
212
- return 0
213
- else
214
- ((TESTS_FAILED++)) || true
215
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
216
- return 1
217
- fi
218
- }
219
-
220
- # Assert string is empty
221
- assert_empty() {
222
- local value="$1" msg="${2:-value should be empty}"
223
- if [[ -z "$value" ]]; then
224
- ((TESTS_PASSED++)) || true
225
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
226
- return 0
227
- else
228
- ((TESTS_FAILED++)) || true
229
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
230
- echo -e " Actual: '$value'"
231
- return 1
232
- fi
233
- }
234
-
235
- # Assert string is not empty
236
- assert_not_empty() {
237
- local value="$1" msg="${2:-value should not be empty}"
238
- if [[ -n "$value" ]]; then
239
- ((TESTS_PASSED++)) || true
240
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
241
- return 0
242
- else
243
- ((TESTS_FAILED++)) || true
244
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
245
- return 1
246
- fi
247
- }
248
-
249
- # Assert file contains text (uses fixed-string matching for safety)
250
- assert_file_contains() {
251
- local file="$1" needle="$2" msg="${3:-file should contain text}"
252
- if [[ -z "$file" ]]; then
253
- ((TESTS_FAILED++)) || true
254
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg (no file path provided)"
255
- return 1
256
- fi
257
- if [[ -f "$file" ]] && grep -qF "$needle" "$file"; then
258
- ((TESTS_PASSED++)) || true
259
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
260
- return 0
261
- else
262
- ((TESTS_FAILED++)) || true
263
- echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
264
- return 1
265
- fi
266
- }
267
-
268
- # Print test summary
269
- print_summary() {
270
- echo ""
271
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
272
- echo -e "Tests run: $TESTS_RUN"
273
- echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
274
- echo -e "${RED}Failed: $TESTS_FAILED${NC}"
275
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
276
- # Output machine-readable results for test_runner.sh
277
- echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
278
-
279
- if [[ $TESTS_FAILED -gt 0 ]]; then
280
- return 1
281
- fi
282
- return 0
283
- }