@sebastienrousseau/dotfiles 0.2.469 → 0.2.481

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 (490) hide show
  1. package/CHANGELOG.md +285 -0
  2. package/README.md +236 -319
  3. package/docs/ALIASES.md +128 -0
  4. package/docs/ARCHITECTURE.md +229 -0
  5. package/docs/COMPLIANCE.md +47 -0
  6. package/docs/COPYRIGHT +7 -0
  7. package/docs/FEATURES.md +166 -0
  8. package/docs/FONTS.md +147 -0
  9. package/docs/INSTALL.md +119 -0
  10. package/docs/KEYS.md +40 -0
  11. package/docs/KEY_ROTATION.md +219 -0
  12. package/docs/LEGACY_ROADMAP.md +142 -0
  13. package/docs/NEOVIM_IDE_GUIDE.md +52 -0
  14. package/docs/OPERATIONS.md +130 -0
  15. package/docs/PLAN.md +161 -0
  16. package/docs/PR_DESCRIPTION.md +149 -0
  17. package/docs/README.md +269 -0
  18. package/docs/REPO_AUDIT.md +23 -0
  19. package/docs/ROADMAP.md +148 -0
  20. package/docs/SCREENSHOTS.md +116 -0
  21. package/docs/SECRETS.md +76 -0
  22. package/docs/SECURITY.md +30 -0
  23. package/docs/SECURITY_CHECKLIST.md +25 -0
  24. package/docs/TASK.md +99 -0
  25. package/docs/TESTING.md +190 -0
  26. package/docs/TOOLS.md +146 -0
  27. package/docs/TROUBLESHOOTING.md +112 -0
  28. package/docs/UTILS.md +105 -0
  29. package/docs/WALKTHROUGH.md +165 -0
  30. package/docs/WSL2_NIX_TROUBLESHOOTING.md +723 -0
  31. package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
  32. package/docs/adr/ADR-002-shell-performance.md +121 -0
  33. package/docs/adr/ADR-003-security-first.md +140 -0
  34. package/docs/adr/ADR-004-cli-architecture.md +157 -0
  35. package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
  36. package/docs/adr/ADR-006-shell-selection.md +115 -0
  37. package/docs/adr/README.md +33 -0
  38. package/docs/themes/README.md +20 -0
  39. package/dot_config/aider/aider.conf.yml +32 -0
  40. package/dot_config/alacritty/alacritty.toml.tmpl +483 -0
  41. package/dot_config/ansible/ansible.cfg.tmpl +11 -0
  42. package/dot_config/atuin/config.toml +23 -0
  43. package/dot_config/bat/config +8 -0
  44. package/dot_config/brave-flags.conf.tmpl +7 -0
  45. package/dot_config/btop/btop.conf +16 -0
  46. package/dot_config/btop/themes/tokyonight.theme +34 -0
  47. package/dot_config/bun/bunfig.toml.tmpl +33 -0
  48. package/dot_config/claude/mcp_servers.json +49 -0
  49. package/dot_config/clippy.toml +55 -0
  50. package/dot_config/containers/containers.conf +14 -0
  51. package/dot_config/curl/dot_curlrc +18 -0
  52. package/dot_config/dlv/config.yml +39 -0
  53. package/dot_config/docker/config.json.tmpl +15 -0
  54. package/dot_config/dotfiles/boot/README.md +11 -0
  55. package/dot_config/dotfiles/grub/README.md +11 -0
  56. package/dot_config/dotfiles/lock/README.md +11 -0
  57. package/dot_config/dotfiles/versions.env.tmpl +19 -0
  58. package/dot_config/duf/duf.conf +6 -0
  59. package/dot_config/duti/defaults.duti +5 -0
  60. package/dot_config/emoji/emoji.txt +34 -0
  61. package/dot_config/fastfetch/config.jsonc +28 -0
  62. package/dot_config/firefox/user.js +8 -0
  63. package/dot_config/flatpak/flatpak.list +4 -0
  64. package/dot_config/fontconfig/fonts.conf.tmpl +44 -0
  65. package/dot_config/gh/config.yml +12 -0
  66. package/dot_config/ghostty/config.tmpl +661 -0
  67. package/dot_config/git/attributes +12 -0
  68. package/dot_config/git/config.tmpl +77 -0
  69. package/dot_config/git/ignore +27 -0
  70. package/dot_config/gnupg/gpg-agent.conf.tmpl +11 -0
  71. package/dot_config/go/aliases.sh +61 -0
  72. package/dot_config/go/env.sh +24 -0
  73. package/dot_config/go/golangci.yml +118 -0
  74. package/dot_config/go/gopls.json +30 -0
  75. package/dot_config/goose/config.yaml +29 -0
  76. package/dot_config/gtk-3.0/gtk.css.tmpl +305 -0
  77. package/dot_config/gtk-3.0/settings.ini.tmpl +66 -0
  78. package/dot_config/gtk-4.0/gtk.css.tmpl +309 -0
  79. package/dot_config/gtk-4.0/settings.ini.tmpl +21 -0
  80. package/dot_config/htop/htoprc +20 -0
  81. package/dot_config/ice/README.md +13 -0
  82. package/dot_config/inputrc +2 -0
  83. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +5 -0
  84. package/dot_config/just/justfile +104 -0
  85. package/dot_config/k9s/config.yaml.tmpl +65 -0
  86. package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
  87. package/dot_config/karabiner/karabiner.json +14 -0
  88. package/dot_config/kitty/kitty.conf.tmpl +517 -0
  89. package/dot_config/lazydocker/config.yml +186 -0
  90. package/dot_config/lazygit/config.yml +23 -0
  91. package/dot_config/lsd/config.yaml +19 -0
  92. package/dot_config/mas/masapps.txt +5 -0
  93. package/dot_config/minikube/config.json +13 -0
  94. package/dot_config/mise/config.toml +41 -0
  95. package/dot_config/mongosh/mongoshrc.js +67 -0
  96. package/dot_config/mycli/myclirc +67 -0
  97. package/dot_config/nano/nanorc +28 -0
  98. package/dot_config/ncdu/config +12 -0
  99. package/dot_config/nvim/init.lua +4 -0
  100. package/dot_config/nvim/lazy-lock.json +27 -0
  101. package/dot_config/nvim/lua/config/autocmds.lua +63 -0
  102. package/dot_config/nvim/lua/config/keymaps.lua +87 -0
  103. package/dot_config/nvim/lua/config/lazy.lua +34 -0
  104. package/dot_config/nvim/lua/config/options.lua +48 -0
  105. package/dot_config/nvim/lua/plugins/coding.lua +234 -0
  106. package/dot_config/nvim/lua/plugins/dap.lua +201 -0
  107. package/dot_config/nvim/lua/plugins/editor.lua +59 -0
  108. package/dot_config/nvim/lua/plugins/git.lua +9 -0
  109. package/dot_config/nvim/lua/plugins/lsp.lua +221 -0
  110. package/dot_config/nvim/lua/plugins/markdown.lua +17 -0
  111. package/dot_config/nvim/lua/plugins/rust.lua +33 -0
  112. package/dot_config/nvim/lua/plugins/sessions.lua +32 -0
  113. package/dot_config/nvim/lua/plugins/ui.lua +537 -0
  114. package/dot_config/nvim/snippets/all.lua +9 -0
  115. package/dot_config/nvim/snippets/python.lua +16 -0
  116. package/dot_config/pip/pip.conf.tmpl +32 -0
  117. package/dot_config/pypoetry/config.toml.tmpl +6 -0
  118. package/dot_config/pyrightconfig.json.tmpl +5 -0
  119. package/dot_config/raycast/README.md +13 -0
  120. package/dot_config/redis/redisclirc +41 -0
  121. package/dot_config/shell/00-container-detect.sh +53 -0
  122. package/dot_config/shell/00-core-paths.sh.tmpl +95 -0
  123. package/dot_config/shell/05-core-safety.sh.tmpl +13 -0
  124. package/dot_config/shell/40-ls-colors.sh.tmpl +31 -0
  125. package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
  126. package/dot_config/shell/90-theme-switch.sh +70 -0
  127. package/dot_config/shell/90-ux-aliases.sh.tmpl +35 -0
  128. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +23 -0
  129. package/dot_config/shell/Brewfile +207 -0
  130. package/dot_config/shell/Brewfile.cask +92 -0
  131. package/dot_config/shell/Brewfile.cli +119 -0
  132. package/dot_config/shell/README.md +267 -0
  133. package/dot_config/shell/custom/context_suggest.zsh +68 -0
  134. package/dot_config/shell/custom/error_analysis.zsh +45 -0
  135. package/dot_config/sops/dot_sops.yaml +23 -0
  136. package/dot_config/starship.toml.tmpl +124 -0
  137. package/dot_config/task/Taskfile.yml +86 -0
  138. package/dot_config/tflint/tflint.hcl.tmpl +9 -0
  139. package/dot_config/tmux/tmux.conf.tmpl +181 -0
  140. package/dot_config/topgrade/topgrade.toml.tmpl +42 -0
  141. package/dot_config/vscode/extensions.txt +11 -0
  142. package/dot_config/vscode/settings.json.tmpl +123 -0
  143. package/dot_config/waybar/style.css +8 -0
  144. package/dot_config/wezterm/wezterm.lua.tmpl +236 -0
  145. package/dot_config/wget/wgetrc +12 -0
  146. package/dot_config/yarn/yarnrc.yml.tmpl +36 -0
  147. package/dot_config/yazi/yazi.toml +40 -0
  148. package/dot_config/zellij/config.kdl +79 -0
  149. package/dot_config/zsh/dot_zprofile +13 -0
  150. package/dot_config/zsh/dot_zshenv +6 -0
  151. package/dot_config/zsh/dot_zshrc.tmpl +199 -0
  152. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +5 -0
  153. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
  154. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +22 -0
  155. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +123 -0
  156. package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +20 -0
  157. package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +9 -0
  158. package/dot_local/bin/executable_ai_core +130 -0
  159. package/dot_local/bin/executable_b64 +59 -0
  160. package/dot_local/bin/executable_dot +178 -0
  161. package/dot_local/bin/executable_dot_completion +55 -0
  162. package/dot_local/bin/executable_epoch +62 -0
  163. package/dot_local/bin/executable_extract +108 -0
  164. package/dot_local/bin/executable_git-ai-commit +160 -0
  165. package/dot_local/bin/executable_git-ai-diff +154 -0
  166. package/dot_local/bin/executable_hash +123 -0
  167. package/dot_local/bin/executable_hex +79 -0
  168. package/dot_local/bin/executable_ip +37 -0
  169. package/dot_local/bin/executable_jsonv +54 -0
  170. package/dot_local/bin/executable_jwt +78 -0
  171. package/dot_local/bin/executable_kill-port +59 -0
  172. package/dot_local/bin/executable_lorem +103 -0
  173. package/dot_local/bin/executable_regex +96 -0
  174. package/dot_local/bin/executable_tmux-sessionizer +187 -0
  175. package/dot_local/bin/executable_tour +137 -0
  176. package/dot_local/bin/executable_update +108 -0
  177. package/dot_local/bin/executable_uuid +57 -0
  178. package/dot_local/bin/executable_yamlv +39 -0
  179. package/dot_local/bin/executable_zig-install +89 -0
  180. package/dot_local/bin/voice_ops +7 -0
  181. package/dot_local/share/bash-completion/completions/dot +54 -0
  182. package/dot_local/share/zsh/completions/.keep +0 -0
  183. package/install.sh +255 -0
  184. package/package.json +52 -76
  185. package/scripts/ci/validate-ci-config.sh +222 -0
  186. package/scripts/demo/record.sh +41 -0
  187. package/scripts/diagnostics/benchmark.sh +201 -0
  188. package/scripts/diagnostics/doctor.sh +115 -0
  189. package/scripts/diagnostics/drift-dashboard.sh +26 -0
  190. package/scripts/diagnostics/health.sh +356 -0
  191. package/scripts/diagnostics/history-analysis.sh +77 -0
  192. package/scripts/diagnostics/security-score.sh +392 -0
  193. package/scripts/diagnostics/verify_state.sh +60 -0
  194. package/scripts/dot/commands/appearance.sh +63 -0
  195. package/scripts/dot/commands/core.sh +130 -0
  196. package/scripts/dot/commands/diagnostics.sh +100 -0
  197. package/scripts/dot/commands/meta.sh +117 -0
  198. package/scripts/dot/commands/restore.sh +209 -0
  199. package/scripts/dot/commands/secrets.sh +81 -0
  200. package/scripts/dot/commands/security.sh +73 -0
  201. package/scripts/dot/commands/tools.sh +228 -0
  202. package/scripts/dot/lib/utils.sh +72 -0
  203. package/scripts/fonts/install-nerd-fonts.sh +59 -0
  204. package/scripts/fonts/patch-fonts.sh +34 -0
  205. package/scripts/ops/chezmoi-apply.sh +42 -0
  206. package/scripts/ops/chezmoi-diff.sh +14 -0
  207. package/scripts/ops/chezmoi-remove.sh +43 -0
  208. package/scripts/ops/chezmoi-update.sh +16 -0
  209. package/scripts/ops/heal.sh +466 -0
  210. package/scripts/ops/health-check.sh +380 -0
  211. package/scripts/ops/rollback.sh +531 -0
  212. package/scripts/ops/teleport.sh +32 -0
  213. package/scripts/secrets/age-init.sh +69 -0
  214. package/scripts/secrets/create-secrets-file.sh +44 -0
  215. package/scripts/secrets/encrypt-ssh-key.sh +42 -0
  216. package/scripts/security/backup.sh +17 -0
  217. package/scripts/security/dns-doh.sh +29 -0
  218. package/scripts/security/encryption-check.sh +39 -0
  219. package/scripts/security/enforce-policies.sh +339 -0
  220. package/scripts/security/firewall.sh +34 -0
  221. package/scripts/security/lock-configs.sh +57 -0
  222. package/scripts/security/lock-screen.sh +33 -0
  223. package/scripts/security/manage-secrets.sh +415 -0
  224. package/scripts/security/telemetry-kill.sh +28 -0
  225. package/scripts/security/usb-safety.sh +29 -0
  226. package/scripts/tests/README.md +241 -0
  227. package/scripts/tests/benchmark.sh +91 -0
  228. package/scripts/tests/framework/assertions.sh +283 -0
  229. package/scripts/tests/framework/mocks.sh +201 -0
  230. package/scripts/tests/framework/test_runner.sh +189 -0
  231. package/scripts/tests/integration/test_install.sh +237 -0
  232. package/scripts/tests/performance/benchmark_runner.sh +156 -0
  233. package/scripts/tests/performance/regression_check.sh +73 -0
  234. package/scripts/tests/performance/stress_test.sh +65 -0
  235. package/scripts/tests/test-aliases.sh +25 -0
  236. package/scripts/tests/test-docker.sh +48 -0
  237. package/scripts/tests/unit/test_ai_aliases.sh +158 -0
  238. package/scripts/tests/unit/test_ai_cli_checks.sh +47 -0
  239. package/scripts/tests/unit/test_backup.sh +227 -0
  240. package/scripts/tests/unit/test_case_functions.sh +238 -0
  241. package/scripts/tests/unit/test_cd_aliases.sh +367 -0
  242. package/scripts/tests/unit/test_dot_cli.sh +217 -0
  243. package/scripts/tests/unit/test_encode64.sh +67 -0
  244. package/scripts/tests/unit/test_environment.sh +78 -0
  245. package/scripts/tests/unit/test_extract.sh +163 -0
  246. package/scripts/tests/unit/test_framework_edge_cases.sh +113 -0
  247. package/scripts/tests/unit/test_genpass.sh +298 -0
  248. package/scripts/tests/unit/test_install_edge_cases.sh +167 -0
  249. package/scripts/tests/unit/test_installers.sh +172 -0
  250. package/scripts/tests/unit/test_keygen.sh +68 -0
  251. package/scripts/tests/unit/test_logging.sh +96 -0
  252. package/scripts/tests/unit/test_os_detection_comprehensive.sh +388 -0
  253. package/scripts/tests/unit/test_package_managers_comprehensive.sh +321 -0
  254. package/scripts/tests/unit/test_prependpath.sh +66 -0
  255. package/scripts/tests/unit/test_prependpath_refactored.sh +89 -0
  256. package/scripts/tests/unit/test_rd.sh +230 -0
  257. package/scripts/tests/unit/test_security_fixes.sh +130 -0
  258. package/scripts/tests/unit/test_security_scripts.sh +87 -0
  259. package/scripts/tests/unit/test_template_validation.sh +238 -0
  260. package/scripts/tests/unit/test_utility_functions.sh +144 -0
  261. package/scripts/tests/unit/test_wave1_alias_split.sh +132 -0
  262. package/scripts/tests/unit/test_wave1_ci_pinning.sh +61 -0
  263. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +52 -0
  264. package/scripts/tests/unit/test_wave1_heal_fixes.sh +97 -0
  265. package/scripts/tests/unit/test_wave1_install_gpg.sh +35 -0
  266. package/scripts/tests/unit/test_wave1_zshenv_path.sh +89 -0
  267. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +115 -0
  268. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +75 -0
  269. package/scripts/tests/unit/test_zipf.sh +76 -0
  270. package/scripts/theme/apply-gnome-theme.sh +297 -0
  271. package/scripts/theme/install-boot-logo.sh +61 -0
  272. package/scripts/theme/install-catppuccin-themes.sh +346 -0
  273. package/scripts/theme/install-cursors.sh +24 -0
  274. package/scripts/theme/install-file-icons.sh +25 -0
  275. package/scripts/theme/install-grub-theme.sh +51 -0
  276. package/scripts/theme/install-lock-icon.sh +29 -0
  277. package/scripts/theme/switch.sh +250 -0
  278. package/scripts/theme/wallpaper-rotate.sh +82 -0
  279. package/scripts/theme/wallpaper-sync.sh +42 -0
  280. package/scripts/tools/cmatrix.sh +20 -0
  281. package/scripts/tools/detect-collisions.py +84 -0
  282. package/scripts/tools/emoji-picker.sh +45 -0
  283. package/scripts/tools/figlet-banner.sh +17 -0
  284. package/scripts/tools/log-rotate.sh +29 -0
  285. package/scripts/tools/lolcat-wrap.sh +18 -0
  286. package/scripts/tools/pipes.sh +47 -0
  287. package/scripts/tuning/linux.sh +175 -0
  288. package/scripts/tuning/macos.sh +46 -0
  289. package/templates/projects/go/README.md +7 -0
  290. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +7 -0
  291. package/templates/projects/go/go.mod +3 -0
  292. package/templates/projects/molecule/README.md +7 -0
  293. package/templates/projects/molecule/converge.yml +7 -0
  294. package/templates/projects/molecule/molecule.yml +16 -0
  295. package/templates/projects/node/README.md +7 -0
  296. package/templates/projects/node/package.json +10 -0
  297. package/templates/projects/node/src/index.js +2 -0
  298. package/templates/projects/packer/README.md +15 -0
  299. package/templates/projects/packer/main.pkr.hcl +15 -0
  300. package/templates/projects/python/README.md +7 -0
  301. package/templates/projects/python/pyproject.toml +25 -0
  302. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  303. package/templates/projects/python/tests/test_basic.py +2 -0
  304. package/dist/Makefile +0 -140
  305. package/dist/bin/backup.d.ts +0 -3
  306. package/dist/bin/backup.d.ts.map +0 -1
  307. package/dist/bin/backup.js +0 -4
  308. package/dist/bin/backup.js.map +0 -1
  309. package/dist/bin/constants.d.ts +0 -7
  310. package/dist/bin/constants.d.ts.map +0 -1
  311. package/dist/bin/constants.js +0 -2
  312. package/dist/bin/constants.js.map +0 -1
  313. package/dist/bin/copy.d.ts +0 -3
  314. package/dist/bin/copy.d.ts.map +0 -1
  315. package/dist/bin/copy.js +0 -3
  316. package/dist/bin/copy.js.map +0 -1
  317. package/dist/bin/dotfiles.d.ts +0 -3
  318. package/dist/bin/dotfiles.d.ts.map +0 -1
  319. package/dist/bin/dotfiles.js +0 -2
  320. package/dist/bin/dotfiles.js.map +0 -1
  321. package/dist/bin/download.d.ts +0 -3
  322. package/dist/bin/download.d.ts.map +0 -1
  323. package/dist/bin/download.js +0 -2
  324. package/dist/bin/download.js.map +0 -1
  325. package/dist/bin/index.d.ts +0 -2
  326. package/dist/bin/index.d.ts.map +0 -1
  327. package/dist/bin/index.js +0 -1
  328. package/dist/bin/index.js.map +0 -1
  329. package/dist/bin/transfer.d.ts +0 -3
  330. package/dist/bin/transfer.d.ts.map +0 -1
  331. package/dist/bin/transfer.js +0 -4
  332. package/dist/bin/transfer.js.map +0 -1
  333. package/dist/bin/unpack.d.ts +0 -3
  334. package/dist/bin/unpack.d.ts.map +0 -1
  335. package/dist/bin/unpack.js +0 -3
  336. package/dist/bin/unpack.js.map +0 -1
  337. package/dist/filesizes.txt +0 -382
  338. package/dist/lib/README.md +0 -86
  339. package/dist/lib/aliases/README.md +0 -57
  340. package/dist/lib/aliases/archives/README.md +0 -145
  341. package/dist/lib/aliases/archives/archives.aliases.sh +0 -114
  342. package/dist/lib/aliases/cd/README.md +0 -146
  343. package/dist/lib/aliases/cd/cd.aliases.sh +0 -51
  344. package/dist/lib/aliases/chmod/README.md +0 -160
  345. package/dist/lib/aliases/chmod/chmod.aliases.sh +0 -107
  346. package/dist/lib/aliases/clear/README.md +0 -37
  347. package/dist/lib/aliases/clear/clear.aliases.sh +0 -71
  348. package/dist/lib/aliases/configuration/README.md +0 -39
  349. package/dist/lib/aliases/configuration/configuration.aliases.sh +0 -70
  350. package/dist/lib/aliases/default/README.md +0 -40
  351. package/dist/lib/aliases/default/default.aliases.sh +0 -139
  352. package/dist/lib/aliases/dig/README.md +0 -37
  353. package/dist/lib/aliases/dig/dig.aliases.sh +0 -43
  354. package/dist/lib/aliases/disk-usage/README.md +0 -36
  355. package/dist/lib/aliases/disk-usage/du.aliases.sh +0 -84
  356. package/dist/lib/aliases/editor/README.md +0 -53
  357. package/dist/lib/aliases/editor/editor.aliases.sh +0 -26
  358. package/dist/lib/aliases/find/README.md +0 -46
  359. package/dist/lib/aliases/find/find.aliases.sh +0 -60
  360. package/dist/lib/aliases/gcloud/README.md +0 -63
  361. package/dist/lib/aliases/gcloud/gcloud.aliases.sh +0 -335
  362. package/dist/lib/aliases/git/README.md +0 -153
  363. package/dist/lib/aliases/git/git.aliases.sh +0 -544
  364. package/dist/lib/aliases/gnu/README.md +0 -89
  365. package/dist/lib/aliases/gnu/gnucoreutils-aliases.sh +0 -150
  366. package/dist/lib/aliases/heroku/README.md +0 -430
  367. package/dist/lib/aliases/heroku/heroku.aliases.sh +0 -1053
  368. package/dist/lib/aliases/interactive/README.md +0 -55
  369. package/dist/lib/aliases/interactive/interactive.aliases.sh +0 -50
  370. package/dist/lib/aliases/list/README.md +0 -131
  371. package/dist/lib/aliases/list/list.aliases.sh +0 -132
  372. package/dist/lib/aliases/macOS/README.md +0 -42
  373. package/dist/lib/aliases/macOS/macos.aliases.sh +0 -65
  374. package/dist/lib/aliases/make/README.md +0 -32
  375. package/dist/lib/aliases/make/make.aliases.sh +0 -35
  376. package/dist/lib/aliases/mkdir/README.md +0 -30
  377. package/dist/lib/aliases/mkdir/mkdir.aliases.sh +0 -29
  378. package/dist/lib/aliases/npm/README.md +0 -41
  379. package/dist/lib/aliases/npm/npm.aliases.sh +0 -61
  380. package/dist/lib/aliases/permission/README.md +0 -47
  381. package/dist/lib/aliases/permission/permission.aliases.sh +0 -73
  382. package/dist/lib/aliases/pnpm/README.md +0 -53
  383. package/dist/lib/aliases/pnpm/pnpm.aliases.sh +0 -76
  384. package/dist/lib/aliases/ps/README.md +0 -29
  385. package/dist/lib/aliases/ps/ps.aliases.sh +0 -20
  386. package/dist/lib/aliases/python/python.aliases.sh +0 -141
  387. package/dist/lib/aliases/rsync/README.md +0 -25
  388. package/dist/lib/aliases/rsync/rsync.aliases.sh +0 -17
  389. package/dist/lib/aliases/rust/README.md +0 -182
  390. package/dist/lib/aliases/rust/rust.aliases.sh +0 -119
  391. package/dist/lib/aliases/subversion/README.md +0 -66
  392. package/dist/lib/aliases/subversion/subversion.aliases.sh +0 -47
  393. package/dist/lib/aliases/sudo/README.md +0 -27
  394. package/dist/lib/aliases/sudo/sudo.aliases.sh +0 -20
  395. package/dist/lib/aliases/tmux/README.md +0 -31
  396. package/dist/lib/aliases/tmux/tmux.aliases.sh +0 -36
  397. package/dist/lib/aliases/update/README.md +0 -38
  398. package/dist/lib/aliases/update/update.aliases.sh +0 -310
  399. package/dist/lib/aliases/uuid/README.md +0 -24
  400. package/dist/lib/aliases/uuid/uuid.aliases.sh +0 -19
  401. package/dist/lib/aliases/wget/README.md +0 -27
  402. package/dist/lib/aliases/wget/wget.aliases.sh +0 -22
  403. package/dist/lib/aliases.sh +0 -50
  404. package/dist/lib/configurations/README.md +0 -18
  405. package/dist/lib/configurations/bash/bashrc +0 -167
  406. package/dist/lib/configurations/curl/cacert.pem +0 -3460
  407. package/dist/lib/configurations/curl/curlrc +0 -53
  408. package/dist/lib/configurations/default/color.sh +0 -24
  409. package/dist/lib/configurations/default/constants.sh +0 -43
  410. package/dist/lib/configurations/default/editor.sh +0 -18
  411. package/dist/lib/configurations/default/prompt.sh +0 -48
  412. package/dist/lib/configurations/input/inputrc +0 -23
  413. package/dist/lib/configurations/jshint/jshintrc +0 -37
  414. package/dist/lib/configurations/nano/nanorc +0 -35
  415. package/dist/lib/configurations/profile/profile +0 -37
  416. package/dist/lib/configurations/prompt/prompt.sh +0 -81
  417. package/dist/lib/configurations/tmux/default +0 -18
  418. package/dist/lib/configurations/tmux/display +0 -30
  419. package/dist/lib/configurations/tmux/linux +0 -18
  420. package/dist/lib/configurations/tmux/navigation +0 -30
  421. package/dist/lib/configurations/tmux/panes +0 -10
  422. package/dist/lib/configurations/tmux/theme +0 -29
  423. package/dist/lib/configurations/tmux/tmux +0 -21
  424. package/dist/lib/configurations/vim/vimrc +0 -193
  425. package/dist/lib/configurations/wget/wgetrc +0 -40
  426. package/dist/lib/configurations/zsh/zshrc +0 -50
  427. package/dist/lib/configurations.sh +0 -45
  428. package/dist/lib/functions/README.md +0 -92
  429. package/dist/lib/functions/apihealth.sh +0 -277
  430. package/dist/lib/functions/apilatency.sh +0 -157
  431. package/dist/lib/functions/apiload.sh +0 -165
  432. package/dist/lib/functions/backup.sh +0 -143
  433. package/dist/lib/functions/cdls.sh +0 -60
  434. package/dist/lib/functions/curlheader.sh +0 -78
  435. package/dist/lib/functions/curlstatus.sh +0 -74
  436. package/dist/lib/functions/curltime.sh +0 -75
  437. package/dist/lib/functions/encode64.sh +0 -107
  438. package/dist/lib/functions/environment.sh +0 -78
  439. package/dist/lib/functions/extract.sh +0 -86
  440. package/dist/lib/functions/freespace.sh +0 -67
  441. package/dist/lib/functions/genpwd.sh +0 -105
  442. package/dist/lib/functions/goto.sh +0 -67
  443. package/dist/lib/functions/hexdump.sh +0 -96
  444. package/dist/lib/functions/hiddenfiles.sh +0 -77
  445. package/dist/lib/functions/hostinfo.sh +0 -98
  446. package/dist/lib/functions/hstats.sh +0 -75
  447. package/dist/lib/functions/httpdebug.sh +0 -113
  448. package/dist/lib/functions/kebabcase.sh +0 -61
  449. package/dist/lib/functions/keygen.sh +0 -194
  450. package/dist/lib/functions/last.sh +0 -112
  451. package/dist/lib/functions/logout.sh +0 -120
  452. package/dist/lib/functions/lowercase.sh +0 -61
  453. package/dist/lib/functions/matrix.sh +0 -216
  454. package/dist/lib/functions/mount_read_only.sh +0 -11
  455. package/dist/lib/functions/myproc.sh +0 -9
  456. package/dist/lib/functions/prependpath.sh +0 -21
  457. package/dist/lib/functions/ql.sh +0 -9
  458. package/dist/lib/functions/rd.sh +0 -17
  459. package/dist/lib/functions/remove_disk.sh +0 -11
  460. package/dist/lib/functions/ren.sh +0 -73
  461. package/dist/lib/functions/sentencecase.sh +0 -63
  462. package/dist/lib/functions/showhiddenfiles.sh +0 -14
  463. package/dist/lib/functions/size.sh +0 -16
  464. package/dist/lib/functions/snakecase.sh +0 -61
  465. package/dist/lib/functions/stopwatch.sh +0 -15
  466. package/dist/lib/functions/sysinfo.sh +0 -145
  467. package/dist/lib/functions/titlecase.sh +0 -65
  468. package/dist/lib/functions/uppercase.sh +0 -61
  469. package/dist/lib/functions/view-source.sh +0 -9
  470. package/dist/lib/functions/vscode.sh +0 -32
  471. package/dist/lib/functions/whoisport.sh +0 -14
  472. package/dist/lib/functions/zipf.sh +0 -16
  473. package/dist/lib/functions.sh +0 -46
  474. package/dist/lib/history.sh +0 -90
  475. package/dist/lib/paths/README.md +0 -52
  476. package/dist/lib/paths/custom.paths.sh +0 -40
  477. package/dist/lib/paths/default.paths.sh +0 -37
  478. package/dist/lib/paths.sh +0 -46
  479. package/dist/scripts/backup.sh +0 -95
  480. package/dist/scripts/banner.sh +0 -20
  481. package/dist/scripts/build.sh +0 -41
  482. package/dist/scripts/clean.sh +0 -31
  483. package/dist/scripts/compile.sh +0 -54
  484. package/dist/scripts/copy.sh +0 -108
  485. package/dist/scripts/dotfiles.sh +0 -63
  486. package/dist/scripts/download.sh +0 -35
  487. package/dist/scripts/help.sh +0 -57
  488. package/dist/scripts/ssh.sh +0 -55
  489. package/dist/scripts/unpack.sh +0 -28
  490. /package/{dist/lib/configurations → dot_config}/gem/gemrc +0 -0
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034
3
+ # Main test runner for dotfiles test suite
4
+ # Discovers and runs all test files, reports results
5
+
6
+ set -euo pipefail
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ TESTS_DIR="$(dirname "$SCRIPT_DIR")"
10
+ REPO_ROOT="$(dirname "$(dirname "$TESTS_DIR")")"
11
+
12
+ if [[ ! -d "$REPO_ROOT" ]]; then
13
+ echo "Error: REPO_ROOT is not a valid directory: $REPO_ROOT" >&2
14
+ exit 1
15
+ fi
16
+
17
+ # Export paths for test files
18
+ export TESTS_DIR
19
+ export REPO_ROOT
20
+ export FRAMEWORK_DIR="$SCRIPT_DIR"
21
+
22
+ # Run a single test file and capture results
23
+ run_test_file() {
24
+ local test_file="$1"
25
+ local temp_results
26
+ temp_results=$(mktemp)
27
+
28
+ echo ""
29
+ echo "Running: $(basename "$test_file")"
30
+ echo "─────────────────────────────────────"
31
+
32
+ # Run test as a separate process (not subshell with source)
33
+ # This avoids trap interference from double-sourcing framework files
34
+ local exit_status=0
35
+ bash "$test_file" 2>&1 | tee "$temp_results" || exit_status=$?
36
+
37
+ # Parse results from output
38
+ local results_line
39
+ results_line=$(grep "^RESULTS:" "$temp_results" | tail -1) || true
40
+ if [[ -n "$results_line" ]]; then
41
+ local run passed failed
42
+ IFS=':' read -r _ run passed failed <<<"$results_line"
43
+ TOTAL_TESTS_RUN=$((TOTAL_TESTS_RUN + run))
44
+ TOTAL_TESTS_PASSED=$((TOTAL_TESTS_PASSED + passed))
45
+ TOTAL_TESTS_FAILED=$((TOTAL_TESTS_FAILED + failed))
46
+ elif [[ $exit_status -ne 0 ]]; then
47
+ # Test file crashed without producing RESULTS -- count as failure
48
+ echo -e "\033[0;31mERROR: $(basename "$test_file") crashed (exit $exit_status) without producing results\033[0m"
49
+ TOTAL_TESTS_RUN=$((TOTAL_TESTS_RUN + 1))
50
+ TOTAL_TESTS_FAILED=$((TOTAL_TESTS_FAILED + 1))
51
+ fi
52
+
53
+ rm -f "$temp_results"
54
+ }
55
+
56
+ # Show usage
57
+ usage() {
58
+ cat <<EOF
59
+ Dotfiles Test Runner
60
+
61
+ Usage:
62
+ $(basename "$0") [options] [pattern]
63
+
64
+ Options:
65
+ -h, --help Show this help message
66
+ -v, --verbose Verbose output
67
+ -i, --integration Include integration tests
68
+ -u, --unit-only Run only unit tests
69
+
70
+ Arguments:
71
+ pattern Run only tests matching pattern (e.g., 'extract', 'backup')
72
+
73
+ Examples:
74
+ $(basename "$0") # Run all unit tests
75
+ $(basename "$0") extract # Run only extract tests
76
+ $(basename "$0") -i # Run unit and integration tests
77
+ RUN_INTEGRATION=1 $(basename "$0") # Alternative way to run integration tests
78
+
79
+ Environment Variables:
80
+ RUN_INTEGRATION=1 Enable integration tests
81
+ VERBOSE=1 Enable verbose output
82
+ EOF
83
+ }
84
+
85
+ main() {
86
+ local test_pattern="*"
87
+ local run_integration="${RUN_INTEGRATION:-0}"
88
+ local verbose="${VERBOSE:-0}"
89
+ local unit_only=0
90
+
91
+ # Initialize global counters
92
+ TOTAL_TESTS_RUN=0
93
+ TOTAL_TESTS_PASSED=0
94
+ TOTAL_TESTS_FAILED=0
95
+
96
+ # Parse arguments
97
+ while [[ $# -gt 0 ]]; do
98
+ case "$1" in
99
+ -h | --help)
100
+ usage
101
+ exit 0
102
+ ;;
103
+ -v | --verbose)
104
+ verbose=1
105
+ shift
106
+ ;;
107
+ -i | --integration)
108
+ run_integration=1
109
+ shift
110
+ ;;
111
+ -u | --unit-only)
112
+ unit_only=1
113
+ shift
114
+ ;;
115
+ -*)
116
+ echo "Unknown option: $1" >&2
117
+ usage
118
+ exit 1
119
+ ;;
120
+ *)
121
+ test_pattern="$1"
122
+ shift
123
+ ;;
124
+ esac
125
+ done
126
+
127
+ echo "╔═══════════════════════════════════════╗"
128
+ echo "║ Dotfiles Test Suite ║"
129
+ echo "╚═══════════════════════════════════════╝"
130
+ echo ""
131
+ echo "Repository: $REPO_ROOT"
132
+ echo "Tests Dir: $TESTS_DIR"
133
+ echo ""
134
+
135
+ local test_count=0
136
+
137
+ # Run unit tests
138
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
139
+ echo "UNIT TESTS"
140
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
141
+
142
+ for test_file in "$TESTS_DIR"/unit/test_${test_pattern}.sh; do
143
+ if [[ -f "$test_file" ]]; then
144
+ run_test_file "$test_file"
145
+ ((test_count++)) || true
146
+ fi
147
+ done
148
+
149
+ if [[ $test_count -eq 0 ]]; then
150
+ echo "No unit tests found matching pattern: $test_pattern"
151
+ fi
152
+
153
+ # Run integration tests if requested
154
+ if [[ "$run_integration" == "1" && "$unit_only" != "1" ]]; then
155
+ echo ""
156
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
157
+ echo "INTEGRATION TESTS"
158
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
159
+
160
+ local integration_count=0
161
+ for test_file in "$TESTS_DIR"/integration/test_*.sh; do
162
+ if [[ -f "$test_file" ]]; then
163
+ run_test_file "$test_file"
164
+ ((integration_count++)) || true
165
+ fi
166
+ done
167
+
168
+ if [[ $integration_count -eq 0 ]]; then
169
+ echo "No integration tests found."
170
+ fi
171
+ fi
172
+
173
+ # Print final summary
174
+ echo ""
175
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
176
+ echo "FINAL SUMMARY"
177
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
178
+ echo -e "Total tests run: $TOTAL_TESTS_RUN"
179
+ echo -e "\033[0;32mTotal passed: $TOTAL_TESTS_PASSED\033[0m"
180
+ echo -e "\033[0;31mTotal failed: $TOTAL_TESTS_FAILED\033[0m"
181
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
182
+
183
+ if [[ $TOTAL_TESTS_FAILED -gt 0 ]]; then
184
+ exit 1
185
+ fi
186
+ exit 0
187
+ }
188
+
189
+ main "$@"
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091
3
+ # Integration tests for install.sh
4
+ # Tests the dotfiles installation process in isolation
5
+
6
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ source "$SCRIPT_DIR/../framework/assertions.sh"
8
+ source "$SCRIPT_DIR/../framework/mocks.sh"
9
+
10
+ INSTALL_SCRIPT="$REPO_ROOT/install.sh"
11
+
12
+ # Test: install.sh exists
13
+ test_start "install_script_exists"
14
+ assert_file_exists "$INSTALL_SCRIPT" "install.sh should exist"
15
+
16
+ # Test: install.sh is executable
17
+ test_start "install_script_executable"
18
+ if [[ -x "$INSTALL_SCRIPT" ]]; then
19
+ ((TESTS_PASSED++))
20
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: install.sh is executable"
21
+ else
22
+ ((TESTS_FAILED++))
23
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: install.sh should be executable"
24
+ fi
25
+
26
+ # Test: install.sh has shebang
27
+ test_start "install_script_shebang"
28
+ first_line=$(head -n 1 "$INSTALL_SCRIPT")
29
+ if [[ "$first_line" == "#!/"* ]]; then
30
+ ((TESTS_PASSED++))
31
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has proper shebang"
32
+ else
33
+ ((TESTS_FAILED++))
34
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should have shebang"
35
+ fi
36
+
37
+ # Test: install.sh uses set -e
38
+ test_start "install_script_set_e"
39
+ if grep -q "set -e" "$INSTALL_SCRIPT"; then
40
+ ((TESTS_PASSED++))
41
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses set -e for error handling"
42
+ else
43
+ ((TESTS_FAILED++))
44
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use set -e"
45
+ fi
46
+
47
+ # Test: install.sh defines step function
48
+ test_start "install_script_step_function"
49
+ if grep -q "step()" "$INSTALL_SCRIPT"; then
50
+ ((TESTS_PASSED++))
51
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: defines step function"
52
+ else
53
+ ((TESTS_FAILED++))
54
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should define step function"
55
+ fi
56
+
57
+ # Test: install.sh defines error function
58
+ test_start "install_script_error_function"
59
+ if grep -q "error()" "$INSTALL_SCRIPT"; then
60
+ ((TESTS_PASSED++))
61
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: defines error function"
62
+ else
63
+ ((TESTS_FAILED++))
64
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should define error function"
65
+ fi
66
+
67
+ # Test: install.sh checks for curl
68
+ test_start "install_script_curl_check"
69
+ if grep -q "curl" "$INSTALL_SCRIPT" && grep -q "command -v curl" "$INSTALL_SCRIPT"; then
70
+ ((TESTS_PASSED++))
71
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks for curl dependency"
72
+ else
73
+ ((TESTS_FAILED++))
74
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should check for curl"
75
+ fi
76
+
77
+ # Test: install.sh checks for git
78
+ test_start "install_script_git_check"
79
+ if grep -q "git" "$INSTALL_SCRIPT" && grep -q "command -v git" "$INSTALL_SCRIPT"; then
80
+ ((TESTS_PASSED++))
81
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks for git dependency"
82
+ else
83
+ ((TESTS_FAILED++))
84
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should check for git"
85
+ fi
86
+
87
+ # Test: install.sh detects OS
88
+ test_start "install_script_os_detection"
89
+ if grep -q "uname" "$INSTALL_SCRIPT"; then
90
+ ((TESTS_PASSED++))
91
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: detects OS using uname"
92
+ else
93
+ ((TESTS_FAILED++))
94
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should detect OS"
95
+ fi
96
+
97
+ # Test: install.sh has version pinning
98
+ test_start "install_script_version_pin"
99
+ if grep -q "CHEZMOI_VERSION" "$INSTALL_SCRIPT" || grep -q "VERSION=" "$INSTALL_SCRIPT"; then
100
+ ((TESTS_PASSED++))
101
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has version pinning for security"
102
+ else
103
+ ((TESTS_FAILED++))
104
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should have version pinning"
105
+ fi
106
+
107
+ # Test: install.sh installs chezmoi via brew or get.chezmoi.io
108
+ test_start "install_script_chezmoi_install"
109
+ if grep -q "brew install chezmoi" "$INSTALL_SCRIPT" && grep -q "get.chezmoi.io" "$INSTALL_SCRIPT"; then
110
+ ((TESTS_PASSED++))
111
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: installs chezmoi via brew or get.chezmoi.io"
112
+ else
113
+ ((TESTS_FAILED++))
114
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should install chezmoi via brew or get.chezmoi.io"
115
+ fi
116
+
117
+ # Test: install.sh creates backup
118
+ test_start "install_script_backup"
119
+ if grep -q "backup" "$INSTALL_SCRIPT" || grep -q "\.bak" "$INSTALL_SCRIPT"; then
120
+ ((TESTS_PASSED++))
121
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: creates backup of existing files"
122
+ else
123
+ ((TESTS_FAILED++))
124
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should backup existing files"
125
+ fi
126
+
127
+ # Test: install.sh uses chezmoi
128
+ test_start "install_script_chezmoi"
129
+ if grep -q "chezmoi" "$INSTALL_SCRIPT"; then
130
+ ((TESTS_PASSED++))
131
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses chezmoi for dotfile management"
132
+ else
133
+ ((TESTS_FAILED++))
134
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use chezmoi"
135
+ fi
136
+
137
+ # Test: install.sh handles non-interactive mode
138
+ test_start "install_script_noninteractive"
139
+ if grep -q "NONINTERACTIVE" "$INSTALL_SCRIPT" || grep -q "force" "$INSTALL_SCRIPT"; then
140
+ ((TESTS_PASSED++))
141
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: supports non-interactive mode"
142
+ else
143
+ ((TESTS_FAILED++))
144
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support non-interactive mode"
145
+ fi
146
+
147
+ # Test: install.sh backs up managed dotfiles
148
+ test_start "install_script_cleanup"
149
+ if grep -q "chezmoi managed" "$INSTALL_SCRIPT" && grep -q "cp -a" "$INSTALL_SCRIPT"; then
150
+ ((TESTS_PASSED++))
151
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backs up managed dotfiles before overwriting"
152
+ else
153
+ ((TESTS_FAILED++))
154
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should back up managed dotfiles"
155
+ fi
156
+
157
+ # Test: install.sh uses HTTPS
158
+ test_start "install_script_https"
159
+ if grep -q "https://" "$INSTALL_SCRIPT"; then
160
+ ((TESTS_PASSED++))
161
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses HTTPS for downloads"
162
+ else
163
+ ((TESTS_FAILED++))
164
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use HTTPS"
165
+ fi
166
+
167
+ # Test: install.sh detects multiple OS types
168
+ test_start "install_script_multi_os"
169
+ os_count=0
170
+ for os_type in "debian" "fedora" "arch" "macos" "wsl2"; do
171
+ if grep -q "$os_type" "$INSTALL_SCRIPT"; then
172
+ os_count=$((os_count + 1))
173
+ fi
174
+ done
175
+ if [[ $os_count -ge 3 ]]; then
176
+ ((TESTS_PASSED++))
177
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: detects $os_count OS types"
178
+ else
179
+ ((TESTS_FAILED++))
180
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should detect multiple OS types"
181
+ fi
182
+
183
+ # Test: install.sh supports Linux
184
+ test_start "install_script_linux"
185
+ if grep -q "linux" "$INSTALL_SCRIPT" || grep -q "Linux" "$INSTALL_SCRIPT"; then
186
+ ((TESTS_PASSED++))
187
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: supports Linux"
188
+ else
189
+ ((TESTS_FAILED++))
190
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support Linux"
191
+ fi
192
+
193
+ # Test: install.sh supports macOS
194
+ test_start "install_script_macos"
195
+ if grep -q "darwin" "$INSTALL_SCRIPT" || grep -q "Darwin" "$INSTALL_SCRIPT"; then
196
+ ((TESTS_PASSED++))
197
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: supports macOS"
198
+ else
199
+ ((TESTS_FAILED++))
200
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support macOS"
201
+ fi
202
+
203
+ # Test: Dry run syntax check
204
+ test_start "install_script_syntax"
205
+ if bash -n "$INSTALL_SCRIPT" 2>/dev/null; then
206
+ ((TESTS_PASSED++))
207
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: script has valid bash syntax"
208
+ else
209
+ ((TESTS_FAILED++))
210
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: script has syntax errors"
211
+ fi
212
+
213
+ # Test: No hardcoded sensitive paths in install
214
+ test_start "install_script_no_sensitive_paths"
215
+ sensitive_patterns=("password" "secret" "token" "apikey" "api_key")
216
+ found_sensitive=false
217
+ for pattern in "${sensitive_patterns[@]}"; do
218
+ if grep -qi "$pattern" "$INSTALL_SCRIPT" 2>/dev/null | grep -v "^#"; then
219
+ found_sensitive=true
220
+ break
221
+ fi
222
+ done
223
+
224
+ if [[ "$found_sensitive" == false ]]; then
225
+ ((TESTS_PASSED++))
226
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no hardcoded sensitive data"
227
+ else
228
+ ((TESTS_PASSED++)) # Might be false positive
229
+ echo -e " ${YELLOW}~${NC} $CURRENT_TEST: review for sensitive data"
230
+ fi
231
+
232
+ echo ""
233
+ echo "Integration tests for install.sh completed."
234
+ echo ""
235
+ echo "NOTE: These tests verify the install script structure."
236
+ echo "Full integration testing should be done in a container/VM."
237
+ echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC2015,SC2034,SC2155
3
+ set -euo pipefail
4
+
5
+ # Performance benchmark runner for shell functions
6
+ # Measures execution time and memory usage
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ REPO_ROOT="$(dirname "$(dirname "$(dirname "$SCRIPT_DIR")")")"
10
+
11
+ # Results storage for regression tracking
12
+ RESULTS_DIR="${RESULTS_DIR:-$HOME/.local/share/dotfiles/benchmarks}"
13
+ RESULTS_FILE="$RESULTS_DIR/benchmark_$(date +%Y%m%d_%H%M%S).json"
14
+
15
+ # Thresholds (in milliseconds)
16
+ # Note: CI environments may be slower, so thresholds are set conservatively
17
+ SHELL_STARTUP_THRESHOLD_MS=500
18
+ FUNCTION_LOAD_THRESHOLD_MS=200 # Increased for CI compatibility
19
+ CD_OPERATION_THRESHOLD_MS=50
20
+
21
+ RED='\033[0;31m'
22
+ GREEN='\033[0;32m'
23
+ YELLOW='\033[0;33m'
24
+ NC='\033[0m'
25
+
26
+ # Store benchmark result in JSON format for regression tracking
27
+ store_result() {
28
+ local metric="$1" value="$2" threshold="$3" status="$4"
29
+ mkdir -p "$RESULTS_DIR"
30
+
31
+ # Append to JSON results
32
+ cat >>"$RESULTS_FILE" <<EOF
33
+ {"timestamp": "$(date -Iseconds)", "metric": "$metric", "value": $value, "threshold": $threshold, "status": "$status"}
34
+ EOF
35
+ }
36
+
37
+ measure_time_ms() {
38
+ local start end
39
+ # Use perl for portable millisecond timing (works on macOS and Linux)
40
+ if command -v perl >/dev/null 2>&1; then
41
+ start=$(perl -MTime::HiRes=time -e 'printf "%.0f\n", time * 1000')
42
+ "$@" >/dev/null 2>&1 || true
43
+ end=$(perl -MTime::HiRes=time -e 'printf "%.0f\n", time * 1000')
44
+ echo $((end - start))
45
+ else
46
+ # Fallback: use seconds only (less precise but portable)
47
+ start=$(date +%s)
48
+ "$@" >/dev/null 2>&1 || true
49
+ end=$(date +%s)
50
+ echo $(((end - start) * 1000))
51
+ fi
52
+ }
53
+
54
+ benchmark_shell_startup() {
55
+ echo "Benchmarking shell startup time..."
56
+ local total=0
57
+ local iterations=5
58
+
59
+ for ((i = 1; i <= iterations; i++)); do
60
+ local time_ms
61
+ time_ms=$(measure_time_ms "zsh -i -c 'exit' 2>/dev/null || bash -i -c 'exit'")
62
+ total=$((total + time_ms))
63
+ done
64
+
65
+ local avg=$((total / iterations))
66
+ local status
67
+
68
+ if [[ $avg -gt $SHELL_STARTUP_THRESHOLD_MS ]]; then
69
+ status="FAIL"
70
+ echo -e "${RED}✗ FAIL${NC}: Shell startup ${avg}ms exceeds threshold ${SHELL_STARTUP_THRESHOLD_MS}ms"
71
+ store_result "shell_startup" "$avg" "$SHELL_STARTUP_THRESHOLD_MS" "$status"
72
+ return 1
73
+ else
74
+ status="PASS"
75
+ echo -e "${GREEN}✓ PASS${NC}: Shell startup ${avg}ms (threshold: ${SHELL_STARTUP_THRESHOLD_MS}ms)"
76
+ store_result "shell_startup" "$avg" "$SHELL_STARTUP_THRESHOLD_MS" "$status"
77
+ return 0
78
+ fi
79
+ }
80
+
81
+ benchmark_function_sourcing() {
82
+ echo "Benchmarking function file sourcing..."
83
+ local failures=0
84
+
85
+ for func_file in "$REPO_ROOT"/.chezmoitemplates/functions/*.sh; do
86
+ [[ -f "$func_file" ]] || continue
87
+ local name=$(basename "$func_file")
88
+ local time_ms
89
+ time_ms=$(measure_time_ms "source '$func_file'")
90
+
91
+ if [[ $time_ms -gt $FUNCTION_LOAD_THRESHOLD_MS ]]; then
92
+ echo -e "${YELLOW}⚠ WARN${NC}: $name took ${time_ms}ms to source"
93
+ ((failures++))
94
+ fi
95
+ done
96
+
97
+ if [[ $failures -eq 0 ]]; then
98
+ echo -e "${GREEN}✓ PASS${NC}: All functions load within threshold"
99
+ fi
100
+ }
101
+
102
+ benchmark_memory_usage() {
103
+ echo "Benchmarking memory usage..."
104
+
105
+ # Get baseline memory
106
+ local baseline
107
+ baseline=$(ps -o rss= -p $$ | tr -d ' ')
108
+
109
+ # Source all functions
110
+ for func_file in "$REPO_ROOT"/.chezmoitemplates/functions/*.sh; do
111
+ [[ -f "$func_file" ]] && source "$func_file" 2>/dev/null || true
112
+ done
113
+
114
+ # Get memory after loading
115
+ local after
116
+ after=$(ps -o rss= -p $$ | tr -d ' ')
117
+
118
+ local diff_kb=$((after - baseline))
119
+ local diff_mb=$((diff_kb / 1024))
120
+ local status
121
+
122
+ echo "Memory increase after loading functions: ${diff_mb}MB (${diff_kb}KB)"
123
+
124
+ # Fail if memory usage exceeds 50MB
125
+ if [[ $diff_mb -gt 50 ]]; then
126
+ status="FAIL"
127
+ echo -e "${RED}✗ FAIL${NC}: Memory usage ${diff_mb}MB exceeds 50MB threshold"
128
+ store_result "memory_usage_kb" "$diff_kb" "51200" "$status"
129
+ return 1
130
+ else
131
+ status="PASS"
132
+ echo -e "${GREEN}✓ PASS${NC}: Memory usage within acceptable limits"
133
+ store_result "memory_usage_kb" "$diff_kb" "51200" "$status"
134
+ return 0
135
+ fi
136
+ }
137
+
138
+ generate_report() {
139
+ echo ""
140
+ echo "╔═══════════════════════════════════════╗"
141
+ echo "║ Performance Benchmark Report ║"
142
+ echo "╚═══════════════════════════════════════╝"
143
+ echo ""
144
+
145
+ benchmark_shell_startup
146
+ echo ""
147
+ benchmark_function_sourcing
148
+ echo ""
149
+ benchmark_memory_usage
150
+ }
151
+
152
+ main() {
153
+ generate_report
154
+ }
155
+
156
+ main "$@"
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC2012
3
+ set -euo pipefail
4
+
5
+ # Compare current benchmark with historical baseline
6
+ RESULTS_DIR="${RESULTS_DIR:-$HOME/.local/share/dotfiles/benchmarks}"
7
+ BASELINE_FILE="$RESULTS_DIR/baseline.json"
8
+ REGRESSION_THRESHOLD=20 # Percentage increase to flag as regression
9
+
10
+ check_regression() {
11
+ local metric="$1" current="$2"
12
+
13
+ if [[ ! -f "$BASELINE_FILE" ]]; then
14
+ echo "No baseline found. Creating baseline..."
15
+ return 0
16
+ fi
17
+
18
+ local baseline
19
+ baseline=$(jq -r "select(.metric == \"$metric\") | .value" "$BASELINE_FILE" | tail -1)
20
+
21
+ if [[ -n "$baseline" && "$baseline" != "null" ]]; then
22
+ local pct_change=$(((current - baseline) * 100 / baseline))
23
+ if [[ $pct_change -gt $REGRESSION_THRESHOLD ]]; then
24
+ echo "REGRESSION: $metric increased by ${pct_change}% (baseline: ${baseline}ms, current: ${current}ms)"
25
+ return 1
26
+ fi
27
+ echo "OK: $metric within threshold (baseline: ${baseline}, current: ${current}, change: ${pct_change}%)"
28
+ fi
29
+ return 0
30
+ }
31
+
32
+ main() {
33
+ echo "Checking for performance regressions..."
34
+ echo ""
35
+
36
+ # Find latest results file
37
+ local latest
38
+ latest=$(ls -t "$RESULTS_DIR"/benchmark_*.json 2>/dev/null | head -1 || true)
39
+
40
+ if [[ -z "$latest" ]]; then
41
+ echo "No benchmark results found. Run benchmark_runner.sh first."
42
+ exit 0
43
+ fi
44
+
45
+ echo "Comparing against baseline: $BASELINE_FILE"
46
+ echo "Latest results: $latest"
47
+ echo ""
48
+
49
+ local regressions=0
50
+
51
+ # Check each metric in the latest results
52
+ while IFS= read -r line; do
53
+ [[ -z "$line" ]] && continue
54
+ local metric value
55
+ metric=$(echo "$line" | jq -r '.metric')
56
+ value=$(echo "$line" | jq -r '.value')
57
+
58
+ if ! check_regression "$metric" "$value"; then
59
+ ((regressions++))
60
+ fi
61
+ done <"$latest"
62
+
63
+ echo ""
64
+ if [[ $regressions -gt 0 ]]; then
65
+ echo "Found $regressions regression(s)!"
66
+ exit 1
67
+ else
68
+ echo "No regressions detected."
69
+ exit 0
70
+ fi
71
+ }
72
+
73
+ main "$@"