@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,167 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091
3
- # Unit tests for install.sh edge cases, idempotency, and input validation
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- INSTALL_SCRIPT="$REPO_ROOT/install.sh"
11
-
12
- echo "Testing install.sh edge cases..."
13
-
14
- # Test: install.sh has set -euo pipefail
15
- test_start "install_strict_mode"
16
- if grep -q "set -euo pipefail" "$INSTALL_SCRIPT"; then
17
- ((TESTS_PASSED++)) || true
18
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses strict mode (set -euo pipefail)"
19
- else
20
- ((TESTS_FAILED++)) || true
21
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use set -euo pipefail"
22
- fi
23
-
24
- # Test: install.sh checks for existing chezmoi before installing
25
- test_start "install_chezmoi_check"
26
- if grep -q 'command -v chezmoi' "$INSTALL_SCRIPT"; then
27
- ((TESTS_PASSED++)) || true
28
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks for existing chezmoi"
29
- else
30
- ((TESTS_FAILED++)) || true
31
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should check for existing chezmoi"
32
- fi
33
-
34
- # Test: install.sh installs chezmoi via Homebrew when available
35
- test_start "install_chezmoi_brew"
36
- if grep -q 'brew install chezmoi' "$INSTALL_SCRIPT"; then
37
- ((TESTS_PASSED++)) || true
38
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: installs chezmoi via Homebrew when available"
39
- else
40
- ((TESTS_FAILED++)) || true
41
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should install chezmoi via Homebrew"
42
- fi
43
-
44
- # Test: install.sh falls back to get.chezmoi.io for binary install
45
- test_start "install_chezmoi_fallback"
46
- if grep -q 'get.chezmoi.io' "$INSTALL_SCRIPT"; then
47
- ((TESTS_PASSED++)) || true
48
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: falls back to get.chezmoi.io"
49
- else
50
- ((TESTS_FAILED++)) || true
51
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should fall back to get.chezmoi.io"
52
- fi
53
-
54
- # Test: install.sh adds BIN_DIR to PATH for fallback install
55
- test_start "install_path_update"
56
- if grep -q 'bin_dir=.*local/bin' "$INSTALL_SCRIPT" && grep -q 'export PATH=.*bin_dir' "$INSTALL_SCRIPT"; then
57
- ((TESTS_PASSED++)) || true
58
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: adds ~/.local/bin to PATH via bin_dir"
59
- else
60
- ((TESTS_FAILED++)) || true
61
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should add ~/.local/bin to PATH"
62
- fi
63
-
64
- # Test: install.sh handles backup of existing .dotfiles
65
- test_start "install_backup_existing"
66
- if grep -q '\.dotfiles\.bak' "$INSTALL_SCRIPT"; then
67
- ((TESTS_PASSED++)) || true
68
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backs up existing .dotfiles directory"
69
- else
70
- ((TESTS_FAILED++)) || true
71
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should backup existing .dotfiles"
72
- fi
73
-
74
- # Test: install.sh supports noninteractive mode
75
- test_start "install_noninteractive_mode"
76
- if grep -q "DOTFILES_NONINTERACTIVE" "$INSTALL_SCRIPT"; then
77
- ((TESTS_PASSED++)) || true
78
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: supports DOTFILES_NONINTERACTIVE"
79
- else
80
- ((TESTS_FAILED++)) || true
81
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should support noninteractive mode"
82
- fi
83
-
84
- # Test: install.sh uses --force --no-tty in noninteractive mode
85
- test_start "install_noninteractive_flags"
86
- if grep -q "\-\-force" "$INSTALL_SCRIPT" && grep -q "\-\-no-tty" "$INSTALL_SCRIPT"; then
87
- ((TESTS_PASSED++)) || true
88
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses --force --no-tty in noninteractive mode"
89
- else
90
- ((TESTS_FAILED++)) || true
91
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use --force --no-tty"
92
- fi
93
-
94
- # Test: install.sh uses HTTPS for all URLs
95
- test_start "install_https_only"
96
- http_urls=$(grep -n 'http://' "$INSTALL_SCRIPT" | grep -v '^#' | grep -v 'http://deb' || true)
97
- if [[ -z "$http_urls" ]]; then
98
- ((TESTS_PASSED++)) || true
99
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: all URLs use HTTPS"
100
- else
101
- ((TESTS_FAILED++)) || true
102
- echo -e " ${RED}✗${NC} $CURRENT_TEST: found non-HTTPS URLs"
103
- echo -e " $http_urls"
104
- fi
105
-
106
- # Test: install.sh backs up user dotfiles (not source repo)
107
- test_start "install_backup_user_dotfiles"
108
- if grep -q 'chezmoi managed' "$INSTALL_SCRIPT" && grep -q 'cp -a' "$INSTALL_SCRIPT"; then
109
- ((TESTS_PASSED++)) || true
110
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backs up files chezmoi will overwrite"
111
- else
112
- ((TESTS_FAILED++)) || true
113
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should back up managed dotfiles"
114
- fi
115
-
116
- # Test: install.sh detects multiple OS types
117
- test_start "install_multi_os_detection"
118
- os_count=0
119
- for os in "debian" "fedora" "arch" "macos" "wsl2"; do
120
- if grep -q "$os" "$INSTALL_SCRIPT"; then
121
- os_count=$((os_count + 1))
122
- fi
123
- done
124
- if [[ $os_count -ge 3 ]]; then
125
- ((TESTS_PASSED++)) || true
126
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: detects $os_count OS types"
127
- else
128
- ((TESTS_FAILED++)) || true
129
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should detect at least 3 OS types, found $os_count"
130
- fi
131
-
132
- # Test: install.sh does not contain curl | sh (pipes to shell) # gitleaks:allow
133
- test_start "install_no_curl_pipe_sh"
134
- # The Homebrew install line is a known pattern but uses /bin/bash -c, not pipe
135
- curl_pipe=$(grep 'curl.*|.*sh' "$INSTALL_SCRIPT" | grep -v "Homebrew" | grep -v "^#" || true) # gitleaks:allow
136
- if [[ -z "$curl_pipe" ]]; then
137
- ((TESTS_PASSED++)) || true
138
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no unsafe curl|sh patterns" # gitleaks:allow
139
- else
140
- ((TESTS_FAILED++)) || true
141
- echo -e " ${RED}✗${NC} $CURRENT_TEST: found curl piped to shell"
142
- echo -e " $curl_pipe"
143
- fi
144
-
145
- # Test: ensure_chezmoi_source function exists
146
- test_start "install_ensure_chezmoi_source"
147
- if grep -q "ensure_chezmoi_source" "$INSTALL_SCRIPT"; then
148
- ((TESTS_PASSED++)) || true
149
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has ensure_chezmoi_source function"
150
- else
151
- ((TESTS_FAILED++)) || true
152
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should have ensure_chezmoi_source"
153
- fi
154
-
155
- # Test: install.sh handles legacy source migration
156
- test_start "install_legacy_migration"
157
- if grep -q 'Migrating from legacy source' "$INSTALL_SCRIPT"; then
158
- ((TESTS_PASSED++)) || true
159
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: migrates legacy chezmoi source directory"
160
- else
161
- ((TESTS_FAILED++)) || true
162
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should handle legacy source migration"
163
- fi
164
-
165
- echo ""
166
- echo "install.sh edge case tests completed."
167
- print_summary
@@ -1,172 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091
3
- # Unit tests for install/lib/installers.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
- source "$SCRIPT_DIR/../framework/mocks.sh"
9
-
10
- LOGGING_FILE="$REPO_ROOT/install/lib/logging.sh"
11
- INSTALLERS_FILE="$REPO_ROOT/install/lib/installers.sh"
12
-
13
- echo "Testing installers library..."
14
-
15
- # Test: installers.sh exists
16
- test_start "installers_file_exists"
17
- assert_file_exists "$INSTALLERS_FILE" "installers.sh should exist"
18
-
19
- # Test: installers.sh has valid syntax
20
- test_start "installers_syntax"
21
- assert_exit_code 0 "bash -n '$INSTALLERS_FILE'"
22
-
23
- # Test: installers.sh has double-source guard
24
- test_start "installers_guard"
25
- assert_file_contains "$INSTALLERS_FILE" "_DOTFILES_INSTALLERS_LOADED" "should have double-source guard"
26
-
27
- # Test: sha256_file computes checksum
28
- test_start "sha256_file_computes"
29
- tmp_file=$(mock_file "hello world")
30
- output=$(bash -c '
31
- source "'"$LOGGING_FILE"'"
32
- source "'"$INSTALLERS_FILE"'"
33
- sha256_file "'"$tmp_file"'"
34
- ')
35
- # sha256 of "hello world\n" is known
36
- if [[ -n "$output" && ${#output} -eq 64 ]]; then
37
- ((TESTS_PASSED++)) || true
38
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: sha256_file returns 64-char hash"
39
- else
40
- ((TESTS_FAILED++)) || true
41
- echo -e " ${RED}✗${NC} $CURRENT_TEST: sha256_file should return 64-char hash"
42
- echo -e " Output: $output (length: ${#output})"
43
- fi
44
-
45
- # Test: resolve_arch returns valid architecture
46
- test_start "resolve_arch_valid"
47
- output=$(bash -c '
48
- source "'"$LOGGING_FILE"'"
49
- source "'"$INSTALLERS_FILE"'"
50
- resolve_arch
51
- ')
52
- if [[ "$output" == "x86_64" || "$output" == "aarch64" ]]; then
53
- ((TESTS_PASSED++)) || true
54
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: resolve_arch returns $output"
55
- else
56
- ((TESTS_FAILED++)) || true
57
- echo -e " ${RED}✗${NC} $CURRENT_TEST: resolve_arch should return x86_64 or aarch64"
58
- echo -e " Output: $output"
59
- fi
60
-
61
- # Test: resolve_sudo returns empty or "sudo"
62
- test_start "resolve_sudo_returns"
63
- output=$(bash -c '
64
- source "'"$LOGGING_FILE"'"
65
- source "'"$INSTALLERS_FILE"'"
66
- resolve_sudo
67
- ')
68
- if [[ -z "$output" || "$output" == "sudo" ]]; then
69
- ((TESTS_PASSED++)) || true
70
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: resolve_sudo returns '$output'"
71
- else
72
- ((TESTS_FAILED++)) || true
73
- echo -e " ${RED}✗${NC} $CURRENT_TEST: resolve_sudo should return empty or 'sudo'"
74
- echo -e " Output: $output"
75
- fi
76
-
77
- # Test: warn_unpinned dies on "latest" tag
78
- test_start "warn_unpinned_dies_on_latest"
79
- assert_exit_code 1 "bash -c 'source \"$LOGGING_FILE\"; source \"$INSTALLERS_FILE\"; warn_unpinned Test latest TEST_TAG'"
80
-
81
- # Test: warn_unpinned dies on "nightly" tag
82
- test_start "warn_unpinned_dies_on_nightly"
83
- assert_exit_code 1 "bash -c 'source \"$LOGGING_FILE\"; source \"$INSTALLERS_FILE\"; warn_unpinned Test nightly TEST_TAG'"
84
-
85
- # Test: warn_unpinned succeeds on pinned tag
86
- test_start "warn_unpinned_ok_pinned"
87
- assert_exit_code 0 "bash -c 'source \"$LOGGING_FILE\"; source \"$INSTALLERS_FILE\"; warn_unpinned Test v1.2.3 TEST_TAG'"
88
-
89
- # Test: github_asset_url constructs fallback URL for tagged release
90
- test_start "github_asset_url_tagged"
91
- output=$(bash -c '
92
- source "'"$LOGGING_FILE"'"
93
- source "'"$INSTALLERS_FILE"'"
94
- github_asset_url "owner/repo" "binary-linux.tar.gz" "v1.0.0"
95
- ' 2>/dev/null)
96
- if [[ "$output" == *"github.com"* && "$output" == *"v1.0.0"* && "$output" == *"binary-linux.tar.gz"* ]]; then
97
- ((TESTS_PASSED++)) || true
98
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: github_asset_url returns correct tagged URL"
99
- else
100
- ((TESTS_FAILED++)) || true
101
- echo -e " ${RED}✗${NC} $CURRENT_TEST: github_asset_url should construct tagged URL"
102
- echo -e " Output: $output"
103
- fi
104
-
105
- # Test: github_asset_url constructs fallback URL for latest release
106
- test_start "github_asset_url_latest"
107
- output=$(bash -c '
108
- source "'"$LOGGING_FILE"'"
109
- source "'"$INSTALLERS_FILE"'"
110
- github_asset_url "owner/repo" "binary.tar.gz" "latest"
111
- ' 2>/dev/null)
112
- if [[ "$output" == *"github.com/owner/repo/releases/latest/download/binary.tar.gz"* ]]; then
113
- ((TESTS_PASSED++)) || true
114
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: github_asset_url returns correct latest URL"
115
- else
116
- ((TESTS_FAILED++)) || true
117
- echo -e " ${RED}✗${NC} $CURRENT_TEST: github_asset_url should construct latest URL"
118
- echo -e " Output: $output"
119
- fi
120
-
121
- # Test: download_and_verify_sha256 verifies matching checksum
122
- test_start "download_verify_matching"
123
- tmp_dir=$(mock_dir "verify_test")
124
- echo "test file content" >"$tmp_dir/test.bin"
125
- # Use sha256sum on Linux, shasum on macOS
126
- if command -v sha256sum >/dev/null 2>&1; then
127
- expected_hash=$(sha256sum "$tmp_dir/test.bin" | awk '{print $1}')
128
- else
129
- expected_hash=$(shasum -a 256 "$tmp_dir/test.bin" | awk '{print $1}')
130
- fi
131
- echo "$expected_hash test.bin" >"$tmp_dir/test.bin.sha256"
132
- # Create mock curl that copies local files
133
- mock_init
134
- cat >"$MOCK_BIN_DIR/curl" <<'SCRIPT'
135
- #!/usr/bin/env bash
136
- # Extract -o destination from args
137
- dest=""
138
- url=""
139
- while [[ $# -gt 0 ]]; do
140
- case "$1" in
141
- -o) dest="$2"; shift 2 ;;
142
- -*) shift ;;
143
- *) url="$1"; shift ;;
144
- esac
145
- done
146
- if [[ -n "$dest" && -n "$url" && -f "$url" ]]; then
147
- cp "$url" "$dest"
148
- fi
149
- SCRIPT
150
- chmod +x "$MOCK_BIN_DIR/curl"
151
-
152
- result=$(bash -c '
153
- export PATH="'"$MOCK_BIN_DIR"':$PATH"
154
- source "'"$LOGGING_FILE"'"
155
- source "'"$INSTALLERS_FILE"'"
156
- download_and_verify_sha256 "'"$tmp_dir/test.bin"'" "'"$tmp_dir/test.bin.sha256"'" "'"$tmp_dir/downloaded.bin"'"
157
- echo "OK"
158
- ' 2>&1) || true
159
- if [[ "$result" == *"OK"* ]]; then
160
- ((TESTS_PASSED++)) || true
161
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: verify succeeds with matching checksum"
162
- else
163
- ((TESTS_FAILED++)) || true
164
- echo -e " ${RED}✗${NC} $CURRENT_TEST: verify should succeed with matching checksum"
165
- echo -e " Output: $result"
166
- fi
167
-
168
- # Test: double-sourcing installers is idempotent
169
- test_start "installers_idempotent"
170
- assert_exit_code 0 "bash -c 'source \"$LOGGING_FILE\"; source \"$INSTALLERS_FILE\"; source \"$INSTALLERS_FILE\"; echo ok'"
171
-
172
- print_summary
@@ -1,68 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for keygen function
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
- # Source the function
10
- FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/keygen.sh"
11
- if [[ -f "$FUNC_FILE" ]]; then
12
- source "$FUNC_FILE"
13
- else
14
- echo "SKIP: keygen.sh not found at $FUNC_FILE"
15
- echo "RESULTS:0:0:0"
16
- exit 0
17
- fi
18
-
19
- echo "Testing keygen function..."
20
-
21
- # Test function exists
22
- test_start "keygen_function_exists"
23
- assert_true "type keygen &>/dev/null" "keygen function should exist"
24
-
25
- # Test no arguments shows usage
26
- test_start "keygen_no_args"
27
- if type keygen &>/dev/null; then
28
- output=$(keygen 2>&1 || true)
29
- # Should show usage or error - use direct check to avoid eval issues
30
- if [[ -n "$output" ]]; then
31
- ((TESTS_PASSED++)) || true
32
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no args should produce output"
33
- else
34
- ((TESTS_FAILED++)) || true
35
- echo -e " ${RED}✗${NC} $CURRENT_TEST: no args should produce output"
36
- fi
37
- fi
38
-
39
- # Test help flag
40
- test_start "keygen_help_flag"
41
- if type keygen &>/dev/null; then
42
- output=$(keygen --help 2>&1 || keygen -h 2>&1 || echo "usage")
43
- assert_true "true" "help flag check completed"
44
- fi
45
-
46
- # Test invalid key type
47
- test_start "keygen_invalid_type"
48
- if type keygen &>/dev/null; then
49
- result=$(keygen --type invalid_type test_key 2>&1 || echo "error")
50
- # Check for error messages (case insensitive)
51
- if echo "$result" | grep -iqE "(error|invalid|unknown|usage)"; then
52
- ((TESTS_PASSED++))
53
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: invalid type shows error message"
54
- else
55
- ((TESTS_FAILED++))
56
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error for invalid type"
57
- fi
58
- fi
59
-
60
- # Test output format (without actually creating keys)
61
- test_start "keygen_dry_run"
62
- if type keygen &>/dev/null; then
63
- # Just verify it doesn't crash with common args
64
- keygen --help 2>/dev/null || true
65
- assert_true "true" "keygen help does not crash"
66
- fi
67
-
68
- print_summary
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091
3
- # Unit tests for install/lib/logging.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
- LOGGING_FILE="$REPO_ROOT/install/lib/logging.sh"
10
-
11
- echo "Testing logging library..."
12
-
13
- # Test: logging.sh exists
14
- test_start "logging_file_exists"
15
- assert_file_exists "$LOGGING_FILE" "logging.sh should exist"
16
-
17
- # Test: logging.sh has valid syntax
18
- test_start "logging_syntax"
19
- assert_exit_code 0 "bash -n '$LOGGING_FILE'"
20
-
21
- # Test: logging.sh has shebang
22
- test_start "logging_shebang"
23
- assert_file_contains "$LOGGING_FILE" "#!/usr/bin/env bash" "should have bash shebang"
24
-
25
- # Test: logging.sh has double-source guard
26
- test_start "logging_guard"
27
- assert_file_contains "$LOGGING_FILE" "_DOTFILES_LOGGING_LOADED" "should have double-source guard"
28
-
29
- # Test: log_info outputs to stdout with INFO prefix
30
- test_start "log_info_output"
31
- output=$(bash -c 'source "'"$LOGGING_FILE"'"; log_info "test message"' 2>&1)
32
- if [[ "$output" == *"[INFO]"* && "$output" == *"test message"* ]]; then
33
- ((TESTS_PASSED++)) || true
34
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: log_info shows INFO prefix"
35
- else
36
- ((TESTS_FAILED++)) || true
37
- echo -e " ${RED}✗${NC} $CURRENT_TEST: log_info should show INFO prefix"
38
- echo -e " Output: $output"
39
- fi
40
-
41
- # Test: log_warn outputs with WARN prefix to stderr
42
- test_start "log_warn_output"
43
- output=$(bash -c 'source "'"$LOGGING_FILE"'"; log_warn "warn msg"' 2>&1)
44
- if [[ "$output" == *"[WARN]"* && "$output" == *"warn msg"* ]]; then
45
- ((TESTS_PASSED++)) || true
46
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: log_warn shows WARN prefix"
47
- else
48
- ((TESTS_FAILED++)) || true
49
- echo -e " ${RED}✗${NC} $CURRENT_TEST: log_warn should show WARN prefix"
50
- echo -e " Output: $output"
51
- fi
52
-
53
- # Test: log_error outputs with ERROR prefix to stderr
54
- test_start "log_error_output"
55
- output=$(bash -c 'source "'"$LOGGING_FILE"'"; log_error "err msg"' 2>&1)
56
- if [[ "$output" == *"[ERROR]"* && "$output" == *"err msg"* ]]; then
57
- ((TESTS_PASSED++)) || true
58
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: log_error shows ERROR prefix"
59
- else
60
- ((TESTS_FAILED++)) || true
61
- echo -e " ${RED}✗${NC} $CURRENT_TEST: log_error should show ERROR prefix"
62
- echo -e " Output: $output"
63
- fi
64
-
65
- # Test: die exits with code 1
66
- test_start "die_exit_code"
67
- assert_exit_code 1 "bash -c 'source \"$LOGGING_FILE\"; die \"fatal\"'"
68
-
69
- # Test: die shows ERROR prefix
70
- test_start "die_error_output"
71
- output=$(bash -c 'source "'"$LOGGING_FILE"'"; die "fatal error"' 2>&1) || true
72
- if [[ "$output" == *"[ERROR]"* && "$output" == *"fatal error"* ]]; then
73
- ((TESTS_PASSED++)) || true
74
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: die shows ERROR prefix"
75
- else
76
- ((TESTS_FAILED++)) || true
77
- echo -e " ${RED}✗${NC} $CURRENT_TEST: die should show ERROR prefix"
78
- echo -e " Output: $output"
79
- fi
80
-
81
- # Test: double-sourcing is idempotent
82
- test_start "logging_idempotent"
83
- output=$(bash -c '
84
- source "'"$LOGGING_FILE"'"
85
- source "'"$LOGGING_FILE"'"
86
- log_info "still works"
87
- ' 2>&1)
88
- if [[ "$output" == *"still works"* ]]; then
89
- ((TESTS_PASSED++)) || true
90
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: double-sourcing is safe"
91
- else
92
- ((TESTS_FAILED++)) || true
93
- echo -e " ${RED}✗${NC} $CURRENT_TEST: double-sourcing should be safe"
94
- fi
95
-
96
- print_summary