@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,91 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # standard-benchmarks.sh
4
+ # Measures shell startup time (total and per-component).
5
+ # Optional threshold enforcement via DOTFILES_BENCH_MAX_MS.
6
+
7
+ set -euo pipefail
8
+
9
+ log_info() { echo -e "\n[INFO] $*"; }
10
+
11
+ MAX_MS="${DOTFILES_BENCH_MAX_MS:-}"
12
+
13
+ # ── Section 1: Total startup benchmark ──────────────────────────
14
+ log_info "=== Total Startup Benchmark ==="
15
+
16
+ if command -v hyperfine >/dev/null; then
17
+ log_info "Running benchmark with hyperfine..."
18
+ tmp_json="$(mktemp)"
19
+ hyperfine --warmup 3 --min-runs 10 --export-json "$tmp_json" "zsh -i -c exit"
20
+
21
+ if [[ -n "$MAX_MS" ]] && command -v python3 >/dev/null; then
22
+ python3 - "$tmp_json" "$MAX_MS" <<'PY'
23
+ import json, sys
24
+ path, max_ms = sys.argv[1], float(sys.argv[2])
25
+ with open(path, "r", encoding="utf-8") as f:
26
+ data = json.load(f)
27
+ mean_s = data["results"][0]["mean"]
28
+ mean_ms = mean_s * 1000.0
29
+ print(f"[INFO] Mean startup: {mean_ms:.1f} ms (limit: {max_ms:.1f} ms)")
30
+ if mean_ms > max_ms:
31
+ print(f"[FAIL] Startup time exceeded limit: {mean_ms:.1f} ms > {max_ms:.1f} ms")
32
+ sys.exit(1)
33
+ PY
34
+ fi
35
+ rm -f "$tmp_json"
36
+ else
37
+ log_info "Hyperfine not found. Using simple loop..."
38
+ echo "Running 10 iterations of 'zsh -i -c exit'..."
39
+ for _ in {1..10}; do
40
+ time zsh -i -c exit
41
+ done
42
+ fi
43
+
44
+ # ── Section 2: Component-level profiling ────────────────────────
45
+ log_info "=== Component-Level Profile ==="
46
+ log_info "Profiling individual zshrc components via zsh/zprof..."
47
+
48
+ # Use zsh's built-in zprof module if available
49
+ if command -v zsh >/dev/null; then
50
+ zsh -c '
51
+ zmodload zsh/zprof 2>/dev/null
52
+ # Source the real zshrc (DOTFILES_SOURCED guard is reset in a fresh shell)
53
+ [[ -f "$HOME/.zshrc" ]] && source "$HOME/.zshrc"
54
+ zprof
55
+ ' 2>/dev/null | head -40
56
+
57
+ echo ""
58
+ log_info "Component timing (manual measurement):"
59
+
60
+ # Measure key init commands individually
61
+ _bench_component() {
62
+ local label="$1"
63
+ shift
64
+ local start end elapsed
65
+ if command -v perl >/dev/null 2>&1; then
66
+ start=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
67
+ zsh -c "$*" >/dev/null 2>&1 || true
68
+ end=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
69
+ else
70
+ start=$(($(date +%s) * 1000))
71
+ zsh -c "$*" >/dev/null 2>&1 || true
72
+ end=$(($(date +%s) * 1000))
73
+ fi
74
+ elapsed=$((end - start))
75
+ printf " %-30s %4d ms\n" "$label" "$elapsed"
76
+ }
77
+
78
+ _bench_component "bare zsh (baseline)" "exit"
79
+ _bench_component "zinit + plugins" "source \"\${XDG_DATA_HOME:-\$HOME/.local/share}/zinit/zinit.git/zinit.zsh\" 2>/dev/null; exit"
80
+ _bench_component "compinit" "autoload -Uz compinit && compinit -C; exit"
81
+ _bench_component "starship init" "command -v starship >/dev/null && eval \"\$(starship init zsh)\"; exit"
82
+ _bench_component "atuin init" "command -v atuin >/dev/null && eval \"\$(atuin init zsh)\"; exit"
83
+ _bench_component "zoxide init" "command -v zoxide >/dev/null && eval \"\$(zoxide init zsh)\"; exit"
84
+ _bench_component "fnm env" "command -v fnm >/dev/null && eval \"\$(fnm env --use-on-cd)\"; exit"
85
+ _bench_component "fzf completions" "[[ -f /opt/homebrew/opt/fzf/shell/completion.zsh ]] && source /opt/homebrew/opt/fzf/shell/completion.zsh; exit"
86
+
87
+ echo ""
88
+ log_info "Component profiling complete."
89
+ else
90
+ echo "[WARN] zsh not found, skipping component profiling."
91
+ fi
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC2034
3
+ # Assertion library for shell tests
4
+ # Provides a comprehensive set of assertion functions for testing shell scripts
5
+ #
6
+ # Security note: This file uses eval to execute test commands and conditions.
7
+ # This is intentional and necessary for the test assertion framework to work.
8
+ # These functions are only used in test code and should never be called with
9
+ # untrusted input. All eval calls carry a shellcheck disable directive.
10
+
11
+ TESTS_RUN=0
12
+ TESTS_PASSED=0
13
+ TESTS_FAILED=0
14
+ CURRENT_TEST=""
15
+
16
+ # Colors
17
+ RED='\033[0;31m'
18
+ GREEN='\033[0;32m'
19
+ YELLOW='\033[0;33m'
20
+ NC='\033[0m'
21
+
22
+ # Start a new test case
23
+ test_start() {
24
+ CURRENT_TEST="$1"
25
+ ((TESTS_RUN++)) || true
26
+ }
27
+
28
+ # Assert two values are equal
29
+ assert_equals() {
30
+ local expected="$1" actual="$2" msg="${3:-values should be equal}"
31
+ if [[ "$expected" == "$actual" ]]; then
32
+ ((TESTS_PASSED++)) || true
33
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
34
+ return 0
35
+ else
36
+ ((TESTS_FAILED++)) || true
37
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
38
+ echo -e " Expected: '$expected'"
39
+ echo -e " Actual: '$actual'"
40
+ return 1
41
+ fi
42
+ }
43
+
44
+ # Assert two values are not equal
45
+ assert_not_equals() {
46
+ local unexpected="$1" actual="$2" msg="${3:-values should differ}"
47
+ if [[ "$unexpected" != "$actual" ]]; then
48
+ ((TESTS_PASSED++)) || true
49
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
50
+ return 0
51
+ else
52
+ ((TESTS_FAILED++)) || true
53
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
54
+ echo -e " Unexpected: '$unexpected'"
55
+ echo -e " Actual: '$actual'"
56
+ return 1
57
+ fi
58
+ }
59
+
60
+ # Assert a command exits with expected code
61
+ assert_exit_code() {
62
+ local expected="$1"
63
+ shift
64
+ local cmd="$*"
65
+ local actual
66
+ set +e
67
+ # shellcheck disable=SC2086
68
+ eval "$cmd" </dev/null >/dev/null 2>&1
69
+ actual=$?
70
+ set -e
71
+ assert_equals "$expected" "$actual" "exit code for: $cmd"
72
+ }
73
+
74
+ # Assert command output contains expected string
75
+ assert_output_contains() {
76
+ local needle="$1"
77
+ shift
78
+ local cmd="$*"
79
+ local output
80
+ # shellcheck disable=SC2086
81
+ output=$(eval "$cmd" 2>&1) || true
82
+ if [[ "$output" == *"$needle"* ]]; then
83
+ ((TESTS_PASSED++)) || true
84
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains '$needle'"
85
+ return 0
86
+ else
87
+ ((TESTS_FAILED++)) || true
88
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain '$needle'"
89
+ echo -e " Actual output: $output"
90
+ return 1
91
+ fi
92
+ }
93
+
94
+ # Assert command output does NOT contain a string
95
+ assert_output_not_contains() {
96
+ local needle="$1"
97
+ shift
98
+ local cmd="$*"
99
+ local output
100
+ # shellcheck disable=SC2086
101
+ output=$(eval "$cmd" 2>&1) || true
102
+ if [[ "$output" != *"$needle"* ]]; then
103
+ ((TESTS_PASSED++)) || true
104
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output does not contain '$needle'"
105
+ return 0
106
+ else
107
+ ((TESTS_FAILED++)) || true
108
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: output should not contain '$needle'"
109
+ echo -e " Actual output: $output"
110
+ return 1
111
+ fi
112
+ }
113
+
114
+ # Assert command output matches regex pattern
115
+ assert_output_matches() {
116
+ local pattern="$1"
117
+ shift
118
+ local cmd="$*"
119
+ local output
120
+ # shellcheck disable=SC2086
121
+ output=$(eval "$cmd" 2>&1) || true
122
+ if [[ "$output" =~ $pattern ]]; then
123
+ ((TESTS_PASSED++)) || true
124
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output matches pattern '$pattern'"
125
+ return 0
126
+ else
127
+ ((TESTS_FAILED++)) || true
128
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: output should match pattern '$pattern'"
129
+ echo -e " Actual output: $output"
130
+ return 1
131
+ fi
132
+ }
133
+
134
+ # Assert file exists
135
+ assert_file_exists() {
136
+ local file="$1" msg="${2:-file should exist}"
137
+ if [[ -f "$file" ]]; then
138
+ ((TESTS_PASSED++)) || true
139
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
140
+ return 0
141
+ else
142
+ ((TESTS_FAILED++)) || true
143
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file not found)"
144
+ return 1
145
+ fi
146
+ }
147
+
148
+ # Assert file does not exist
149
+ assert_file_not_exists() {
150
+ local file="$1" msg="${2:-file should not exist}"
151
+ if [[ ! -f "$file" ]]; then
152
+ ((TESTS_PASSED++)) || true
153
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
154
+ return 0
155
+ else
156
+ ((TESTS_FAILED++)) || true
157
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file exists)"
158
+ return 1
159
+ fi
160
+ }
161
+
162
+ # Assert directory exists
163
+ assert_dir_exists() {
164
+ local dir="$1" msg="${2:-directory should exist}"
165
+ if [[ -d "$dir" ]]; then
166
+ ((TESTS_PASSED++)) || true
167
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
168
+ return 0
169
+ else
170
+ ((TESTS_FAILED++)) || true
171
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir not found)"
172
+ return 1
173
+ fi
174
+ }
175
+
176
+ # Assert directory does not exist
177
+ assert_dir_not_exists() {
178
+ local dir="$1" msg="${2:-directory should not exist}"
179
+ if [[ ! -d "$dir" ]]; then
180
+ ((TESTS_PASSED++)) || true
181
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
182
+ return 0
183
+ else
184
+ ((TESTS_FAILED++)) || true
185
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir exists)"
186
+ return 1
187
+ fi
188
+ }
189
+
190
+ # Assert a condition is true
191
+ assert_true() {
192
+ local condition="$1" msg="${2:-condition should be true}"
193
+ # shellcheck disable=SC2086
194
+ if eval "$condition"; then
195
+ ((TESTS_PASSED++)) || true
196
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
197
+ return 0
198
+ else
199
+ ((TESTS_FAILED++)) || true
200
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
201
+ return 1
202
+ fi
203
+ }
204
+
205
+ # Assert a condition is false
206
+ assert_false() {
207
+ local condition="$1" msg="${2:-condition should be false}"
208
+ # shellcheck disable=SC2086
209
+ if ! eval "$condition"; then
210
+ ((TESTS_PASSED++)) || true
211
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
212
+ return 0
213
+ else
214
+ ((TESTS_FAILED++)) || true
215
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
216
+ return 1
217
+ fi
218
+ }
219
+
220
+ # Assert string is empty
221
+ assert_empty() {
222
+ local value="$1" msg="${2:-value should be empty}"
223
+ if [[ -z "$value" ]]; then
224
+ ((TESTS_PASSED++)) || true
225
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
226
+ return 0
227
+ else
228
+ ((TESTS_FAILED++)) || true
229
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
230
+ echo -e " Actual: '$value'"
231
+ return 1
232
+ fi
233
+ }
234
+
235
+ # Assert string is not empty
236
+ assert_not_empty() {
237
+ local value="$1" msg="${2:-value should not be empty}"
238
+ if [[ -n "$value" ]]; then
239
+ ((TESTS_PASSED++)) || true
240
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
241
+ return 0
242
+ else
243
+ ((TESTS_FAILED++)) || true
244
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
245
+ return 1
246
+ fi
247
+ }
248
+
249
+ # Assert file contains text (uses fixed-string matching for safety)
250
+ assert_file_contains() {
251
+ local file="$1" needle="$2" msg="${3:-file should contain text}"
252
+ if [[ -z "$file" ]]; then
253
+ ((TESTS_FAILED++)) || true
254
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg (no file path provided)"
255
+ return 1
256
+ fi
257
+ if [[ -f "$file" ]] && grep -qF "$needle" "$file"; then
258
+ ((TESTS_PASSED++)) || true
259
+ echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
260
+ return 0
261
+ else
262
+ ((TESTS_FAILED++)) || true
263
+ echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
264
+ return 1
265
+ fi
266
+ }
267
+
268
+ # Print test summary
269
+ print_summary() {
270
+ echo ""
271
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
272
+ echo -e "Tests run: $TESTS_RUN"
273
+ echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
274
+ echo -e "${RED}Failed: $TESTS_FAILED${NC}"
275
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
276
+ # Output machine-readable results for test_runner.sh
277
+ echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
278
+
279
+ if [[ $TESTS_FAILED -gt 0 ]]; then
280
+ return 1
281
+ fi
282
+ return 0
283
+ }
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC2034
3
+ # Mock utilities for shell testing
4
+ # Provides functions to create mock commands, files, and directories
5
+
6
+ # Track created mocks for cleanup
7
+ MOCK_COMMANDS=()
8
+ MOCK_FILES=()
9
+ MOCK_DIRS=()
10
+ ORIGINAL_PATH="$PATH"
11
+ MOCK_BIN_DIR=""
12
+
13
+ # Initialize mock environment
14
+ mock_init() {
15
+ MOCK_BIN_DIR=$(mktemp -d)
16
+ export MOCK_BIN_DIR
17
+ export PATH="$MOCK_BIN_DIR:$PATH"
18
+ MOCK_COMMANDS=()
19
+ MOCK_FILES=()
20
+ MOCK_DIRS=()
21
+ }
22
+
23
+ # Create a mock command
24
+ # Usage: mock_command "command_name" "output" [exit_code]
25
+ mock_command() {
26
+ local cmd_name="$1"
27
+ local output="$2"
28
+ local exit_code="${3:-0}"
29
+
30
+ if [[ -z "$MOCK_BIN_DIR" ]]; then
31
+ mock_init
32
+ fi
33
+
34
+ local mock_script="$MOCK_BIN_DIR/$cmd_name"
35
+ cat >"$mock_script" <<EOF
36
+ #!/usr/bin/env bash
37
+ echo "$output"
38
+ exit $exit_code
39
+ EOF
40
+ chmod +x "$mock_script"
41
+ MOCK_COMMANDS+=("$mock_script")
42
+ }
43
+
44
+ # Create a mock command that records arguments
45
+ # Usage: mock_command_spy "command_name" [output] [exit_code]
46
+ mock_command_spy() {
47
+ local cmd_name="$1"
48
+ local output="${2:-}"
49
+ local exit_code="${3:-0}"
50
+
51
+ if [[ -z "$MOCK_BIN_DIR" ]]; then
52
+ mock_init
53
+ fi
54
+
55
+ local mock_script="$MOCK_BIN_DIR/$cmd_name"
56
+ local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
57
+
58
+ cat >"$mock_script" <<EOF
59
+ #!/usr/bin/env bash
60
+ echo "\$@" >> "$spy_file"
61
+ echo "$output"
62
+ exit $exit_code
63
+ EOF
64
+ chmod +x "$mock_script"
65
+ touch "$spy_file"
66
+ MOCK_COMMANDS+=("$mock_script")
67
+ MOCK_FILES+=("$spy_file")
68
+ }
69
+
70
+ # Get spy call history
71
+ # Usage: mock_get_calls "command_name"
72
+ mock_get_calls() {
73
+ local cmd_name="$1"
74
+ local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
75
+ if [[ -f "$spy_file" ]]; then
76
+ cat "$spy_file"
77
+ fi
78
+ }
79
+
80
+ # Get spy call count
81
+ # Usage: mock_call_count "command_name"
82
+ mock_call_count() {
83
+ local cmd_name="$1"
84
+ local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
85
+ if [[ -f "$spy_file" ]]; then
86
+ wc -l <"$spy_file" | tr -d ' '
87
+ else
88
+ echo "0"
89
+ fi
90
+ }
91
+
92
+ # Create a temporary file with content
93
+ # Usage: mock_file "content" [filename]
94
+ mock_file() {
95
+ local content="$1"
96
+ local filename="${2:-}"
97
+ local file
98
+
99
+ if [[ -n "$filename" ]]; then
100
+ file=$(mktemp -t "$filename.XXXXXX")
101
+ else
102
+ file=$(mktemp)
103
+ fi
104
+
105
+ echo "$content" >"$file"
106
+ MOCK_FILES+=("$file")
107
+ echo "$file"
108
+ }
109
+
110
+ # Create a temporary directory
111
+ # Usage: mock_dir [prefix]
112
+ mock_dir() {
113
+ local prefix="${1:-mock}"
114
+ local dir
115
+ dir=$(mktemp -d -t "${prefix}.XXXXXX")
116
+ MOCK_DIRS+=("$dir")
117
+ echo "$dir"
118
+ }
119
+
120
+ # Create a mock archive file
121
+ # Usage: mock_archive "type" [content_file]
122
+ mock_archive() {
123
+ local type="$1"
124
+ local content="${2:-test content}"
125
+ local temp_dir
126
+ temp_dir=$(mktemp -d)
127
+ local temp_file="$temp_dir/test_file.txt"
128
+ local archive
129
+
130
+ echo "$content" >"$temp_file"
131
+
132
+ case "$type" in
133
+ tar)
134
+ archive=$(mktemp -t archive.XXXXXX.tar)
135
+ tar cf "$archive" -C "$temp_dir" test_file.txt
136
+ ;;
137
+ tar.gz | tgz)
138
+ archive=$(mktemp -t archive.XXXXXX.tar.gz)
139
+ tar czf "$archive" -C "$temp_dir" test_file.txt
140
+ ;;
141
+ zip)
142
+ archive=$(mktemp -t archive.XXXXXX.zip)
143
+ (cd "$temp_dir" && zip -q "$archive" test_file.txt)
144
+ ;;
145
+ gz)
146
+ archive=$(mktemp -t archive.XXXXXX.gz)
147
+ gzip -c "$temp_file" >"$archive"
148
+ ;;
149
+ *)
150
+ echo "Unsupported archive type: $type" >&2
151
+ rm -rf "$temp_dir"
152
+ return 1
153
+ ;;
154
+ esac
155
+
156
+ rm -rf "$temp_dir"
157
+ MOCK_FILES+=("$archive")
158
+ echo "$archive"
159
+ }
160
+
161
+ # Restore original environment variable
162
+ # Usage: mock_env "VAR_NAME" "value"
163
+ mock_env() {
164
+ local var_name="$1"
165
+ local value="$2"
166
+ export "$var_name=$value"
167
+ }
168
+
169
+ # Clean up all mocks
170
+ mock_cleanup() {
171
+ # Restore PATH
172
+ export PATH="$ORIGINAL_PATH"
173
+
174
+ # Remove mock commands
175
+ for cmd in "${MOCK_COMMANDS[@]}"; do
176
+ rm -f "$cmd" 2>/dev/null
177
+ done
178
+
179
+ # Remove mock files
180
+ for file in "${MOCK_FILES[@]}"; do
181
+ rm -f "$file" 2>/dev/null
182
+ done
183
+
184
+ # Remove mock directories
185
+ for dir in "${MOCK_DIRS[@]}"; do
186
+ rm -rf "$dir" 2>/dev/null
187
+ done
188
+
189
+ # Remove mock bin directory
190
+ if [[ -n "$MOCK_BIN_DIR" && -d "$MOCK_BIN_DIR" ]]; then
191
+ rm -rf "$MOCK_BIN_DIR"
192
+ fi
193
+
194
+ MOCK_BIN_DIR=""
195
+ MOCK_COMMANDS=()
196
+ MOCK_FILES=()
197
+ MOCK_DIRS=()
198
+ }
199
+
200
+ # Setup trap to cleanup on exit
201
+ trap mock_cleanup EXIT