@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
package/install.sh CHANGED
@@ -1,255 +1,342 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # Universal Dotfiles Installer (Zero-Dependency)
3
- # Usage: sh -c "$(curl -fsSL https://dotfiles.io/install.sh)"
4
+ # Usage: bash -c "$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh)"
4
5
  # (or ./install.sh locally)
5
- #
6
- # This installer uses modular libraries from install/lib/:
7
- # - os_detection.sh : OS and architecture detection
8
- # - package_managers.sh: Package manager bootstrapping
9
- # - backup.sh : Dotfile backup functionality
10
- # - chezmoi.sh : Chezmoi installation and configuration
11
6
 
12
7
  set -euo pipefail
13
8
 
14
- # =============================================================================
15
- # Configuration
16
- # =============================================================================
9
+ # ANSI Colors
10
+ RED='\033[0;31m'
11
+ GREEN='\033[0;32m'
12
+ BLUE='\033[0;34m'
13
+ CYAN='\033[0;36m'
14
+ BOLD='\033[1m'
15
+ NC='\033[0m'
17
16
 
18
- VERSION="${1:-v0.2.480}"
19
- REPO_URL="https://github.com/sebastienrousseau/dotfiles.git"
20
- SOURCE_DIR="$HOME/.dotfiles"
17
+ # Paths
18
+ SOURCE_DIR="${SOURCE_DIR:-$HOME/.dotfiles}"
21
19
  LEGACY_SOURCE_DIR="$HOME/.local/share/chezmoi"
20
+ CHEZMOI_CONFIG_DIR="$HOME/.config/chezmoi"
21
+ CHEZMOI_CONFIG_FILE="$CHEZMOI_CONFIG_DIR/chezmoi.toml"
22
22
 
23
- # =============================================================================
24
- # Colors and Output
25
- # =============================================================================
26
-
27
- if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
28
- RED='\033[0;31m'
29
- GREEN='\033[0;32m'
30
- BLUE='\033[0;34m'
31
- CYAN='\033[0;36m'
32
- BOLD='\033[1m'
33
- NC='\033[0m'
34
- else
35
- RED='' GREEN='' BLUE='' CYAN='' BOLD='' NC=''
36
- fi
23
+ # Utility Functions
24
+ step() {
25
+ if [[ "${DOTFILES_SILENT:-0}" != "1" ]]; then
26
+ printf '%b\n' "${BOLD}${BLUE}==>${NC} ${BOLD}$1${NC}"
27
+ fi
28
+ }
37
29
 
38
- step() { echo -e "${BLUE}==>${NC} ${BOLD}$1${NC}"; }
39
- success() { echo -e "${GREEN}==> Done!${NC}"; }
40
30
  error() {
41
- echo -e "${RED}==> Error: $1${NC}"
31
+ printf '%b\n' "${RED}Error:${NC} $1" >&2
42
32
  exit 1
43
33
  }
44
34
 
45
- # =============================================================================
46
- # Banner
47
- # =============================================================================
48
-
49
- echo -e "${CYAN}${BOLD}"
50
- cat <<"EOF"
51
- ___ _ _ _ _
52
- / _ \___ | |_ (_)| |(_) ___ ___
53
- / /_)/ _ \| __|| || || |/ _ \/ __|
54
- / ___/ (_) | |_ | || || | __/\__ \
55
- \/ \___/ \__||_||_||_|\___||___/
56
- Universal Installer
35
+ success() {
36
+ if [[ "${DOTFILES_SILENT:-0}" != "1" ]]; then
37
+ printf '%b\n' "${GREEN}Success!${NC} $1"
38
+ fi
39
+ }
40
+
41
+ # Cross-platform sed in-place (BSD vs GNU)
42
+ sed_in_place() {
43
+ if sed --version >/dev/null 2>&1; then
44
+ sed -i "$@" # GNU
45
+ else
46
+ sed -i '' "$@" # BSD (macOS)
47
+ fi
48
+ }
49
+
50
+ show_help() {
51
+ cat <<EOF
52
+ Usage: install.sh [version] [options]
53
+
54
+ Arguments:
55
+ version The version (tag or branch) to install (default: v0.2.500)
56
+
57
+ Options:
58
+ --help Show this help message
59
+ --force Non-interactive mode (sets DOTFILES_NONINTERACTIVE=1)
60
+ --silent Quiet mode (sets DOTFILES_SILENT=1)
61
+ --minimal Minimal profile (disable nvim, tmux, zellij)
62
+
57
63
  EOF
58
- echo -e "${NC}"
59
-
60
- # =============================================================================
61
- # Library Loading
62
- # =============================================================================
63
-
64
- # Determine script directory for library loading
65
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" 2>/dev/null && pwd)" || SCRIPT_DIR=""
66
- LIB_DIR="${SCRIPT_DIR}/install/lib"
67
-
68
- # Source libraries if available (for local installs)
69
- if [ -d "$LIB_DIR" ]; then
70
- # shellcheck source=install/lib/os_detection.sh
71
- source "$LIB_DIR/os_detection.sh"
72
- # shellcheck source=install/lib/package_managers.sh
73
- source "$LIB_DIR/package_managers.sh"
74
- # shellcheck source=install/lib/backup.sh
75
- source "$LIB_DIR/backup.sh"
76
- # shellcheck source=install/lib/chezmoi.sh
77
- source "$LIB_DIR/chezmoi.sh"
78
- LIBS_LOADED=1
79
- else
80
- LIBS_LOADED=0
81
- fi
64
+ }
82
65
 
83
- # =============================================================================
84
- # Inline Functions (for remote install without libraries)
85
- # =============================================================================
86
-
87
- if [ "$LIBS_LOADED" = "0" ]; then
88
- # Minimal inline implementations when libraries aren't available
89
- detect_os() {
90
- OS="$(uname -s)"
91
- ARCH="$(uname -m)"
92
- target_os="unknown"
93
- case "$OS" in
94
- Darwin) target_os="macos" ;;
95
- Linux)
96
- if [ -f /proc/version ] && grep -qi 'microsoft\|WSL' /proc/version; then
97
- target_os="wsl2"
98
- elif [ -f /etc/os-release ]; then
99
- . /etc/os-release
100
- case "${ID:-}" in
101
- ubuntu | debian | pop | linuxmint | elementary) target_os="debian" ;;
102
- fedora | rhel | centos | rocky | alma) target_os="fedora" ;;
103
- arch | manjaro | endeavouros) target_os="arch" ;;
104
- *) target_os="linux" ;;
105
- esac
106
- else
107
- target_os="linux"
66
+ main() {
67
+ local version="v0.2.500"
68
+ local version_set=0
69
+ local minimal=0
70
+ local _cleanup_files=()
71
+ trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
72
+
73
+ for arg in "$@"; do
74
+ case "$arg" in
75
+ --help)
76
+ show_help
77
+ exit 0
78
+ ;;
79
+ --silent) export DOTFILES_SILENT=1 ;;
80
+ --force) export DOTFILES_NONINTERACTIVE=1 ;;
81
+ --minimal) minimal=1 ;;
82
+ --*)
83
+ error "Unknown option: $arg"
84
+ ;;
85
+ *)
86
+ if [[ $version_set -eq 1 ]]; then
87
+ error "Multiple versions specified: $version and $arg"
108
88
  fi
89
+ version="$arg"
90
+ version_set=1
109
91
  ;;
110
92
  esac
111
- export OS ARCH target_os
112
- }
93
+ done
113
94
 
114
- print_os_info() {
115
- echo " OS: $OS"
116
- echo " Arch: $ARCH"
117
- echo " Target: $target_os"
118
- }
95
+ # 2. Check Prerequisites & Bootstrap Package Managers
96
+ step "Checking Prerequisites..."
119
97
 
120
- bootstrap_package_manager() {
121
- if [ "$target_os" = "macos" ] && ! command -v brew >/dev/null; then
122
- echo " Homebrew not found."
123
- echo -e "${CYAN} SECURITY NOTE: This will download and execute code from brew.sh${NC}"
124
- if [ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]; then
125
- read -r -p " Continue with Homebrew installation? [y/N] " response
126
- case "$response" in
127
- [yY][eE][sS] | [yY]) ;;
128
- *) error "Homebrew installation cancelled." ;;
129
- esac
98
+ # Detect Operating System
99
+ OS="$(uname -s)"
100
+ case "$OS" in
101
+ Darwin) target_os="macos" ;;
102
+ Linux)
103
+ if grep -qi microsoft /proc/version 2>/dev/null; then
104
+ target_os="wsl2"
105
+ elif [ -f /etc/debian_version ]; then
106
+ target_os="debian"
107
+ elif [ -f /etc/fedora-release ]; then
108
+ target_os="fedora"
109
+ elif [ -f /etc/arch-release ]; then
110
+ target_os="arch"
111
+ else
112
+ target_os="linux"
130
113
  fi
131
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
132
- [ -x /opt/homebrew/bin/brew ] && eval "$(/opt/homebrew/bin/brew shellenv)"
133
- [ -x /usr/local/bin/brew ] && eval "$(/usr/local/bin/brew shellenv)"
134
- fi
135
- case "$target_os" in
136
- debian | wsl2) command -v apt-get >/dev/null || error "apt-get required" ;;
137
- fedora) command -v dnf >/dev/null || error "dnf required" ;;
138
- arch) command -v pacman >/dev/null || error "pacman required" ;;
139
- esac
140
- }
114
+ ;;
115
+ *) target_os="unknown" ;;
116
+ esac
141
117
 
142
- check_prerequisites() {
143
- command -v curl >/dev/null || error "curl is required"
144
- command -v git >/dev/null || error "git is required"
118
+ # Bootstrap gum for a better UI if available or install it
119
+ bootstrap_gum() {
120
+ if command -v gum >/dev/null 2>&1; then return 0; fi
121
+ if [[ "${DOTFILES_SILENT:-0}" == "1" ]]; then return 0; fi
122
+
123
+ echo " Bootstrapping UI components (gum)..."
124
+ if [[ "$OS" == "Darwin" ]] && command -v brew >/dev/null; then
125
+ brew install gum >/dev/null 2>&1
126
+ elif [[ "$target_os" == "debian" || "$target_os" == "wsl2" ]]; then
127
+ sudo mkdir -p /etc/apt/keyrings
128
+ curl -fsSL https://repo.charm.sh/apt/gpg.key |
129
+ sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/charm.gpg
130
+ # Verify Charm GPG key fingerprint
131
+ if ! gpg --no-default-keyring --keyring /etc/apt/keyrings/charm.gpg \
132
+ --list-keys --with-colons 2>/dev/null | grep -q "fid:"; then
133
+ echo "Warning: Could not verify Charm GPG key" >&2
134
+ fi
135
+ echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
136
+ sudo apt-get update && sudo apt-get install gum -y >/dev/null 2>&1
137
+ fi
145
138
  }
146
139
 
140
+ # 3. Install Chezmoi (in parallel with other checks where possible)
147
141
  install_chezmoi() {
148
142
  if command -v chezmoi >/dev/null; then
149
143
  echo " chezmoi already installed: $(chezmoi --version)"
150
- elif command -v brew >/dev/null; then
151
- brew install chezmoi
144
+ return 0
145
+ fi
146
+
147
+ if command -v brew >/dev/null; then
148
+ echo " Installing chezmoi via Homebrew..."
149
+ brew install chezmoi >/dev/null 2>&1
152
150
  else
153
- local bin_dir="$HOME/.local/bin"
151
+ bin_dir="$HOME/.local/bin"
154
152
  mkdir -p "$bin_dir"
153
+ echo " Installing chezmoi via binary download..."
154
+
155
+ # Prefer verified installer with SHA256 checksum when available
156
+ local verified_installer
157
+ verified_installer="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/ci/install-chezmoi-verified.sh"
158
+ if [[ -x "$verified_installer" ]] || [[ -f "$verified_installer" ]]; then
159
+ echo " Using checksum-verified installer..."
160
+ if ! bash "$verified_installer" "${CHEZMOI_VERSION:-2.47.1}" "$bin_dir"; then
161
+ echo " Verified installer failed, falling back to get.chezmoi.io" >&2
162
+ else
163
+ return 0
164
+ fi
165
+ fi
166
+
167
+ # Fallback: download installer with size/shebang validation
155
168
  local installer
156
- installer=$(mktemp)
157
- curl -fsSL -o "$installer" https://get.chezmoi.io || error "Failed to download chezmoi"
158
- [ "$(wc -c <"$installer")" -gt 102400 ] && {
169
+ installer=$(umask 077 && mktemp)
170
+ if ! curl -fsSL -o "$installer" https://get.chezmoi.io; then
171
+ rm -f "$installer"
172
+ echo " Failed to download chezmoi installer" >&2
173
+ return 1
174
+ fi
175
+ # Validate: must be a shell script and not suspiciously large
176
+ if [[ "$(wc -c <"$installer")" -gt 102400 ]]; then
177
+ rm -f "$installer"
178
+ echo " Chezmoi installer suspiciously large. Aborting." >&2
179
+ return 1
180
+ fi
181
+ if ! head -1 "$installer" | grep -q '^#!/'; then
159
182
  rm -f "$installer"
160
- error "Installer too large"
161
- }
162
- sh "$installer" -- -b "$bin_dir" 2>/dev/null || {
183
+ echo " Chezmoi installer doesn't look like a shell script. Aborting." >&2
184
+ return 1
185
+ fi
186
+ if ! BINDIR="$bin_dir" sh "$installer"; then
163
187
  rm -f "$installer"
164
- error "Failed to install chezmoi"
165
- }
188
+ echo " chezmoi binary installer failed" >&2
189
+ return 1
190
+ fi
166
191
  rm -f "$installer"
167
- export PATH="$bin_dir:$PATH"
168
192
  fi
169
193
  }
170
194
 
195
+ # Parallel execution of bootstrapping components
196
+ local pid_gum pid_cm
197
+ (bootstrap_gum) &
198
+ pid_gum=$!
199
+ (install_chezmoi) &
200
+ pid_cm=$!
201
+
202
+ # Wait and check exit codes
203
+ wait "$pid_gum" || true # gum is optional
204
+ wait "$pid_cm" || error "chezmoi installation failed"
205
+
206
+ # Critical: Add to PATH for the rest of the script to see it
207
+ bin_dir="$HOME/.local/bin"
208
+ export PATH="$bin_dir:$PATH"
209
+
210
+ # 4. Prepare source directory
211
+ step "Preparing source directory..."
212
+
213
+ # VERSION pinning for supply-chain security
214
+ VERSION="$version"
215
+
171
216
  ensure_chezmoi_source() {
172
217
  local dir="$1"
173
- local config_dir="$HOME/.config/chezmoi"
174
- mkdir -p "$config_dir"
175
- printf 'sourceDir = "%s"\n' "$dir" >"$config_dir/chezmoi.toml"
218
+ mkdir -p "$CHEZMOI_CONFIG_DIR"
219
+ # Escape sed metacharacters in replacement string
220
+ local escaped_dir
221
+ escaped_dir=$(printf '%s\n' "$dir" | sed -e 's/[\/&]/\\&/g')
222
+ if [[ -f "$CHEZMOI_CONFIG_FILE" ]] && grep -q '^sourceDir' "$CHEZMOI_CONFIG_FILE"; then
223
+ sed_in_place "s,^sourceDir.*$,sourceDir = \"$escaped_dir\"," "$CHEZMOI_CONFIG_FILE"
224
+ else
225
+ printf 'sourceDir = "%s"\n' "$dir" >"$CHEZMOI_CONFIG_FILE"
226
+ fi
176
227
  }
177
228
 
178
- perform_backup() {
179
- local backup_dir
180
- backup_dir="$HOME/.dotfiles.bak.$(date +"%Y%m%d_%H%M%S")"
181
- local count=0
182
- if command -v chezmoi >/dev/null && [ -f "$HOME/.config/chezmoi/chezmoi.toml" ]; then
183
- while IFS= read -r file; do
184
- [ -z "$file" ] && continue
185
- if [ -e "$file" ]; then
186
- local rel="${file#"$HOME"/}"
187
- mkdir -p "$backup_dir/$(dirname "$rel")"
188
- cp -a "$file" "$backup_dir/$rel"
189
- count=$((count + 1))
190
- fi
191
- done < <(chezmoi managed --path-style=absolute 2>/dev/null || true)
192
- fi
193
- [ "$count" -gt 0 ] && echo " Backed up $count files to $backup_dir" || echo " No files to back up."
229
+ apply_minimal_profile_overrides() {
230
+ local data_file="$1"
231
+ [[ -f "$data_file" ]] || return 0
232
+ sed_in_place 's/^profile = ".*"/profile = "minimal"/' "$data_file"
233
+ sed_in_place 's/^nvim = true/nvim = false/' "$data_file"
234
+ sed_in_place 's/^tmux = true/tmux = false/' "$data_file"
235
+ sed_in_place 's/^zellij = true/zellij = false/' "$data_file"
194
236
  }
195
- fi
196
237
 
197
- # =============================================================================
198
- # Main Installation Flow
199
- # =============================================================================
200
-
201
- # Step 1: Detect Environment
202
- step "Detecting Environment..."
203
- detect_os
204
- print_os_info
205
-
206
- # Step 2: Bootstrap Package Managers
207
- step "Checking Prerequisites..."
208
- bootstrap_package_manager
209
- check_prerequisites
210
-
211
- # Step 3: Install Chezmoi
212
- step "Installing Chezmoi..."
213
- install_chezmoi
214
-
215
- # Step 4: Backup Existing Dotfiles
216
- step "Backing up existing dotfiles..."
217
- if [ -d "$SOURCE_DIR/.git" ]; then
218
- ensure_chezmoi_source "$SOURCE_DIR"
219
- elif [ -d "$LEGACY_SOURCE_DIR/.git" ]; then
220
- ensure_chezmoi_source "$LEGACY_SOURCE_DIR"
221
- fi
222
- perform_backup
223
-
224
- # Step 5: Apply Configuration
225
- step "Applying Configuration..."
226
-
227
- APPLY_FLAGS=()
228
- [ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ] && APPLY_FLAGS=(--force --no-tty)
229
-
230
- if [ -d "$SOURCE_DIR/.git" ]; then
231
- echo " Applying from local source: $SOURCE_DIR"
232
- ensure_chezmoi_source "$SOURCE_DIR"
233
- chezmoi apply "${APPLY_FLAGS[@]}"
234
- elif [ -d "$LEGACY_SOURCE_DIR/.git" ]; then
235
- echo " Migrating from legacy source: $LEGACY_SOURCE_DIR"
236
- mv "$LEGACY_SOURCE_DIR" "$SOURCE_DIR"
237
- ensure_chezmoi_source "$SOURCE_DIR"
238
- chezmoi apply "${APPLY_FLAGS[@]}"
239
- else
240
- echo " Initializing from GitHub (Version: $VERSION)..."
241
- echo -e "${CYAN} SECURITY NOTE: Cloning pinned version $VERSION${NC}"
242
-
243
- git clone --depth 1 --branch "$VERSION" "$REPO_URL" "$SOURCE_DIR" 2>/dev/null ||
244
- { git clone "$REPO_URL" "$SOURCE_DIR" && (cd "$SOURCE_DIR" && git checkout "$VERSION"); }
245
-
246
- ensure_chezmoi_source "$SOURCE_DIR"
247
- chezmoi apply "${APPLY_FLAGS[@]}"
248
- fi
238
+ # 5. Backup existing dotfiles that chezmoi will overwrite
239
+ step "Backing up existing dotfiles..."
240
+ BACKUP_DIR="$HOME/.dotfiles.bak.$(date +"%Y%m%d_%H%M%S")"
241
+ backup_count=0
242
+
243
+ # Determine the source directory for chezmoi to diff against
244
+ if [[ -d "$SOURCE_DIR/.git" ]]; then
245
+ ensure_chezmoi_source "$SOURCE_DIR"
246
+ elif [[ -d "$LEGACY_SOURCE_DIR/.git" ]]; then
247
+ ensure_chezmoi_source "$LEGACY_SOURCE_DIR"
248
+ fi
249
+
250
+ # Back up any existing files that chezmoi would overwrite
251
+ if command -v chezmoi >/dev/null && [[ -f "$CHEZMOI_CONFIG_FILE" ]]; then
252
+ while IFS= read -r file; do
253
+ [[ -z "$file" ]] && continue
254
+ if [[ -e "$file" ]]; then
255
+ rel="${file#"$HOME"/}"
256
+ mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
257
+ cp -a "$file" "$BACKUP_DIR/$rel"
258
+ backup_count=$((backup_count + 1))
259
+ fi
260
+ done < <(chezmoi managed --path-style=absolute 2>/dev/null || true)
261
+ fi
249
262
 
250
- # =============================================================================
251
- # Complete
252
- # =============================================================================
263
+ if [[ "$backup_count" -gt 0 ]]; then
264
+ echo " Backed up $backup_count files to $BACKUP_DIR"
265
+ else
266
+ echo " No existing dotfiles to back up."
267
+ rm -rf "$BACKUP_DIR" 2>/dev/null || true
268
+ fi
253
269
 
254
- success
255
- echo -e "${GREEN}Configuration loaded. Please restart your shell.${NC}"
270
+ # Detect devcontainer/Codespaces environment
271
+ if [[ -f /.dockerenv ]] || [[ -n "${CODESPACES:-}" ]] || [[ -n "${REMOTE_CONTAINERS:-}" ]]; then
272
+ DOTFILES_MINIMAL=1
273
+ step "Detected container environment — using minimal profile"
274
+ fi
275
+
276
+ # Apply --minimal overrides if requested
277
+ if [[ $minimal -eq 1 ]] || [[ "${DOTFILES_MINIMAL:-0}" = "1" ]]; then
278
+ step "Applying minimal profile overrides..."
279
+ apply_minimal_profile_overrides "$SOURCE_DIR/.chezmoidata.toml"
280
+ fi
281
+
282
+ # 6. Initialize & Apply
283
+ step "Applying Configuration..."
284
+
285
+ # If we are running from a local source, just apply
286
+ if [[ -d "$SOURCE_DIR/.git" ]]; then
287
+ echo " Applying from local source: $SOURCE_DIR"
288
+ ensure_chezmoi_source "$SOURCE_DIR"
289
+ APPLY_FLAGS=()
290
+ if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
291
+ APPLY_FLAGS=(--force --no-tty)
292
+ fi
293
+ chezmoi apply "${APPLY_FLAGS[@]}"
294
+ elif [[ -d "$LEGACY_SOURCE_DIR/.git" ]]; then
295
+ echo " Migrating from legacy source: $LEGACY_SOURCE_DIR"
296
+ mv "$LEGACY_SOURCE_DIR" "$SOURCE_DIR"
297
+ ensure_chezmoi_source "$SOURCE_DIR"
298
+ APPLY_FLAGS=()
299
+ if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
300
+ APPLY_FLAGS=(--force --no-tty)
301
+ fi
302
+ chezmoi apply "${APPLY_FLAGS[@]}"
303
+ else
304
+ echo " Initializing from GitHub (Branch/Tag: $VERSION)..."
305
+ printf '%b\n' "${CYAN} SECURITY NOTE: Cloning pinned version $VERSION for supply-chain safety${NC}"
306
+
307
+ # STRICT MODE: We pin to the specific tag to avoid 'main' branch drift
308
+ git clone --depth 1 --branch "$VERSION" https://github.com/sebastienrousseau/dotfiles.git "$SOURCE_DIR" 2>/dev/null ||
309
+ { git clone https://github.com/sebastienrousseau/dotfiles.git "$SOURCE_DIR" && (cd "$SOURCE_DIR" && git checkout "$VERSION"); }
310
+
311
+ # Verify the checkout succeeded and we're on the expected version
312
+ ACTUAL_REF=$(
313
+ cd "$SOURCE_DIR" || exit 1
314
+ if ! git describe --tags --exact-match 2>/dev/null; then
315
+ git rev-parse --short HEAD
316
+ fi
317
+ )
318
+ if [[ "$ACTUAL_REF" != "$VERSION" ]] && [[ "${ACTUAL_REF#v}" != "${VERSION#v}" ]]; then
319
+ printf '%b\n' "${RED} WARNING: Checked out ref $ACTUAL_REF (requested: $VERSION) — version mismatch${NC}" >&2
320
+ fi
321
+
322
+ if [[ $minimal -eq 1 ]]; then
323
+ step "Applying minimal profile overrides..."
324
+ apply_minimal_profile_overrides "$SOURCE_DIR/.chezmoidata.toml"
325
+ fi
326
+
327
+ ensure_chezmoi_source "$SOURCE_DIR"
328
+ APPLY_FLAGS=()
329
+ if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
330
+ APPLY_FLAGS=(--force --no-tty)
331
+ fi
332
+ chezmoi apply "${APPLY_FLAGS[@]}"
333
+ fi
334
+
335
+ success "Configuration loaded. Please restart your shell."
336
+ step "Run 'dot learn' for an interactive tour of your new dotfiles."
337
+ }
338
+
339
+ # Run main if executed directly (or via bash -c where BASH_SOURCE is unset)
340
+ if [[ "${BASH_SOURCE[0]:-}" == "${0:-}" ]] || [[ -z "${BASH_SOURCE[0]:-}" ]]; then
341
+ main "$@"
342
+ fi
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@sebastienrousseau/dotfiles",
3
- "version": "0.2.481",
3
+ "version": "0.2.500",
4
4
  "description": "The Trusted Shell Platform — Universal dotfiles managed by Chezmoi. Features Bash & Zsh for macOS, Linux & WSL. Rust modern tooling & enterprise-grade security.",
5
5
  "main": "install.sh",
6
6
  "bin": {
7
7
  "dotfiles-install": "./install.sh"
8
8
  },
9
9
  "scripts": {
10
- "test": "bash -n install.sh && echo 'Syntax OK'",
10
+ "test": "bash ./scripts/qa/reliability-audit.sh",
11
+ "test:quick": "bash ./scripts/qa/reliability-audit.sh --quick",
12
+ "test:unit": "bash ./scripts/qa/reliability-audit.sh --unit-only",
13
+ "test:integration": "bash ./scripts/qa/reliability-audit.sh --with-integration",
14
+ "examples": "bash ./scripts/qa/validate-examples.sh",
11
15
  "lint": "shellcheck install.sh scripts/**/*.sh"
12
16
  },
13
17
  "repository": {
@@ -29,11 +33,19 @@
29
33
  "cli",
30
34
  "automation",
31
35
  "devops",
32
- "security"
36
+ "security",
37
+ "nix",
38
+ "home-manager",
39
+ "starship",
40
+ "mise",
41
+ "age-encryption",
42
+ "terminal",
43
+ "configuration-management",
44
+ "infrastructure-as-code"
33
45
  ],
34
46
  "author": {
35
47
  "name": "Sebastien Rousseau",
36
- "email": "sebastian.rousseau@gmail.com",
48
+ "email": "sebastienrousseau@users.noreply.github.com",
37
49
  "url": "https://sebastienrousseau.com"
38
50
  },
39
51
  "license": "MIT",
@@ -46,7 +58,7 @@
46
58
  "url": "https://github.com/sponsors/sebastienrousseau"
47
59
  },
48
60
  "engines": {
49
- "node": ">=18.0.0"
61
+ "node": ">=18.0.0 <26.0.0"
50
62
  },
51
63
  "publishConfig": {
52
64
  "access": "public",