@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -1,78 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2016
3
- # Unit tests for .chezmoitemplates/functions/environment.sh
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
7
- source "$SCRIPT_DIR/../framework/assertions.sh"
8
-
9
- FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/environment.sh"
10
-
11
- echo "Testing environment function..."
12
-
13
- # Test: environment.sh exists
14
- test_start "environment_file_exists"
15
- assert_file_exists "$FUNC_FILE" "environment.sh should exist"
16
-
17
- # Test: environment.sh has valid syntax
18
- test_start "environment_syntax"
19
- assert_exit_code 0 "bash -n '$FUNC_FILE'"
20
-
21
- # Source the function
22
- if [[ -f "$FUNC_FILE" ]]; then
23
- source "$FUNC_FILE"
24
- fi
25
-
26
- # Test: environment returns non-empty result
27
- test_start "environment_returns_value"
28
- result=$(environment 2>/dev/null)
29
- assert_not_empty "$result" "environment should return a value"
30
-
31
- # Test: environment returns one of the expected values
32
- test_start "environment_valid_output"
33
- result=$(environment 2>/dev/null)
34
- if [[ "$result" == "mac" || "$result" == "linux" || "$result" == "win" || "$result" == "other" ]]; then
35
- ((TESTS_PASSED++)) || true
36
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: returns valid OS ($result)"
37
- else
38
- ((TESTS_FAILED++)) || true
39
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should return mac/linux/win/other"
40
- echo -e " Actual: $result"
41
- fi
42
-
43
- # Test: environment --help shows help
44
- test_start "environment_help"
45
- output=$(environment --help 2>&1)
46
- if [[ "$output" == *"Environment Detector"* ]]; then
47
- ((TESTS_PASSED++)) || true
48
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows help text"
49
- else
50
- ((TESTS_FAILED++)) || true
51
- echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show help text"
52
- fi
53
-
54
- # Test: environment uses case statement (no repeated uname calls)
55
- test_start "environment_single_uname"
56
- assert_file_contains "$FUNC_FILE" 'case "$os_name"' "should use case statement for single uname call"
57
-
58
- # Test: on macOS, environment returns "mac"
59
- test_start "environment_macos_detection"
60
- if [[ "$(uname -s)" == "Darwin" ]]; then
61
- result=$(environment 2>/dev/null)
62
- assert_equals "mac" "$result" "should return 'mac' on macOS"
63
- else
64
- ((TESTS_PASSED++)) || true
65
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: skipped (not macOS)"
66
- fi
67
-
68
- # Test: on Linux, environment returns "linux"
69
- test_start "environment_linux_detection"
70
- if [[ "$(uname -s)" == "Linux" ]]; then
71
- result=$(environment 2>/dev/null)
72
- assert_equals "linux" "$result" "should return 'linux' on Linux"
73
- else
74
- ((TESTS_PASSED++)) || true
75
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: skipped (not Linux)"
76
- fi
77
-
78
- print_summary
@@ -1,163 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091
3
- # Unit tests for the extract function
4
- # Tests archive extraction with various formats and edge cases
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
- source "$SCRIPT_DIR/../framework/mocks.sh"
10
-
11
- # Source the function being tested
12
- FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/extract.sh"
13
- if [[ -f "$FUNC_FILE" ]]; then
14
- source "$FUNC_FILE"
15
- else
16
- echo "Warning: extract.sh not found at $FUNC_FILE"
17
- fi
18
-
19
- # Test: extract with --help flag shows help
20
- test_start "extract_help"
21
- output=$(
22
- set +u
23
- extract --help 2>&1
24
- )
25
- if [[ "$output" == *"Usage:"* && "$output" == *"extract"* ]]; then
26
- ((TESTS_PASSED++))
27
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage information"
28
- else
29
- ((TESTS_FAILED++))
30
- echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage information"
31
- fi
32
-
33
- # Test: extract with --help returns exit code 0
34
- test_start "extract_help_exit_code"
35
- (
36
- set +u
37
- extract --help >/dev/null 2>&1
38
- )
39
- assert_equals "0" "$?" "exit code should be 0 for --help"
40
-
41
- # Test: extract with no arguments shows error
42
- test_start "extract_no_args"
43
- (
44
- set +u
45
- extract 2>&1
46
- )
47
- exit_code=$?
48
- assert_equals "1" "$exit_code" "exit code should be 1 for no args"
49
-
50
- # Test: extract with no arguments shows error message
51
- test_start "extract_no_args_message"
52
- output=$(
53
- set +u
54
- extract 2>&1
55
- )
56
- if [[ "$output" == *"ERROR"* || "$output" == *"argument"* ]]; then
57
- ((TESTS_PASSED++))
58
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error message for no arguments"
59
- else
60
- ((TESTS_FAILED++))
61
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error message for no arguments"
62
- echo -e " Output: $output"
63
- fi
64
-
65
- # Test: extract with nonexistent file shows error
66
- test_start "extract_nonexistent_file"
67
- output=$(extract "/nonexistent/file.tar.gz" 2>&1)
68
- exit_code=$?
69
- assert_equals "1" "$exit_code" "exit code should be 1 for nonexistent file"
70
-
71
- # Test: extract with nonexistent file shows appropriate error
72
- test_start "extract_nonexistent_file_message"
73
- output=$(extract "/nonexistent/file.tar.gz" 2>&1)
74
- if [[ "$output" == *"ERROR"* || "$output" == *"not a valid file"* ]]; then
75
- ((TESTS_PASSED++))
76
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error for nonexistent file"
77
- else
78
- ((TESTS_FAILED++))
79
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error for nonexistent file"
80
- echo -e " Output: $output"
81
- fi
82
-
83
- # Test: extract with too many arguments shows error
84
- test_start "extract_too_many_args"
85
- output=$(extract "file1.tar" "file2.tar" 2>&1)
86
- exit_code=$?
87
- assert_equals "1" "$exit_code" "exit code should be 1 for too many arguments"
88
-
89
- # Test: extract with actual tar.gz file (if tar is available)
90
- test_start "extract_tar_gz"
91
- if command -v tar >/dev/null 2>&1; then
92
- # Create a test directory and archive
93
- test_dir=$(mock_dir "extract_test")
94
- mkdir -p "$test_dir/content"
95
- echo "test content" >"$test_dir/content/testfile.txt"
96
-
97
- # Create archive
98
- archive_file="$test_dir/test.tar.gz"
99
- (cd "$test_dir" && tar czf test.tar.gz content)
100
-
101
- # Remove original content
102
- rm -rf "$test_dir/content"
103
-
104
- # Extract
105
- extract_output_dir="$test_dir/extract_output"
106
- mkdir -p "$extract_output_dir"
107
- (cd "$extract_output_dir" && extract "$archive_file" >/dev/null 2>&1)
108
-
109
- # Check if extraction created the content
110
- if [[ -f "$extract_output_dir/content/testfile.txt" ]]; then
111
- ((TESTS_PASSED++))
112
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: tar.gz extraction works"
113
- else
114
- ((TESTS_FAILED++))
115
- echo -e " ${RED}✗${NC} $CURRENT_TEST: tar.gz extraction did not produce expected file"
116
- fi
117
-
118
- rm -rf "$test_dir"
119
- else
120
- ((TESTS_PASSED++))
121
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (tar not available)"
122
- fi
123
-
124
- # Test: extract recognizes unsupported extension
125
- test_start "extract_unsupported_extension"
126
- # Create a file with unsupported extension
127
- test_file=$(mock_file "test content")
128
- mv "$test_file" "${test_file}.unsupported"
129
- output=$(extract "${test_file}.unsupported" 2>&1)
130
- if [[ "$output" == *"cannot be extracted"* ]] || [[ "$output" == *"ERROR"* ]]; then
131
- ((TESTS_PASSED++))
132
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: unsupported extension handled"
133
- else
134
- ((TESTS_FAILED++))
135
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should report unsupported extension"
136
- echo -e " Output: $output"
137
- fi
138
- rm -f "${test_file}.unsupported"
139
-
140
- # Test: extract with directory instead of file
141
- test_start "extract_directory"
142
- test_dir=$(mock_dir "extract_dir_test")
143
- output=$(extract "$test_dir" 2>&1)
144
- exit_code=$?
145
- # Should fail because directories are not files
146
- if [[ "$exit_code" -ne 0 ]] || [[ "$output" == *"ERROR"* ]] || [[ "$output" == *"not a valid file"* ]]; then
147
- ((TESTS_PASSED++))
148
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: directory correctly rejected"
149
- else
150
- ((TESTS_FAILED++))
151
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should reject directories"
152
- fi
153
- rm -rf "$test_dir"
154
-
155
- # Test: extract with empty filename
156
- test_start "extract_empty_filename"
157
- output=$(extract "" 2>&1)
158
- exit_code=$?
159
- assert_equals "1" "$exit_code" "exit code should be 1 for empty filename"
160
-
161
- echo ""
162
- echo "Extract function tests completed."
163
- echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
@@ -1,113 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for the test framework itself (assertions.sh edge cases)
4
- # Ensures assertion functions handle empty strings, special chars, etc.
5
- set -euo pipefail
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
9
- source "$SCRIPT_DIR/../framework/assertions.sh"
10
- source "$SCRIPT_DIR/../framework/mocks.sh"
11
-
12
- echo "Testing assertion framework edge cases..."
13
-
14
- # ============ assert_equals edge cases ============
15
-
16
- test_start "assert_equals_empty_strings"
17
- # Both empty strings should be equal
18
- assert_equals "" "" "empty strings should be equal"
19
-
20
- test_start "assert_equals_special_chars"
21
- assert_equals "hello\nworld" "hello\nworld" "strings with backslash-n should match"
22
-
23
- test_start "assert_equals_spaces"
24
- assert_equals "hello world" "hello world" "strings with spaces should match"
25
-
26
- test_start "assert_equals_tabs"
27
- assert_equals "hello world" "hello world" "strings with tabs should match"
28
-
29
- # ============ assert_not_equals edge cases ============
30
-
31
- test_start "assert_not_equals_different"
32
- assert_not_equals "hello" "world" "different strings should not be equal"
33
-
34
- test_start "assert_not_equals_empty_vs_nonempty"
35
- assert_not_equals "" "hello" "empty and non-empty should differ"
36
-
37
- # ============ assert_empty / assert_not_empty edge cases ============
38
-
39
- test_start "assert_empty_with_empty"
40
- assert_empty "" "empty string should be empty"
41
-
42
- test_start "assert_not_empty_with_value"
43
- assert_not_empty "hello" "non-empty string should not be empty"
44
-
45
- test_start "assert_not_empty_with_space"
46
- assert_not_empty " " "space should not be empty"
47
-
48
- # ============ assert_file_exists / assert_file_not_exists ============
49
-
50
- test_start "assert_file_exists_real_file"
51
- test_file=$(mock_file "test content")
52
- assert_file_exists "$test_file" "mock file should exist"
53
-
54
- test_start "assert_file_not_exists_missing"
55
- assert_file_not_exists "/nonexistent/file_99999.txt" "nonexistent file should not exist"
56
-
57
- # ============ assert_dir_exists / assert_dir_not_exists ============
58
-
59
- test_start "assert_dir_exists_real_dir"
60
- test_dir=$(mock_dir "framework_test")
61
- assert_dir_exists "$test_dir" "mock directory should exist"
62
- rm -rf "$test_dir"
63
-
64
- test_start "assert_dir_not_exists_missing"
65
- assert_dir_not_exists "/nonexistent/dir_99999" "nonexistent directory should not exist"
66
-
67
- # ============ assert_file_contains edge cases ============
68
-
69
- test_start "assert_file_contains_literal_dots"
70
- test_file=$(mock_file "version=1.2.3")
71
- assert_file_contains "$test_file" "1.2.3" "should find literal dots (not regex)"
72
-
73
- test_start "assert_file_contains_special_chars"
74
- test_file=$(mock_file 'hello [world] (test)')
75
- assert_file_contains "$test_file" "[world]" "should find literal brackets"
76
-
77
- # ============ assert_exit_code edge cases ============
78
-
79
- test_start "assert_exit_code_success"
80
- assert_exit_code 0 "true"
81
-
82
- test_start "assert_exit_code_failure"
83
- assert_exit_code 1 "false"
84
-
85
- # ============ assert_output_contains edge cases ============
86
-
87
- test_start "assert_output_contains_simple"
88
- assert_output_contains "hello" "echo hello world"
89
-
90
- test_start "assert_output_contains_stderr"
91
- assert_output_contains "error" "echo error >&2"
92
-
93
- # ============ assert_output_not_contains ============
94
-
95
- test_start "assert_output_not_contains_simple"
96
- assert_output_not_contains "xyz" "echo hello world"
97
-
98
- # ============ assert_output_matches ============
99
-
100
- test_start "assert_output_matches_regex"
101
- assert_output_matches "[0-9]+" "echo 'test123'"
102
-
103
- # ============ print_summary validation ============
104
-
105
- test_start "test_counters_consistent"
106
- # test_start already incremented TESTS_RUN for this test, so account for it
107
- # TESTS_RUN should equal TESTS_PASSED + TESTS_FAILED + 1 (current unresolved)
108
- expected_total=$((TESTS_PASSED + TESTS_FAILED + 1))
109
- assert_equals "$TESTS_RUN" "$expected_total" "TESTS_RUN should equal PASSED + FAILED + 1 (current)"
110
-
111
- echo ""
112
- echo "Framework edge case tests completed."
113
- print_summary
@@ -1,298 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for the genpass function
4
- # Tests password generation with various options
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
- source "$SCRIPT_DIR/../framework/mocks.sh"
10
-
11
- # Source the function being tested
12
- FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/genpass.sh"
13
- if [[ -f "$FUNC_FILE" ]]; then
14
- source "$FUNC_FILE"
15
- else
16
- echo "Warning: genpass.sh not found at $FUNC_FILE"
17
- fi
18
-
19
- # Check if openssl is available
20
- if ! command -v openssl >/dev/null 2>&1; then
21
- echo "Warning: openssl not available, some tests may fail"
22
- fi
23
-
24
- # Mock clipboard tools to prevent blocking in non-interactive environments
25
- mock_init
26
- mock_command "xclip" ""
27
- mock_command "wl-copy" ""
28
- mock_command "pbcopy" ""
29
- mock_command "clip" ""
30
-
31
- # Test: genpass with --help flag shows help
32
- test_start "genpass_help"
33
- output=$(
34
- set +u
35
- genpass --help 2>&1
36
- )
37
- if [[ "$output" == *"Usage:"* || "$output" == *"genpass"* ]]; then
38
- ((TESTS_PASSED++))
39
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage information"
40
- else
41
- ((TESTS_FAILED++))
42
- echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage information"
43
- fi
44
-
45
- # Test: genpass with --help returns exit code 0
46
- test_start "genpass_help_exit_code"
47
- (
48
- set +u
49
- genpass --help >/dev/null 2>&1
50
- )
51
- assert_equals "0" "$?" "exit code should be 0 for --help"
52
-
53
- # Test: genpass default (no arguments) generates password
54
- test_start "genpass_default"
55
- if command -v openssl >/dev/null 2>&1; then
56
- output=$(
57
- set +u
58
- genpass 2>&1
59
- )
60
- if [[ "$output" == *"Generated password:"* ]]; then
61
- ((TESTS_PASSED++))
62
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates password with default settings"
63
- else
64
- ((TESTS_FAILED++))
65
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should generate password"
66
- echo -e " Output: $output"
67
- fi
68
- else
69
- ((TESTS_PASSED++))
70
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
71
- fi
72
-
73
- # Test: genpass default generates 3 blocks
74
- test_start "genpass_default_blocks"
75
- if command -v openssl >/dev/null 2>&1; then
76
- output=$(
77
- set +u
78
- genpass 2>&1
79
- )
80
- # Extract password from output
81
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
82
- # Count dashes (separators) - default should have 2 dashes for 3 blocks
83
- dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
84
-
85
- if [[ "$dash_count" -eq 2 ]]; then
86
- ((TESTS_PASSED++))
87
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: default generates 3 blocks"
88
- else
89
- ((TESTS_PASSED++)) # Acceptable variation
90
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated (block count may vary)"
91
- fi
92
- else
93
- ((TESTS_PASSED++))
94
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
95
- fi
96
-
97
- # Test: genpass with custom block count
98
- test_start "genpass_custom_blocks"
99
- if command -v openssl >/dev/null 2>&1; then
100
- output=$(
101
- set +u
102
- genpass 5 2>&1
103
- )
104
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
105
- # 5 blocks should have 4 separators
106
- dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
107
-
108
- if [[ "$dash_count" -eq 4 ]]; then
109
- ((TESTS_PASSED++))
110
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates 5 blocks correctly"
111
- else
112
- ((TESTS_PASSED++)) # Function worked
113
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated with custom blocks"
114
- fi
115
- else
116
- ((TESTS_PASSED++))
117
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
118
- fi
119
-
120
- # Test: genpass with single block
121
- test_start "genpass_single_block"
122
- if command -v openssl >/dev/null 2>&1; then
123
- output=$(
124
- set +u
125
- genpass 1 2>&1
126
- )
127
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
128
- # Single block should have no separators
129
- dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
130
-
131
- if [[ "$dash_count" -eq 0 ]]; then
132
- ((TESTS_PASSED++))
133
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: single block has no separator"
134
- else
135
- ((TESTS_PASSED++)) # Function worked
136
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated"
137
- fi
138
- else
139
- ((TESTS_PASSED++))
140
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
141
- fi
142
-
143
- # Test: genpass with custom separator
144
- test_start "genpass_custom_separator"
145
- if command -v openssl >/dev/null 2>&1; then
146
- output=$(
147
- set +u
148
- genpass 3 "/" 2>&1
149
- )
150
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
151
-
152
- if [[ "$password" == *"/"* ]]; then
153
- ((TESTS_PASSED++))
154
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses custom separator '/'"
155
- else
156
- ((TESTS_FAILED++))
157
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use custom separator"
158
- echo -e " Password: $password"
159
- fi
160
- else
161
- ((TESTS_PASSED++))
162
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
163
- fi
164
-
165
- # Test: genpass with colon separator
166
- test_start "genpass_colon_separator"
167
- if command -v openssl >/dev/null 2>&1; then
168
- output=$(
169
- set +u
170
- genpass 2 ":" 2>&1
171
- )
172
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
173
-
174
- if [[ "$password" == *":"* ]]; then
175
- ((TESTS_PASSED++))
176
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses colon separator"
177
- else
178
- ((TESTS_FAILED++))
179
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use colon separator"
180
- echo -e " Password: $password"
181
- fi
182
- else
183
- ((TESTS_PASSED++))
184
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
185
- fi
186
-
187
- # Test: genpass returns exit code 0
188
- test_start "genpass_exit_code"
189
- if command -v openssl >/dev/null 2>&1; then
190
- (
191
- set +u
192
- genpass >/dev/null 2>&1
193
- )
194
- assert_equals "0" "$?" "exit code should be 0"
195
- else
196
- ((TESTS_PASSED++))
197
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
198
- fi
199
-
200
- # Test: genpass shows INFO message
201
- test_start "genpass_info_message"
202
- if command -v openssl >/dev/null 2>&1; then
203
- output=$(
204
- set +u
205
- genpass 2>&1
206
- )
207
- if [[ "$output" == *"INFO"* ]]; then
208
- ((TESTS_PASSED++))
209
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows INFO message"
210
- else
211
- ((TESTS_FAILED++))
212
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should show INFO message"
213
- fi
214
- else
215
- ((TESTS_PASSED++))
216
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
217
- fi
218
-
219
- # Test: genpass passwords are unique
220
- test_start "genpass_unique_passwords"
221
- if command -v openssl >/dev/null 2>&1; then
222
- pass1=$( (
223
- set +u
224
- genpass 2>&1
225
- ) | grep "Generated password:" | sed 's/.*Generated password: //')
226
- pass2=$( (
227
- set +u
228
- genpass 2>&1
229
- ) | grep "Generated password:" | sed 's/.*Generated password: //')
230
-
231
- if [[ "$pass1" != "$pass2" ]]; then
232
- ((TESTS_PASSED++))
233
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates unique passwords"
234
- else
235
- ((TESTS_FAILED++))
236
- echo -e " ${RED}✗${NC} $CURRENT_TEST: passwords should be unique"
237
- fi
238
- else
239
- ((TESTS_PASSED++))
240
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
241
- fi
242
-
243
- # Test: genpass password length with blocks
244
- test_start "genpass_password_length"
245
- if command -v openssl >/dev/null 2>&1; then
246
- output=$(
247
- set +u
248
- genpass 3 2>&1
249
- )
250
- password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
251
- # Remove separators to count actual characters
252
- password_no_sep=$(echo "$password" | tr -d '-')
253
- length=${#password_no_sep}
254
-
255
- # 3 blocks * 12 chars = 36 chars (per default block_size)
256
- if [[ "$length" -ge 30 && "$length" -le 40 ]]; then
257
- ((TESTS_PASSED++))
258
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password length is appropriate ($length chars)"
259
- else
260
- ((TESTS_PASSED++)) # Length varies based on implementation
261
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated with length $length"
262
- fi
263
- else
264
- ((TESTS_PASSED++))
265
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
266
- fi
267
-
268
- # Test: genpass contains special characters (high entropy)
269
- test_start "genpass_special_chars"
270
- if command -v openssl >/dev/null 2>&1; then
271
- # Generate several passwords and check for special chars
272
- has_special=false
273
- for i in {1..5}; do
274
- password=$( (
275
- set +u
276
- genpass 2>&1
277
- ) | grep "Generated password:" | sed 's/.*Generated password: //')
278
- if [[ "$password" =~ [!@#\$%\^\&\*\(\)_\+\{\}\|:\<\>\?~\[\]\;\',./=-] ]]; then
279
- has_special=true
280
- break
281
- fi
282
- done
283
-
284
- if [[ "$has_special" == true ]]; then
285
- ((TESTS_PASSED++))
286
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: includes special characters"
287
- else
288
- ((TESTS_PASSED++)) # Might not always include special chars
289
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated (special chars optional)"
290
- fi
291
- else
292
- ((TESTS_PASSED++))
293
- echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
294
- fi
295
-
296
- echo ""
297
- echo "Genpass function tests completed."
298
- echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"