@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,65 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1091
3
+ set -euo pipefail
4
+
5
+ # Stress test for shell functions
6
+ # Tests behavior under repeated rapid invocation
7
+
8
+ ITERATIONS="${1:-100}"
9
+
10
+ # Portable millisecond timing function
11
+ get_time_ms() {
12
+ if command -v perl >/dev/null 2>&1; then
13
+ perl -MTime::HiRes=time -e 'printf "%.0f\n", time * 1000'
14
+ else
15
+ # Fallback: seconds * 1000 (less precise)
16
+ echo $(($(date +%s) * 1000))
17
+ fi
18
+ }
19
+
20
+ # Note: This is test-only code. The eval below is necessary to execute
21
+ # dynamically constructed test commands. Do not use with untrusted input.
22
+ stress_test_function() {
23
+ local func_name="$1"
24
+ local test_cmd="$2"
25
+ local start end elapsed
26
+
27
+ # Validate test_cmd is not empty
28
+ if [[ -z "$test_cmd" ]]; then
29
+ echo " ERROR: empty test command for $func_name"
30
+ return 1
31
+ fi
32
+
33
+ echo "Stress testing $func_name ($ITERATIONS iterations)..."
34
+
35
+ start=$(get_time_ms)
36
+ for ((i = 1; i <= ITERATIONS; i++)); do
37
+ # shellcheck disable=SC2086
38
+ eval "$test_cmd" >/dev/null 2>&1 || true
39
+ done
40
+ end=$(get_time_ms)
41
+
42
+ elapsed=$((end - start))
43
+ local per_call=$((elapsed / ITERATIONS))
44
+
45
+ echo " Total: ${elapsed}ms, Per call: ${per_call}ms"
46
+ }
47
+
48
+ main() {
49
+ echo "Starting stress tests..."
50
+ echo ""
51
+
52
+ # Test genpass under load
53
+ source "$HOME/.dotfiles/.chezmoitemplates/functions/genpass.sh" 2>/dev/null || true
54
+ if type genpass &>/dev/null; then
55
+ stress_test_function "genpass" "genpass 16"
56
+ fi
57
+
58
+ # Test extract help (no actual extraction)
59
+ source "$HOME/.dotfiles/.chezmoitemplates/functions/extract.sh" 2>/dev/null || true
60
+ if type extract &>/dev/null; then
61
+ stress_test_function "extract --help" "extract --help"
62
+ fi
63
+ }
64
+
65
+ main "$@"
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+ # MIT License
3
+ # Copyright (c) 2026 Sebastien Rousseau
4
+ # See LICENSE file for details.
5
+
6
+ # Script: test-aliases.sh
7
+ # Description: Verifies disjoint alias files for syntax errors.
8
+
9
+ set -e
10
+
11
+ echo "Testing alias syntax..."
12
+
13
+ ALIAS_DIR="$HOME/.dotfiles/.chezmoitemplates/aliases"
14
+
15
+ find "$ALIAS_DIR" -name "*.aliases.sh" | while read -r file; do
16
+ # Check for syntax errors using bash -n
17
+ if bash -n "$file"; then
18
+ echo " Checked: $(basename "$file")"
19
+ else
20
+ echo " Syntax Error: $(basename "$file")"
21
+ exit 1
22
+ fi
23
+ done
24
+
25
+ echo "All alias files passed syntax check."
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ # Test dotfiles README instructions across all environments using Docker
3
+ # Usage: ./scripts/tests/test-docker.sh [target...]
4
+ # Examples:
5
+ # ./scripts/tests/test-docker.sh # Run all tests
6
+ # ./scripts/tests/test-docker.sh ubuntu-test # Run only Ubuntu test
7
+ # ./scripts/tests/test-docker.sh arch-test # Run only Arch test
8
+
9
+ set -euo pipefail
10
+
11
+ RED='\033[0;31m'
12
+ GREEN='\033[0;32m'
13
+ BLUE='\033[0;34m'
14
+ BOLD='\033[1m'
15
+ NC='\033[0m'
16
+
17
+ TARGETS=(ubuntu-test debian-test arch-test ubuntu-eza-test)
18
+ PASSED=0
19
+ FAILED=0
20
+ FAILURES=()
21
+
22
+ # Use specified targets or all
23
+ if [ $# -gt 0 ]; then
24
+ TARGETS=("$@")
25
+ fi
26
+
27
+ echo -e "${BLUE}${BOLD}Testing dotfiles across ${#TARGETS[@]} environment(s)${NC}"
28
+ echo ""
29
+
30
+ for target in "${TARGETS[@]}"; do
31
+ echo -e "${BLUE}==> Building: ${BOLD}${target}${NC}"
32
+ if docker build --target "$target" -f Dockerfile.test -t "dotfiles-test:${target}" . 2>&1; then
33
+ echo -e "${GREEN}==> PASSED: ${target}${NC}"
34
+ PASSED=$((PASSED + 1))
35
+ else
36
+ echo -e "${RED}==> FAILED: ${target}${NC}"
37
+ FAILED=$((FAILED + 1))
38
+ FAILURES+=("$target")
39
+ fi
40
+ echo ""
41
+ done
42
+
43
+ echo -e "${BOLD}Results: ${GREEN}${PASSED} passed${NC}, ${RED}${FAILED} failed${NC} (${#TARGETS[@]} total)"
44
+
45
+ if [ ${FAILED} -gt 0 ]; then
46
+ echo -e "${RED}Failed targets: ${FAILURES[*]}${NC}"
47
+ exit 1
48
+ fi
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034,SC2030,SC2031
3
+ # Test AI aliases functionality
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ source "$SCRIPT_DIR/../framework/assertions.sh"
7
+ source "$SCRIPT_DIR/../framework/mocks.sh"
8
+
9
+ # Test setup
10
+ ALIASES_FILE="$REPO_ROOT/.chezmoitemplates/aliases/ai/ai.aliases.sh"
11
+
12
+ test_start "ai_aliases_file_exists"
13
+ assert_file_exists "$ALIASES_FILE" "AI aliases file should exist"
14
+
15
+ test_start "github_copilot_aliases_when_gh_available"
16
+ mock_init
17
+ # Mock gh command as available
18
+ mock_command "gh" "gh 2.42.0" 0
19
+
20
+ # Source aliases in a subshell with expand_aliases enabled
21
+ (
22
+ shopt -s expand_aliases
23
+ export PATH="$MOCK_BIN_DIR:$PATH"
24
+ source "$ALIASES_FILE"
25
+
26
+ # Check aliases are defined using alias command
27
+ alias ghcp >/dev/null 2>&1 && echo "ghcp_defined"
28
+ alias ghs >/dev/null 2>&1 && echo "ghs_defined"
29
+ alias ghe >/dev/null 2>&1 && echo "ghe_defined"
30
+ ) >/tmp/test_output
31
+
32
+ assert_file_contains "/tmp/test_output" "ghcp_defined" "ghcp alias should be defined when gh available"
33
+ assert_file_contains "/tmp/test_output" "ghs_defined" "ghs alias should be defined when gh available"
34
+ assert_file_contains "/tmp/test_output" "ghe_defined" "ghe alias should be defined when gh available"
35
+
36
+ rm -f /tmp/test_output
37
+ mock_cleanup
38
+
39
+ test_start "github_copilot_aliases_when_gh_unavailable"
40
+ mock_init
41
+ # Use empty mock dir as PATH to ensure real gh isn't found
42
+ # (command -v, source, alias are builtins - don't need PATH)
43
+
44
+ (
45
+ shopt -s expand_aliases
46
+ export PATH="$MOCK_BIN_DIR"
47
+ source "$ALIASES_FILE"
48
+
49
+ # Check aliases are NOT defined
50
+ alias ghcp >/dev/null 2>&1 || echo "ghcp_not_defined"
51
+ alias ghs >/dev/null 2>&1 || echo "ghs_not_defined"
52
+ alias ghe >/dev/null 2>&1 || echo "ghe_not_defined"
53
+ ) >/tmp/test_output
54
+
55
+ assert_file_contains "/tmp/test_output" "ghcp_not_defined" "ghcp alias should not be defined when gh unavailable"
56
+ assert_file_contains "/tmp/test_output" "ghs_not_defined" "ghs alias should not be defined when gh unavailable"
57
+ assert_file_contains "/tmp/test_output" "ghe_not_defined" "ghe alias should not be defined when gh unavailable"
58
+
59
+ rm -f /tmp/test_output
60
+ mock_cleanup
61
+
62
+ test_start "fabric_alias_when_fabric_available"
63
+ mock_init
64
+ mock_command "fabric" "fabric v1.0.0" 0
65
+
66
+ (
67
+ shopt -s expand_aliases
68
+ export PATH="$MOCK_BIN_DIR:$PATH"
69
+ source "$ALIASES_FILE"
70
+
71
+ alias fab >/dev/null 2>&1 && echo "fab_defined"
72
+ ) >/tmp/test_output
73
+
74
+ assert_file_contains "/tmp/test_output" "fab_defined" "fab alias should be defined when fabric available"
75
+
76
+ rm -f /tmp/test_output
77
+ mock_cleanup
78
+
79
+ test_start "fabric_alias_when_fabric_unavailable"
80
+ mock_init
81
+ # Use empty mock dir as PATH to ensure real fabric isn't found
82
+
83
+ (
84
+ shopt -s expand_aliases
85
+ export PATH="$MOCK_BIN_DIR"
86
+ source "$ALIASES_FILE"
87
+
88
+ alias fab >/dev/null 2>&1 || echo "fab_not_defined"
89
+ ) >/tmp/test_output
90
+
91
+ assert_file_contains "/tmp/test_output" "fab_not_defined" "fab alias should not be defined when fabric unavailable"
92
+
93
+ rm -f /tmp/test_output
94
+ mock_cleanup
95
+
96
+ test_start "ollama_aliases_when_ollama_available"
97
+ mock_init
98
+ mock_command "ollama" "ollama version 1.0.0" 0
99
+
100
+ (
101
+ shopt -s expand_aliases
102
+ export PATH="$MOCK_BIN_DIR:$PATH"
103
+ source "$ALIASES_FILE"
104
+
105
+ alias ol >/dev/null 2>&1 && echo "ol_defined"
106
+ alias olr >/dev/null 2>&1 && echo "olr_defined"
107
+ alias oll >/dev/null 2>&1 && echo "oll_defined"
108
+ alias olp >/dev/null 2>&1 && echo "olp_defined"
109
+ alias ollama-status >/dev/null 2>&1 && echo "ollama_status_defined"
110
+ alias ollama-show >/dev/null 2>&1 && echo "ollama_show_defined"
111
+ ) >/tmp/test_output
112
+
113
+ assert_file_contains "/tmp/test_output" "ol_defined" "ol alias should be defined when ollama available"
114
+ assert_file_contains "/tmp/test_output" "olr_defined" "olr alias should be defined when ollama available"
115
+ assert_file_contains "/tmp/test_output" "oll_defined" "oll alias should be defined when ollama available"
116
+ assert_file_contains "/tmp/test_output" "olp_defined" "olp alias should be defined when ollama available"
117
+ assert_file_contains "/tmp/test_output" "ollama_status_defined" "ollama-status alias should be defined when ollama available"
118
+ assert_file_contains "/tmp/test_output" "ollama_show_defined" "ollama-show alias should be defined when ollama available"
119
+
120
+ rm -f /tmp/test_output
121
+ mock_cleanup
122
+
123
+ test_start "ollama_aliases_when_ollama_unavailable"
124
+ mock_init
125
+ # Use empty mock dir as PATH to ensure real ollama isn't found
126
+
127
+ (
128
+ shopt -s expand_aliases
129
+ export PATH="$MOCK_BIN_DIR"
130
+ source "$ALIASES_FILE"
131
+
132
+ alias ol >/dev/null 2>&1 || echo "ol_not_defined"
133
+ alias olr >/dev/null 2>&1 || echo "olr_not_defined"
134
+ alias oll >/dev/null 2>&1 || echo "oll_not_defined"
135
+ alias olp >/dev/null 2>&1 || echo "olp_not_defined"
136
+ alias ollama-status >/dev/null 2>&1 || echo "ollama_status_not_defined"
137
+ alias ollama-show >/dev/null 2>&1 || echo "ollama_show_not_defined"
138
+ ) >/tmp/test_output
139
+
140
+ assert_file_contains "/tmp/test_output" "ol_not_defined" "ol alias should not be defined when ollama unavailable"
141
+ assert_file_contains "/tmp/test_output" "olr_not_defined" "olr alias should not be defined when ollama unavailable"
142
+ assert_file_contains "/tmp/test_output" "oll_not_defined" "oll alias should not be defined when ollama unavailable"
143
+ assert_file_contains "/tmp/test_output" "olp_not_defined" "olp alias should not be defined when ollama unavailable"
144
+ assert_file_contains "/tmp/test_output" "ollama_status_not_defined" "ollama-status alias should not be defined when ollama unavailable"
145
+ assert_file_contains "/tmp/test_output" "ollama_show_not_defined" "ollama-show alias should not be defined when ollama unavailable"
146
+
147
+ rm -f /tmp/test_output
148
+ mock_cleanup
149
+
150
+ test_start "aliases_syntax_check"
151
+ assert_exit_code 0 "bash -n '$ALIASES_FILE'"
152
+
153
+ test_start "aliases_shellcheck"
154
+ if command -v shellcheck >/dev/null 2>&1; then
155
+ assert_exit_code 0 "shellcheck '$ALIASES_FILE'"
156
+ else
157
+ echo "SKIP: shellcheck not available"
158
+ fi
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
5
+
6
+ fail() {
7
+ echo "FAIL: $1" >&2
8
+ exit 1
9
+ }
10
+
11
+ pass() {
12
+ echo "PASS: $1"
13
+ }
14
+
15
+ check_contains() {
16
+ local file="$1"
17
+ local pattern="$2"
18
+ if command -v rg >/dev/null 2>&1; then
19
+ rg -n --fixed-strings "$pattern" "$file" >/dev/null || fail "Missing pattern in $file: $pattern"
20
+ else
21
+ grep -nF "$pattern" "$file" >/dev/null || fail "Missing pattern in $file: $pattern"
22
+ fi
23
+ }
24
+
25
+ HC_FILE="$REPO_ROOT/scripts/ops/health-check.sh"
26
+ APPLY_FILE="$REPO_ROOT/scripts/ops/chezmoi-apply.sh"
27
+ DOC_FILE="$REPO_ROOT/docs/TOOLS.md"
28
+ PYTOOLS_FILE="$REPO_ROOT/install/provision/run_onchange_25-python-tools.sh.tmpl"
29
+
30
+ # Health check should include AI CLIs in optional deps
31
+ check_contains "$HC_FILE" "optional_deps=(ripgrep fd bat fzf eza jq claude gemini sgpt ollama opencode aider)"
32
+
33
+ # Chezmoi apply should emit AI CLI checks
34
+ check_contains "$APPLY_FILE" "AI provider CLI checks (optional):"
35
+ check_contains "$APPLY_FILE" "check_ai_cli \"sgpt\""
36
+ check_contains "$APPLY_FILE" "check_ai_cli \"ollama\""
37
+
38
+ # Tools catalog should list sgpt and ollama
39
+ check_contains "$DOC_FILE" "| sgpt | shell-gpt |"
40
+ check_contains "$DOC_FILE" "| ollama | ollama |"
41
+
42
+ # Python tools should include key dev tools
43
+ check_contains "$PYTOOLS_FILE" "install_python_tool \"pytest\""
44
+ check_contains "$PYTOOLS_FILE" "install_python_tool \"bandit\""
45
+ check_contains "$PYTOOLS_FILE" "install_python_tool \"mypy\""
46
+
47
+ pass "AI CLI dependency checks and docs are wired"
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2012,SC2034
3
+ # Unit tests for the backup function
4
+ # Tests backup creation with various options and edge cases
5
+
6
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
+ source "$SCRIPT_DIR/../framework/assertions.sh"
9
+ source "$SCRIPT_DIR/../framework/mocks.sh"
10
+
11
+ # Source the function being tested
12
+ FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/backup.sh"
13
+ if [[ -f "$FUNC_FILE" ]]; then
14
+ source "$FUNC_FILE"
15
+ else
16
+ echo "Warning: backup.sh not found at $FUNC_FILE"
17
+ fi
18
+
19
+ # Test: backup with no arguments shows error
20
+ test_start "backup_no_args"
21
+ output=$(backup 2>&1)
22
+ exit_code=$?
23
+ assert_equals "1" "$exit_code" "exit code should be 1 for no args"
24
+
25
+ # Test: backup with no arguments shows error message
26
+ test_start "backup_no_args_message"
27
+ output=$(backup 2>&1)
28
+ if [[ "$output" == *"ERROR"* && "$output" == *"provide"* ]]; then
29
+ ((TESTS_PASSED++))
30
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error message for no arguments"
31
+ else
32
+ ((TESTS_FAILED++))
33
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error message for no arguments"
34
+ echo -e " Output: $output"
35
+ fi
36
+
37
+ # Test: backup with nonexistent file
38
+ test_start "backup_nonexistent_file"
39
+ test_dir=$(mock_dir "backup_test")
40
+ export BACKUP_DIR="$test_dir/backups"
41
+ output=$(backup "/nonexistent/file.txt" 2>&1)
42
+ exit_code=$?
43
+ assert_equals "1" "$exit_code" "exit code should be 1 for nonexistent file"
44
+ rm -rf "$test_dir"
45
+
46
+ # Test: backup with unknown option shows error
47
+ test_start "backup_unknown_option"
48
+ output=$(backup --unknown-option 2>&1)
49
+ exit_code=$?
50
+ assert_equals "1" "$exit_code" "exit code should be 1 for unknown option"
51
+
52
+ # Test: backup with unknown option shows error message
53
+ test_start "backup_unknown_option_message"
54
+ output=$(backup --unknown-option 2>&1)
55
+ if [[ "$output" == *"ERROR"* && "$output" == *"Unknown option"* ]]; then
56
+ ((TESTS_PASSED++))
57
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error for unknown option"
58
+ else
59
+ ((TESTS_FAILED++))
60
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error for unknown option"
61
+ echo -e " Output: $output"
62
+ fi
63
+
64
+ # Test: backup creates backup directory if not exists
65
+ test_start "backup_creates_directory"
66
+ test_dir=$(mock_dir "backup_test")
67
+ test_file="$test_dir/testfile.txt"
68
+ echo "test content" >"$test_file"
69
+ export BACKUP_DIR="$test_dir/backups"
70
+
71
+ output=$(backup "$test_file" 2>&1)
72
+
73
+ if [[ -d "$BACKUP_DIR" ]]; then
74
+ ((TESTS_PASSED++))
75
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup directory created"
76
+ else
77
+ ((TESTS_FAILED++))
78
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: backup directory should be created"
79
+ fi
80
+ rm -rf "$test_dir"
81
+
82
+ # Test: backup creates tar archive
83
+ test_start "backup_creates_archive"
84
+ test_dir=$(mock_dir "backup_test")
85
+ test_file="$test_dir/testfile.txt"
86
+ echo "test content" >"$test_file"
87
+ export BACKUP_DIR="$test_dir/backups"
88
+
89
+ output=$(backup "$test_file" 2>&1)
90
+ exit_code=$?
91
+
92
+ # Check if backup file was created
93
+ backup_files=$(ls "$BACKUP_DIR"/backup_*.tar* 2>/dev/null | wc -l | tr -d ' ')
94
+ if [[ "$backup_files" -gt 0 ]]; then
95
+ ((TESTS_PASSED++))
96
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup archive created"
97
+ else
98
+ ((TESTS_FAILED++))
99
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: backup archive should be created"
100
+ echo -e " Output: $output"
101
+ fi
102
+ rm -rf "$test_dir"
103
+
104
+ # Test: backup with --max-size option
105
+ test_start "backup_max_size_option"
106
+ test_dir=$(mock_dir "backup_test")
107
+ test_file="$test_dir/testfile.txt"
108
+ echo "test content" >"$test_file"
109
+ export BACKUP_DIR="$test_dir/backups"
110
+
111
+ output=$(backup --max-size 1K "$test_file" 2>&1)
112
+ exit_code=$?
113
+
114
+ assert_equals "0" "$exit_code" "backup with --max-size should succeed"
115
+ rm -rf "$test_dir"
116
+
117
+ # Test: backup with --keep option
118
+ test_start "backup_keep_option"
119
+ test_dir=$(mock_dir "backup_test")
120
+ test_file="$test_dir/testfile.txt"
121
+ echo "test content" >"$test_file"
122
+ export BACKUP_DIR="$test_dir/backups"
123
+
124
+ output=$(backup --keep 3 "$test_file" 2>&1)
125
+ exit_code=$?
126
+
127
+ assert_equals "0" "$exit_code" "backup with --keep should succeed"
128
+ rm -rf "$test_dir"
129
+
130
+ # Test: backup with invalid size unit
131
+ test_start "backup_invalid_size_unit"
132
+ test_dir=$(mock_dir "backup_test")
133
+ test_file="$test_dir/testfile.txt"
134
+ echo "test content" >"$test_file"
135
+ export BACKUP_DIR="$test_dir/backups"
136
+
137
+ output=$(backup --max-size 100X "$test_file" 2>&1)
138
+ exit_code=$?
139
+
140
+ # Should fail or warn with invalid unit
141
+ if [[ "$exit_code" -ne 0 ]] || [[ "$output" == *"Invalid unit"* ]] || [[ "$output" == *"ERROR"* ]] || [[ "$output" == *"WARNING"* ]]; then
142
+ ((TESTS_PASSED++))
143
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: invalid size unit handled"
144
+ else
145
+ ((TESTS_FAILED++))
146
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should reject or warn about invalid size unit '100X'"
147
+ echo -e " Exit code: $exit_code"
148
+ echo -e " Output: $output"
149
+ fi
150
+ rm -rf "$test_dir"
151
+
152
+ # Test: backup multiple files
153
+ test_start "backup_multiple_files"
154
+ test_dir=$(mock_dir "backup_test")
155
+ test_file1="$test_dir/testfile1.txt"
156
+ test_file2="$test_dir/testfile2.txt"
157
+ echo "content 1" >"$test_file1"
158
+ echo "content 2" >"$test_file2"
159
+ export BACKUP_DIR="$test_dir/backups"
160
+
161
+ output=$(backup "$test_file1" "$test_file2" 2>&1)
162
+ exit_code=$?
163
+
164
+ assert_equals "0" "$exit_code" "backup of multiple files should succeed"
165
+ rm -rf "$test_dir"
166
+
167
+ # Test: backup shows INFO messages
168
+ test_start "backup_info_messages"
169
+ test_dir=$(mock_dir "backup_test")
170
+ test_file="$test_dir/testfile.txt"
171
+ echo "test content" >"$test_file"
172
+ export BACKUP_DIR="$test_dir/backups"
173
+
174
+ output=$(backup "$test_file" 2>&1)
175
+
176
+ if [[ "$output" == *"INFO"* ]]; then
177
+ ((TESTS_PASSED++))
178
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows INFO messages"
179
+ else
180
+ ((TESTS_FAILED++))
181
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should show INFO messages"
182
+ echo -e " Output: $output"
183
+ fi
184
+ rm -rf "$test_dir"
185
+
186
+ # Test: backup retention (--keep)
187
+ test_start "backup_retention"
188
+ test_dir=$(mock_dir "backup_test")
189
+ test_file="$test_dir/testfile.txt"
190
+ echo "test content" >"$test_file"
191
+ export BACKUP_DIR="$test_dir/backups"
192
+
193
+ # Create multiple backups
194
+ for i in {1..4}; do
195
+ backup --keep 2 "$test_file" >/dev/null 2>&1
196
+ done
197
+
198
+ # Count remaining backups
199
+ backup_count=$(ls "$BACKUP_DIR"/backup_*.tar* 2>/dev/null | wc -l | tr -d ' ')
200
+
201
+ if [[ "$backup_count" -le 2 ]]; then
202
+ ((TESTS_PASSED++))
203
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup retention works (kept $backup_count)"
204
+ else
205
+ ((TESTS_FAILED++))
206
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should keep only 2 backups, found $backup_count"
207
+ fi
208
+ rm -rf "$test_dir"
209
+
210
+ # Test: backup a directory
211
+ test_start "backup_directory"
212
+ test_dir=$(mock_dir "backup_test")
213
+ content_dir="$test_dir/content"
214
+ mkdir -p "$content_dir"
215
+ echo "file1" >"$content_dir/file1.txt"
216
+ echo "file2" >"$content_dir/file2.txt"
217
+ export BACKUP_DIR="$test_dir/backups"
218
+
219
+ output=$(backup "$content_dir" 2>&1)
220
+ exit_code=$?
221
+
222
+ assert_equals "0" "$exit_code" "backup of directory should succeed"
223
+ rm -rf "$test_dir"
224
+
225
+ echo ""
226
+ echo "Backup function tests completed."
227
+ echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"