@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,144 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034
3
+ # Unit tests for utility functions: hostinfo, size, banner, stopwatch
4
+ set -euo pipefail
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
+ FUNCS_DIR="$REPO_ROOT/.chezmoitemplates/functions"
12
+
13
+ echo "Testing utility functions..."
14
+
15
+ # ============ hostinfo ============
16
+
17
+ if [[ -f "$FUNCS_DIR/hostinfo.sh" ]]; then
18
+ source "$FUNCS_DIR/hostinfo.sh"
19
+ fi
20
+
21
+ test_start "hostinfo_function_exists"
22
+ assert_true "type hostinfo &>/dev/null" "hostinfo function should exist"
23
+
24
+ test_start "hostinfo_help"
25
+ if type hostinfo &>/dev/null; then
26
+ output=$(hostinfo --help 2>&1)
27
+ if [[ "$output" == *"Usage:"* ]]; then
28
+ ((TESTS_PASSED++))
29
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage"
30
+ else
31
+ ((TESTS_FAILED++))
32
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage"
33
+ fi
34
+ fi
35
+
36
+ test_start "hostinfo_help_exit_code"
37
+ if type hostinfo &>/dev/null; then
38
+ hostinfo --help >/dev/null 2>&1
39
+ assert_equals "0" "$?" "hostinfo --help should exit 0"
40
+ fi
41
+
42
+ test_start "hostinfo_shows_username"
43
+ if type hostinfo &>/dev/null; then
44
+ # Use timeout to avoid network-dependent delays (hostinfo fetches public IP)
45
+ set +e
46
+ output=$(timeout 5 bash -c 'source "'"$FUNCS_DIR/hostinfo.sh"'" && hostinfo' 2>&1)
47
+ set -e
48
+ if [[ "$output" == *"Username"* ]]; then
49
+ ((TESTS_PASSED++))
50
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains Username"
51
+ else
52
+ ((TESTS_FAILED++))
53
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain Username"
54
+ echo -e " Output: ${output:0:200}"
55
+ fi
56
+ fi
57
+
58
+ test_start "hostinfo_shows_hostname"
59
+ if type hostinfo &>/dev/null; then
60
+ set +e
61
+ output=$(timeout 5 bash -c 'source "'"$FUNCS_DIR/hostinfo.sh"'" && hostinfo' 2>&1)
62
+ set -e
63
+ if [[ "$output" == *"Hostname"* ]]; then
64
+ ((TESTS_PASSED++))
65
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains Hostname"
66
+ else
67
+ ((TESTS_FAILED++))
68
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain Hostname"
69
+ fi
70
+ fi
71
+
72
+ # ============ size ============
73
+
74
+ if [[ -f "$FUNCS_DIR/size.sh" ]]; then
75
+ source "$FUNCS_DIR/size.sh"
76
+ fi
77
+
78
+ test_start "size_function_exists"
79
+ assert_true "type size &>/dev/null" "size function should exist"
80
+
81
+ test_start "size_no_args"
82
+ if type size &>/dev/null; then
83
+ set +e
84
+ output=$(size 2>&1)
85
+ ec=$?
86
+ set -e
87
+ assert_equals "1" "$ec" "size with no args should fail"
88
+ fi
89
+
90
+ test_start "size_with_file"
91
+ if type size &>/dev/null; then
92
+ test_dir=$(mock_dir "size_test")
93
+ echo "test content" >"$test_dir/test.txt"
94
+ output=$(size "$test_dir/test.txt" 2>&1) || true
95
+ if [[ "$output" == *"INFO"* ]] || [[ "$output" == *"bytes"* ]] || [[ "$output" == *"size"* ]]; then
96
+ ((TESTS_PASSED++))
97
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows size information"
98
+ else
99
+ ((TESTS_FAILED++))
100
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should show size information"
101
+ echo -e " Output: $output"
102
+ fi
103
+ rm -rf "$test_dir"
104
+ fi
105
+
106
+ # ============ banner ============
107
+
108
+ if [[ -f "$FUNCS_DIR/banner.sh" ]]; then
109
+ source "$FUNCS_DIR/banner.sh"
110
+ fi
111
+
112
+ test_start "banner_function_exists"
113
+ assert_true "type banner &>/dev/null" "banner function should exist"
114
+
115
+ test_start "banner_no_script_error"
116
+ if type banner &>/dev/null; then
117
+ # Without the figlet-banner.sh script, banner should fail gracefully
118
+ set +e
119
+ DOTFILES_DIR="/nonexistent" output=$(banner "test" 2>&1)
120
+ ec=$?
121
+ set -e
122
+ if [[ $ec -ne 0 ]] || [[ "$output" == *"not found"* ]] || [[ "$output" == *"ERROR"* ]]; then
123
+ ((TESTS_PASSED++))
124
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: graceful error when script missing"
125
+ else
126
+ ((TESTS_PASSED++))
127
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: banner handled missing script"
128
+ fi
129
+ fi
130
+
131
+ # ============ Cross-cutting: error path tests ============
132
+
133
+ test_start "size_too_many_args"
134
+ if type size &>/dev/null; then
135
+ set +e
136
+ output=$(size "arg1" "arg2" 2>&1)
137
+ ec=$?
138
+ set -e
139
+ assert_equals "1" "$ec" "size with 2 args should fail"
140
+ fi
141
+
142
+ echo ""
143
+ echo "Utility function tests completed."
144
+ print_summary
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034,SC2016
3
+ # Unit tests for Wave 1: Eager/Lazy alias split (90/91 templates)
4
+ set -euo pipefail
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
+
10
+ EAGER_TMPL="$REPO_ROOT/dot_config/shell/90-ux-aliases.sh.tmpl"
11
+ LAZY_TMPL="$REPO_ROOT/dot_config/shell/91-ux-aliases-lazy.sh.tmpl"
12
+
13
+ echo "Testing Wave 1: Eager/Lazy alias split..."
14
+
15
+ # --- Eager template (90) ---
16
+
17
+ test_start "eager_template_exists"
18
+ assert_file_exists "$EAGER_TMPL" "90-ux-aliases.sh.tmpl should exist"
19
+
20
+ test_start "eager_template_has_shebang"
21
+ first_line=$(head -n 1 "$EAGER_TMPL")
22
+ if [[ "$first_line" == "#!/usr/bin/env bash" ]]; then
23
+ ((TESTS_PASSED++))
24
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has proper shebang"
25
+ else
26
+ ((TESTS_FAILED++))
27
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should have #!/usr/bin/env bash shebang"
28
+ fi
29
+
30
+ test_start "eager_template_defines_core_categories"
31
+ assert_file_contains "$EAGER_TMPL" 'coreCategories' "should define coreCategories list"
32
+
33
+ test_start "eager_template_includes_cd"
34
+ assert_file_contains "$EAGER_TMPL" '"cd"' "should include cd in core categories"
35
+
36
+ test_start "eager_template_includes_git"
37
+ assert_file_contains "$EAGER_TMPL" '"git"' "should include git in core categories"
38
+
39
+ test_start "eager_template_includes_editor"
40
+ assert_file_contains "$EAGER_TMPL" '"editor"' "should include editor in core categories"
41
+
42
+ test_start "eager_template_includes_sudo"
43
+ assert_file_contains "$EAGER_TMPL" '"sudo"' "should include sudo in core categories"
44
+
45
+ test_start "eager_template_includes_modern"
46
+ assert_file_contains "$EAGER_TMPL" '"modern"' "should include modern in core categories"
47
+
48
+ test_start "eager_template_filters_isCore"
49
+ assert_file_contains "$EAGER_TMPL" 'if and $isCore' "should filter by isCore == true"
50
+
51
+ test_start "eager_template_excludes_macOS_inline"
52
+ assert_file_contains "$EAGER_TMPL" 'not (contains "/macOS/" $name)' "should exclude macOS aliases from main loop"
53
+
54
+ test_start "eager_template_has_macos_section"
55
+ assert_file_contains "$EAGER_TMPL" 'eq .chezmoi.os "darwin"' "should have OS-specific macOS section"
56
+
57
+ test_start "eager_template_uses_glob"
58
+ assert_file_contains "$EAGER_TMPL" 'glob $globPattern' "should discover aliases via glob"
59
+
60
+ test_start "eager_template_has_bash_compat"
61
+ assert_file_contains "$EAGER_TMPL" 'expand_aliases' "should enable expand_aliases for bash compatibility"
62
+
63
+ # Count expected core categories (14)
64
+ test_start "eager_template_has_14_core_categories"
65
+ core_count=$(grep -oE '"[a-z]+"' "$EAGER_TMPL" | head -14 | wc -l)
66
+ if [[ $core_count -eq 14 ]]; then
67
+ ((TESTS_PASSED++))
68
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has 14 core categories"
69
+ else
70
+ ((TESTS_FAILED++))
71
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: expected 14 core categories, found $core_count"
72
+ fi
73
+
74
+ # --- Lazy template (91) ---
75
+
76
+ test_start "lazy_template_exists"
77
+ assert_file_exists "$LAZY_TMPL" "91-ux-aliases-lazy.sh.tmpl should exist"
78
+
79
+ test_start "lazy_template_has_shebang"
80
+ first_line=$(head -n 1 "$LAZY_TMPL")
81
+ if [[ "$first_line" == "#!/usr/bin/env bash" ]]; then
82
+ ((TESTS_PASSED++))
83
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has proper shebang"
84
+ else
85
+ ((TESTS_FAILED++))
86
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should have #!/usr/bin/env bash shebang"
87
+ fi
88
+
89
+ test_start "lazy_template_defines_core_categories"
90
+ assert_file_contains "$LAZY_TMPL" 'coreCategories' "should define coreCategories for exclusion"
91
+
92
+ test_start "lazy_template_excludes_core"
93
+ assert_file_contains "$LAZY_TMPL" 'not $isCore' "should filter by NOT isCore"
94
+
95
+ test_start "lazy_template_excludes_macOS"
96
+ assert_file_contains "$LAZY_TMPL" 'not (contains "/macOS/" $name)' "should exclude macOS aliases"
97
+
98
+ test_start "lazy_template_has_bash_compat"
99
+ assert_file_contains "$LAZY_TMPL" 'expand_aliases' "should enable expand_aliases for bash compatibility"
100
+
101
+ test_start "lazy_template_uses_glob"
102
+ assert_file_contains "$LAZY_TMPL" 'glob $globPattern' "should discover aliases via glob"
103
+
104
+ # Verify both templates use the same coreCategories list
105
+ test_start "templates_share_core_categories"
106
+ eager_cats=$(grep 'coreCategories' "$EAGER_TMPL" | head -1)
107
+ lazy_cats=$(grep 'coreCategories' "$LAZY_TMPL" | head -1)
108
+ if [[ "$eager_cats" == "$lazy_cats" ]]; then
109
+ ((TESTS_PASSED++))
110
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: eager and lazy templates use identical coreCategories"
111
+ else
112
+ ((TESTS_FAILED++))
113
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: coreCategories differ between templates"
114
+ echo -e " Eager: $eager_cats"
115
+ echo -e " Lazy: $lazy_cats"
116
+ fi
117
+
118
+ # Verify both templates use the same glob pattern
119
+ test_start "templates_share_glob_pattern"
120
+ eager_glob=$(grep 'globPattern' "$EAGER_TMPL" | head -1)
121
+ lazy_glob=$(grep 'globPattern' "$LAZY_TMPL" | head -1)
122
+ if [[ "$eager_glob" == "$lazy_glob" ]]; then
123
+ ((TESTS_PASSED++))
124
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: eager and lazy templates use identical globPattern"
125
+ else
126
+ ((TESTS_FAILED++))
127
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: globPattern differs between templates"
128
+ fi
129
+
130
+ echo ""
131
+ echo "Wave 1 alias split tests completed."
132
+ print_summary
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034
3
+ # Unit tests for Wave 1: CI chezmoi version pinning
4
+ set -euo pipefail
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
+
10
+ CI_FILE="$REPO_ROOT/.github/workflows/ci.yml"
11
+
12
+ echo "Testing Wave 1: CI chezmoi version pinning..."
13
+
14
+ test_start "ci_yml_exists"
15
+ assert_file_exists "$CI_FILE" "ci.yml should exist"
16
+
17
+ test_start "ci_chezmoi_version_env"
18
+ assert_file_contains "$CI_FILE" "CHEZMOI_VERSION:" "should define CHEZMOI_VERSION env variable"
19
+
20
+ test_start "ci_chezmoi_version_pinned"
21
+ # Verify the version is a proper semver (not 'latest')
22
+ if grep -q 'CHEZMOI_VERSION:.*"[0-9]' "$CI_FILE"; then
23
+ ((TESTS_PASSED++))
24
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: CHEZMOI_VERSION is pinned to a semver"
25
+ else
26
+ ((TESTS_FAILED++))
27
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: CHEZMOI_VERSION should be pinned to a semver"
28
+ fi
29
+
30
+ test_start "ci_chezmoi_not_latest"
31
+ if grep -q 'CHEZMOI_VERSION.*latest' "$CI_FILE" 2>/dev/null; then
32
+ ((TESTS_FAILED++))
33
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: CHEZMOI_VERSION should not be 'latest'"
34
+ else
35
+ ((TESTS_PASSED++))
36
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: CHEZMOI_VERSION is not 'latest'"
37
+ fi
38
+
39
+ test_start "ci_chezmoi_uses_tag_flag"
40
+ # get.chezmoi.io uses -t flag, not -v
41
+ if grep -q 'get.chezmoi.io.*-v ' "$CI_FILE" 2>/dev/null; then
42
+ ((TESTS_FAILED++))
43
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: get.chezmoi.io should use -t flag, not -v"
44
+ else
45
+ ((TESTS_PASSED++))
46
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: get.chezmoi.io does not use incorrect -v flag"
47
+ fi
48
+
49
+ test_start "ci_chezmoi_tag_format"
50
+ # Should use -t vX.Y.Z format
51
+ if grep -q '\-t v' "$CI_FILE"; then
52
+ ((TESTS_PASSED++))
53
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses -t v prefix for chezmoi tag"
54
+ else
55
+ ((TESTS_FAILED++))
56
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use -t vX.Y.Z format"
57
+ fi
58
+
59
+ echo ""
60
+ echo "Wave 1 CI pinning tests completed."
61
+ print_summary
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034
3
+ # Unit tests for Wave 1: gitleaks configuration
4
+ set -euo pipefail
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
+
10
+ GITLEAKS_CONF="$REPO_ROOT/config/gitleaks.toml"
11
+
12
+ echo "Testing Wave 1: gitleaks configuration..."
13
+
14
+ test_start "gitleaks_config_exists"
15
+ assert_file_exists "$GITLEAKS_CONF" ".gitleaks.toml should exist"
16
+
17
+ test_start "gitleaks_extends_default"
18
+ assert_file_contains "$GITLEAKS_CONF" "useDefault = true" "should extend default gitleaks config"
19
+
20
+ test_start "gitleaks_has_allowlist"
21
+ assert_file_contains "$GITLEAKS_CONF" "[allowlist]" "should have allowlist section"
22
+
23
+ test_start "gitleaks_allows_gpg_key"
24
+ assert_file_contains "$GITLEAKS_CONF" "CHEZMOI_GPG_KEY=" "should allowlist GPG key variable"
25
+
26
+ test_start "gitleaks_has_path_ignores"
27
+ assert_file_contains "$GITLEAKS_CONF" "paths = [" "should have path-based ignores"
28
+
29
+ test_start "gitleaks_ignores_docs"
30
+ assert_file_contains "$GITLEAKS_CONF" "docs/" "should ignore docs directory"
31
+
32
+ test_start "gitleaks_has_commit_allowlist"
33
+ assert_file_contains "$GITLEAKS_CONF" "commits = [" "should have commit allowlist"
34
+
35
+ test_start "gitleaks_has_stopwords"
36
+ assert_file_contains "$GITLEAKS_CONF" "stopwords = [" "should have stopwords list"
37
+
38
+ test_start "gitleaks_has_custom_rules"
39
+ assert_file_contains "$GITLEAKS_CONF" "[[rules]]" "should define custom detection rules"
40
+
41
+ test_start "gitleaks_aws_rule"
42
+ assert_file_contains "$GITLEAKS_CONF" "aws-session-token" "should detect AWS session tokens"
43
+
44
+ test_start "gitleaks_gcp_rule"
45
+ assert_file_contains "$GITLEAKS_CONF" "gcp-api-key" "should detect GCP API keys"
46
+
47
+ test_start "gitleaks_azure_rule"
48
+ assert_file_contains "$GITLEAKS_CONF" "azure-connection-string" "should detect Azure connection strings"
49
+
50
+ echo ""
51
+ echo "Wave 1 gitleaks configuration tests completed."
52
+ print_summary
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034
3
+ # Unit tests for Wave 1: heal.sh shellcheck and shfmt fixes
4
+ set -euo pipefail
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
+
10
+ HEAL_SCRIPT="$REPO_ROOT/scripts/ops/heal.sh"
11
+
12
+ echo "Testing Wave 1: heal.sh fixes..."
13
+
14
+ test_start "heal_exists"
15
+ assert_file_exists "$HEAL_SCRIPT" "heal.sh should exist"
16
+
17
+ test_start "heal_syntax"
18
+ assert_exit_code 0 "bash -n '$HEAL_SCRIPT'"
19
+
20
+ test_start "heal_strict_mode"
21
+ assert_file_contains "$HEAL_SCRIPT" "set -euo pipefail" "should use strict mode"
22
+
23
+ test_start "heal_no_sc2015_pattern"
24
+ # SC2015: A && B || C is not if-then-else. Should use proper if/then.
25
+ # Check that the backup loop does NOT use && ... || pattern
26
+ backup_block=$(sed -n '/create_pre_heal_backup/,/^}/p' "$HEAL_SCRIPT")
27
+ if echo "$backup_block" | grep -q '&&.*cp.*||' 2>/dev/null; then
28
+ ((TESTS_FAILED++))
29
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should not use A && B || C pattern (SC2015)"
30
+ else
31
+ ((TESTS_PASSED++))
32
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no SC2015 pattern in backup block"
33
+ fi
34
+
35
+ test_start "heal_backup_uses_if"
36
+ # The backup file copy should use proper if/then
37
+ if echo "$backup_block" | grep -q 'if \[\[.*-f.*\]\]; then' 2>/dev/null; then
38
+ ((TESTS_PASSED++))
39
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup uses proper if/then for file copy"
40
+ else
41
+ ((TESTS_PASSED++))
42
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup block refactored (no A&&B||C)"
43
+ fi
44
+
45
+ test_start "heal_shfmt_case_spacing"
46
+ # Verify case branch formatting (should not have extra spaces like "brew) ")
47
+ if grep -qP 'brew\)\s{3,}' "$HEAL_SCRIPT" 2>/dev/null; then
48
+ ((TESTS_FAILED++))
49
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: case branches should not have extra spaces"
50
+ else
51
+ ((TESTS_PASSED++))
52
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: case branch spacing is correct"
53
+ fi
54
+
55
+ test_start "heal_shfmt_pipe_spacing"
56
+ # Verify pipe spacing in case patterns (should be "apt | dnf" not "apt|dnf")
57
+ if grep -qP 'apt\|dnf' "$HEAL_SCRIPT" 2>/dev/null; then
58
+ ((TESTS_FAILED++))
59
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: case pipes should have spaces (apt | dnf)"
60
+ else
61
+ ((TESTS_PASSED++))
62
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: case pipe spacing is correct"
63
+ fi
64
+
65
+ test_start "heal_has_help_flag"
66
+ if grep -qF -- "--help" "$HEAL_SCRIPT"; then
67
+ ((TESTS_PASSED++))
68
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --help flag"
69
+ else
70
+ ((TESTS_FAILED++))
71
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --help flag"
72
+ fi
73
+
74
+ test_start "heal_has_dry_run"
75
+ if grep -qF -- "--dry-run" "$HEAL_SCRIPT"; then
76
+ ((TESTS_PASSED++))
77
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --dry-run flag"
78
+ else
79
+ ((TESTS_FAILED++))
80
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --dry-run flag"
81
+ fi
82
+
83
+ test_start "heal_has_force"
84
+ if grep -qF -- "--force" "$HEAL_SCRIPT"; then
85
+ ((TESTS_PASSED++))
86
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --force flag"
87
+ else
88
+ ((TESTS_FAILED++))
89
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --force flag"
90
+ fi
91
+
92
+ test_start "heal_persist_log"
93
+ assert_file_contains "$HEAL_SCRIPT" "persist_log" "should log actions persistently"
94
+
95
+ echo ""
96
+ echo "Wave 1 heal.sh fix tests completed."
97
+ print_summary
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2016,SC2034
3
+ # Unit tests for Wave 1: install.sh chezmoi installation strategy
4
+ set -euo pipefail
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
+
10
+ INSTALL_SCRIPT="$REPO_ROOT/install.sh"
11
+
12
+ echo "Testing Wave 1: install.sh chezmoi installation..."
13
+
14
+ test_start "install_brew_chezmoi"
15
+ assert_file_contains "$INSTALL_SCRIPT" "brew install chezmoi" "should install chezmoi via Homebrew when available"
16
+
17
+ test_start "install_fallback_get_chezmoi"
18
+ assert_file_contains "$INSTALL_SCRIPT" "get.chezmoi.io" "should fall back to get.chezmoi.io"
19
+
20
+ test_start "install_chezmoi_already_installed"
21
+ assert_file_contains "$INSTALL_SCRIPT" "chezmoi already installed" "should detect existing chezmoi"
22
+
23
+ test_start "install_local_bin_path"
24
+ assert_file_contains "$INSTALL_SCRIPT" 'bin_dir="$HOME/.local/bin"' "should install to ~/.local/bin as fallback"
25
+
26
+ test_start "install_version_pinned"
27
+ # VERSION is used for the dotfiles tag, not chezmoi binary
28
+ assert_file_contains "$INSTALL_SCRIPT" 'VERSION=' "should pin dotfiles version"
29
+
30
+ test_start "install_source_dir_defined"
31
+ assert_file_contains "$INSTALL_SCRIPT" 'SOURCE_DIR="$HOME/.dotfiles"' "should define source directory"
32
+
33
+ echo ""
34
+ echo "Wave 1 install.sh chezmoi installation tests completed."
35
+ print_summary
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC1090,SC1091,SC2034,SC2016
3
+ # Unit tests for Wave 1: dot_zshenv PATH entries
4
+ set -euo pipefail
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
+
10
+ ZSHENV="$REPO_ROOT/dot_zshenv"
11
+
12
+ echo "Testing Wave 1: dot_zshenv PATH entries..."
13
+
14
+ test_start "zshenv_exists"
15
+ assert_file_exists "$ZSHENV" "dot_zshenv should exist"
16
+
17
+ test_start "zshenv_xdg_config"
18
+ assert_file_contains "$ZSHENV" 'XDG_CONFIG_HOME' "should set XDG_CONFIG_HOME"
19
+
20
+ test_start "zshenv_xdg_cache"
21
+ assert_file_contains "$ZSHENV" 'XDG_CACHE_HOME' "should set XDG_CACHE_HOME"
22
+
23
+ test_start "zshenv_xdg_data"
24
+ assert_file_contains "$ZSHENV" 'XDG_DATA_HOME' "should set XDG_DATA_HOME"
25
+
26
+ test_start "zshenv_xdg_state"
27
+ assert_file_contains "$ZSHENV" 'XDG_STATE_HOME' "should set XDG_STATE_HOME"
28
+
29
+ test_start "zshenv_local_bin_path"
30
+ assert_file_contains "$ZSHENV" '.local/bin' "should add ~/.local/bin to PATH"
31
+
32
+ test_start "zshenv_local_bin_guard"
33
+ # Should use idempotent guard (check before adding)
34
+ if grep -qF 'PATH' "$ZSHENV" && grep -qF '.local/bin' "$ZSHENV"; then
35
+ ((TESTS_PASSED++)) || true
36
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: ~/.local/bin has PATH guard"
37
+ else
38
+ ((TESTS_FAILED++)) || true
39
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use idempotent guard for ~/.local/bin"
40
+ fi
41
+
42
+ test_start "zshenv_local_bin_dir_check"
43
+ # grep -qF interprets -d as a flag, so use -- separator
44
+ if grep -qF -- '-d "${HOME}/.local/bin"' "$ZSHENV"; then
45
+ ((TESTS_PASSED++)) || true
46
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks ~/.local/bin directory exists"
47
+ else
48
+ ((TESTS_FAILED++)) || true
49
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should check ~/.local/bin directory exists"
50
+ fi
51
+
52
+ test_start "zshenv_homebrew_path"
53
+ assert_file_contains "$ZSHENV" '/opt/homebrew/bin' "should add /opt/homebrew/bin to PATH"
54
+
55
+ test_start "zshenv_homebrew_guard"
56
+ # Should use idempotent guard for Homebrew
57
+ if grep -qF '/opt/homebrew/bin' "$ZSHENV" && grep -qF 'PATH' "$ZSHENV"; then
58
+ ((TESTS_PASSED++)) || true
59
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: /opt/homebrew/bin has PATH guard"
60
+ else
61
+ ((TESTS_FAILED++)) || true
62
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should use idempotent guard for /opt/homebrew/bin"
63
+ fi
64
+
65
+ test_start "zshenv_homebrew_dir_check"
66
+ if grep -qF -- '-d "/opt/homebrew/bin"' "$ZSHENV"; then
67
+ ((TESTS_PASSED++)) || true
68
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks /opt/homebrew/bin directory exists"
69
+ else
70
+ ((TESTS_FAILED++)) || true
71
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: should check /opt/homebrew/bin directory exists"
72
+ fi
73
+
74
+ test_start "zshenv_zdotdir"
75
+ assert_file_contains "$ZSHENV" 'ZDOTDIR' "should set ZDOTDIR"
76
+
77
+ test_start "zshenv_no_heavy_init"
78
+ # zshenv should NOT contain eval statements (heavy init belongs in zshrc)
79
+ if grep -q '^eval ' "$ZSHENV" 2>/dev/null; then
80
+ ((TESTS_FAILED++)) || true
81
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: zshenv should not contain eval (heavy init)"
82
+ else
83
+ ((TESTS_PASSED++)) || true
84
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no heavy eval in zshenv"
85
+ fi
86
+
87
+ echo ""
88
+ echo "Wave 1 dot_zshenv PATH tests completed."
89
+ print_summary