@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
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Pre-warm shell initialization caches for ultra-fast startup.
4
+
5
+ set -euo pipefail
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
8
+ # shellcheck disable=SC1091
9
+ source "$SCRIPT_DIR/dot/lib/ui.sh"
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/dot/lib/log.sh"
12
+ export DOT_COMMAND="prewarm"
13
+
14
+ # Prevent concurrent execution
15
+ # Prefer XDG runtime dir when it exists and is writable; fallback to /tmp.
16
+ LOCK_BASE="/tmp"
17
+ if [[ -n "${XDG_RUNTIME_DIR:-}" ]] && [[ -d "${XDG_RUNTIME_DIR}" ]] && [[ -w "${XDG_RUNTIME_DIR}" ]]; then
18
+ LOCK_BASE="${XDG_RUNTIME_DIR}"
19
+ fi
20
+ LOCK_FILE="${LOCK_BASE}/dotfiles-prewarm.lock"
21
+ LOCK_DIR="${LOCK_FILE}.d"
22
+ if command -v flock >/dev/null 2>&1; then
23
+ exec 9>"$LOCK_FILE"
24
+ if ! flock -n 9; then
25
+ ui_warn "Already running" "Another instance is active"
26
+ exit 0
27
+ fi
28
+ else
29
+ # Portable fallback when flock is unavailable (e.g. minimal macOS envs).
30
+ if ! mkdir "$LOCK_DIR" 2>/dev/null; then
31
+ ui_warn "Already running" "Another instance is active"
32
+ exit 0
33
+ fi
34
+ trap 'rmdir "$LOCK_DIR" 2>/dev/null || true' EXIT
35
+ fi
36
+
37
+ CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}"
38
+ mkdir -p "$CACHE_DIR/"{zsh,bash,fish,nushell}
39
+
40
+ ui_header "Pre-warming Shell Caches"
41
+
42
+ warm_tool() {
43
+ local tool="$1"
44
+ local cmd="$2"
45
+ local shell="$3"
46
+ local ext="$4"
47
+
48
+ local cache_file="$CACHE_DIR/$shell/$tool-init.$ext"
49
+ local tmp_file="${cache_file}.tmp.$$"
50
+
51
+ if command -v "$tool" >/dev/null 2>&1; then
52
+ if eval "$cmd" >"$tmp_file" 2>/dev/null && [ -s "$tmp_file" ]; then
53
+ mv "$tmp_file" "$cache_file"
54
+ ui_ok "$tool" "Cached for $shell"
55
+ else
56
+ rm -f "$tmp_file"
57
+ ui_warn "$tool" "Failed to cache for $shell"
58
+ fi
59
+ fi
60
+ }
61
+
62
+ ui_section "Zsh"
63
+ warm_tool "mise" "mise activate zsh" "zsh" "zsh"
64
+ warm_tool "starship" "starship init zsh" "zsh" "zsh"
65
+ warm_tool "zoxide" "zoxide init zsh" "zsh" "zsh"
66
+ warm_tool "atuin" "atuin init zsh --disable-up-arrow" "zsh" "zsh"
67
+ warm_tool "fzf" "fzf --zsh" "zsh" "zsh"
68
+ warm_tool "direnv" "direnv hook zsh" "zsh" "zsh"
69
+
70
+ ui_section "Bash"
71
+ warm_tool "mise" "mise activate bash" "bash" "bash"
72
+ warm_tool "starship" "starship init bash" "bash" "bash"
73
+ warm_tool "zoxide" "zoxide init bash" "bash" "bash"
74
+ warm_tool "atuin" "atuin init bash --disable-up-arrow" "bash" "bash"
75
+ warm_tool "fzf" "fzf --bash" "bash" "bash"
76
+ warm_tool "direnv" "direnv hook bash" "bash" "bash"
77
+
78
+ ui_section "Fish"
79
+ warm_tool "mise" "mise activate fish" "fish" "fish"
80
+ warm_tool "starship" "starship init fish" "fish" "fish"
81
+ warm_tool "zoxide" "zoxide init fish" "fish" "fish"
82
+ warm_tool "atuin" "atuin init fish" "fish" "fish"
83
+ warm_tool "fzf" "fzf --fish" "fish" "fish"
84
+ warm_tool "direnv" "direnv hook fish" "fish" "fish"
85
+
86
+ ui_section "Nushell"
87
+ for _nu_entry in "starship:starship init nu:starship.nu" "zoxide:zoxide init nushell:zoxide.nu" "atuin:atuin init nu:atuin.nu"; do
88
+ _nu_tool="${_nu_entry%%:*}"
89
+ _nu_rest="${_nu_entry#*:}"
90
+ _nu_cmd="${_nu_rest%%:*}"
91
+ _nu_file="${_nu_rest#*:}"
92
+ if command -v "$_nu_tool" >/dev/null 2>&1; then
93
+ _nu_tmp="$CACHE_DIR/nushell/${_nu_file}.tmp.$$"
94
+ if eval "$_nu_cmd" >"$_nu_tmp" 2>/dev/null && [ -s "$_nu_tmp" ]; then
95
+ mv "$_nu_tmp" "$CACHE_DIR/nushell/$_nu_file"
96
+ ui_ok "$_nu_tool" "Cached for nushell"
97
+ else
98
+ rm -f "$_nu_tmp"
99
+ ui_warn "$_nu_tool" "Failed to cache for nushell"
100
+ fi
101
+ fi
102
+ done
103
+
104
+ # --- Completions ---
105
+ ui_section "Shell completions"
106
+ ZSH_COMP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/completions"
107
+ mkdir -p "$ZSH_COMP_DIR"
108
+
109
+ _prewarm_completion() {
110
+ local name="$1" cmd="$2"
111
+ shift 2
112
+ if command -v "$cmd" >/dev/null 2>&1; then
113
+ if "$cmd" "$@" >"${ZSH_COMP_DIR}/_${name}" 2>/dev/null; then
114
+ ui_ok "$name" "completion generated"
115
+ fi
116
+ fi
117
+ }
118
+
119
+ _prewarm_completion "gh" "gh" completion -s zsh
120
+ _prewarm_completion "just" "just" --completions zsh
121
+ _prewarm_completion "chezmoi" "chezmoi" completion zsh
122
+ _prewarm_completion "kubectl" "kubectl" completion zsh
123
+ _prewarm_completion "mise" "mise" completion zsh
124
+ _prewarm_completion "atuin" "atuin" gen-completions --shell zsh
125
+
126
+ ui_header "Cache Pre-warming Complete"
127
+ dot_log info "prewarm_complete"
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # =============================================================================
4
+ # Dotfiles Release Script
5
+ # Orchestrates a new release: version bump, changelog, tag, and push
6
+ # Usage: ./scripts/ops/release.sh [patch|minor] [--dry-run]
7
+ # =============================================================================
8
+
9
+ set -euo pipefail
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
13
+ # shellcheck source=../dot/lib/ui.sh
14
+ # shellcheck disable=SC1091
15
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
16
+ # shellcheck source=../dot/lib/log.sh
17
+ # shellcheck disable=SC1091
18
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
19
+ export DOT_COMMAND="release"
20
+ ui_init
21
+
22
+ log_info() { ui_info "$@"; }
23
+ log_success() { ui_ok "$@"; }
24
+ log_warn() { ui_warn "$@"; }
25
+ log_error() { ui_err "$@"; }
26
+ log_step() {
27
+ echo ""
28
+ ui_section "$*"
29
+ }
30
+
31
+ # Cross-platform sed in-place (BSD vs GNU)
32
+ sed_in_place() {
33
+ if sed --version >/dev/null 2>&1; then
34
+ sed -i "$@" # GNU
35
+ else
36
+ sed -i '' "$@" # BSD (macOS)
37
+ fi
38
+ }
39
+
40
+ usage() {
41
+ local current
42
+ current=$(get_version)
43
+ local next_patch
44
+ next_patch=$(bump_version "$current" "patch")
45
+ local next_minor
46
+ next_minor=$(bump_version "$current" "minor")
47
+
48
+ cat <<EOF
49
+ Dotfiles Release Tool
50
+
51
+ Usage: $(basename "$0") [BUMP_TYPE] [OPTIONS]
52
+
53
+ Bump Types:
54
+ patch Increment patch version ($current → $next_patch) [default]
55
+ minor Increment minor version ($current → $next_minor)
56
+
57
+ Options:
58
+ -n, --dry-run Show what would be done without making changes
59
+ -h, --help Show this help message
60
+
61
+ Steps performed:
62
+ 1. Verify clean working tree and up-to-date branch
63
+ 2. Bump version in package.json
64
+ 3. Run version-sync to update docs
65
+ 4. Update CHANGELOG.md with new version header
66
+ 5. Create signed commit and tag
67
+ 6. Push commit and tag to origin
68
+
69
+ Examples:
70
+ $(basename "$0") # Patch release
71
+ $(basename "$0") minor # Minor release
72
+ $(basename "$0") --dry-run # Preview patch release
73
+
74
+ EOF
75
+ }
76
+
77
+ # Get current version from package.json
78
+ get_version() {
79
+ grep -o '"version": "[^"]*"' "$PROJECT_ROOT/package.json" | grep -o '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'
80
+ }
81
+
82
+ # Bump version string
83
+ bump_version() {
84
+ local current="$1" bump_type="$2"
85
+ local major minor patch
86
+ IFS='.' read -r major minor patch <<<"$current"
87
+
88
+ case "$bump_type" in
89
+ patch) patch=$((patch + 1)) ;;
90
+ minor)
91
+ minor=$((minor + 1))
92
+ patch=0
93
+ ;;
94
+ *)
95
+ log_error "Unknown bump type: $bump_type"
96
+ exit 1
97
+ ;;
98
+ esac
99
+
100
+ echo "${major}.${minor}.${patch}"
101
+ }
102
+
103
+ main() {
104
+ local bump_type="patch"
105
+ local dry_run=0
106
+
107
+ # Parse arguments
108
+ while [[ $# -gt 0 ]]; do
109
+ case "$1" in
110
+ patch | minor)
111
+ bump_type="$1"
112
+ shift
113
+ ;;
114
+ -n | --dry-run)
115
+ dry_run=1
116
+ shift
117
+ ;;
118
+ -h | --help)
119
+ usage
120
+ exit 0
121
+ ;;
122
+ *)
123
+ log_error "Unknown argument: $1"
124
+ usage
125
+ exit 1
126
+ ;;
127
+ esac
128
+ done
129
+
130
+ # Concurrency guard
131
+ LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/dotfiles-release.lock"
132
+ exec 9>"$LOCK_FILE"
133
+ if ! flock -n 9; then
134
+ ui_warn "Already running" "Another release is in progress"
135
+ exit 0
136
+ fi
137
+
138
+ cd "$PROJECT_ROOT"
139
+ dot_log info "release_start" "bump_type=$bump_type"
140
+
141
+ local current_version new_version
142
+ current_version=$(get_version)
143
+ new_version=$(bump_version "$current_version" "$bump_type")
144
+
145
+ printf '%b\n' "${BOLD}Dotfiles Release${NC}"
146
+ echo " Current: v${current_version}"
147
+ echo " Next: v${new_version} (${bump_type})"
148
+ echo ""
149
+
150
+ if [[ "$dry_run" == "1" ]]; then
151
+ log_warn "DRY-RUN MODE — no changes will be made"
152
+ echo ""
153
+ fi
154
+
155
+ # ── Step 1: Preflight checks ─────────────────────────────────
156
+ log_step "Preflight checks"
157
+
158
+ if [[ -n "$(git status --porcelain)" ]]; then
159
+ log_error "Working tree is not clean. Commit or stash changes first."
160
+ exit 1
161
+ fi
162
+ log_success "Working tree clean"
163
+
164
+ local branch
165
+ branch=$(git branch --show-current)
166
+ if [[ "$branch" != "master" && "$branch" != "main" ]]; then
167
+ log_warn "On branch '$branch' — releases typically happen from master/main"
168
+ read -rp "Continue anyway? [y/N] " response
169
+ [[ "$response" =~ ^[Yy]$ ]] || exit 0
170
+ fi
171
+ log_success "On branch: $branch"
172
+
173
+ git fetch origin "$branch" --quiet
174
+ local behind
175
+ behind=$(git rev-list --count "HEAD..origin/$branch" 2>/dev/null || echo "0")
176
+ if [[ "$behind" -gt 0 ]]; then
177
+ log_error "Branch is $behind commit(s) behind origin. Pull first."
178
+ exit 1
179
+ fi
180
+ log_success "Branch is up to date with origin"
181
+
182
+ if [[ "$dry_run" == "1" ]]; then
183
+ log_step "Would perform the following"
184
+ log_info "1. Bump package.json: $current_version → $new_version"
185
+ log_info "2. Run version-sync.sh"
186
+ log_info "3. Add v${new_version} header to CHANGELOG.md"
187
+ log_info "4. Commit: 'chore(release): v${new_version}'"
188
+ log_info "5. Tag: v${new_version} (signed)"
189
+ log_info "6. Push commit and tag to origin"
190
+ echo ""
191
+ log_success "Dry run complete"
192
+ exit 0
193
+ fi
194
+
195
+ # ── Step 2: Bump version ──────────────────────────────────────
196
+ log_step "Bump version in package.json"
197
+ sed_in_place "s/\"version\": \"${current_version}\"/\"version\": \"${new_version}\"/" "$PROJECT_ROOT/package.json"
198
+ log_success "package.json: $current_version → $new_version"
199
+
200
+ # ── Step 3: Sync versions across docs ─────────────────────────
201
+ log_step "Sync version across docs"
202
+ if [[ -x "$SCRIPT_DIR/../version-sync.sh" ]]; then
203
+ bash "$SCRIPT_DIR/../version-sync.sh" --force 2>&1 | tail -3
204
+ log_success "Version sync complete"
205
+ else
206
+ log_warn "version-sync.sh not found, skipping"
207
+ fi
208
+
209
+ # ── Step 4: Update CHANGELOG ──────────────────────────────────
210
+ log_step "Update CHANGELOG.md"
211
+ local today
212
+ today=$(date +%Y-%m-%d)
213
+ local changelog="$PROJECT_ROOT/CHANGELOG.md"
214
+
215
+ if [[ -f "$changelog" ]]; then
216
+ # Insert new version header after the first "# Changelog" line
217
+ sed_in_place "/^## v${current_version}/i\\
218
+ ## v${new_version} (${today})\\
219
+ \\
220
+ ### Changed\\
221
+ \\
222
+ - Version bump to v${new_version}.\\
223
+ " "$changelog"
224
+ log_success "Added v${new_version} section to CHANGELOG.md"
225
+ else
226
+ log_warn "CHANGELOG.md not found, skipping"
227
+ fi
228
+
229
+ # ── Step 5: Commit and tag ────────────────────────────────────
230
+ log_step "Create signed commit and tag"
231
+ git add -A
232
+ git commit -S -m "chore(release): v${new_version}"
233
+ git tag -s "v${new_version}" -m "Release v${new_version}"
234
+ log_success "Committed and tagged v${new_version}"
235
+
236
+ # ── Step 6: Push ──────────────────────────────────────────────
237
+ log_step "Push to origin"
238
+ read -rp "Push v${new_version} to origin/$branch? [y/N] " response
239
+ if [[ "$response" =~ ^[Yy]$ ]]; then
240
+ git push origin "$branch" --follow-tags
241
+ log_success "Pushed v${new_version} to origin"
242
+ else
243
+ log_warn "Skipped push. Run manually:"
244
+ echo " git push origin $branch --follow-tags"
245
+ fi
246
+
247
+ echo ""
248
+ dot_log info "release_end" "version=$new_version"
249
+ log_success "Release v${new_version} complete"
250
+ }
251
+
252
+ main "$@"
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # shellcheck disable=SC2034
3
4
  # =============================================================================
4
5
  # Dotfiles Rollback Script - Self-Healing Configuration Recovery
@@ -8,34 +9,43 @@
8
9
 
9
10
  set -euo pipefail
10
11
 
12
+ _cleanup_files=()
13
+ trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
14
+
11
15
  # Configuration
12
16
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
17
+ # shellcheck source=../dot/lib/ui.sh
18
+ # shellcheck disable=SC1091
19
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
20
+ # shellcheck source=../dot/lib/log.sh
21
+ # shellcheck disable=SC1091
22
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
23
+ export DOT_COMMAND="rollback"
13
24
  REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
14
- DOTFILES_SOURCE="${HOME}/.dotfiles"
25
+ # Resolve symlinks for consistent path handling
26
+ if command -v realpath >/dev/null 2>&1; then
27
+ DOTFILES_SOURCE="$(realpath "${HOME}/.dotfiles" 2>/dev/null || echo "${HOME}/.dotfiles")"
28
+ elif command -v readlink >/dev/null 2>&1; then
29
+ DOTFILES_SOURCE="$(readlink -f "${HOME}/.dotfiles" 2>/dev/null || echo "${HOME}/.dotfiles")"
30
+ else
31
+ DOTFILES_SOURCE="${HOME}/.dotfiles"
32
+ fi
15
33
  BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
16
34
  STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles"
17
35
  ROLLBACK_LOG="$STATE_DIR/rollback.log"
18
36
  MAX_BACKUPS=10
19
37
 
20
- # Colors (respect NO_COLOR: https://no-color.org)
21
- if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
22
- RED='\033[0;31m'
23
- GREEN='\033[0;32m'
24
- YELLOW='\033[0;33m'
25
- BLUE='\033[0;34m'
26
- BOLD='\033[1m'
27
- NC='\033[0m'
28
- else
29
- RED='' GREEN='' YELLOW='' BLUE='' BOLD='' NC=''
30
- fi
31
-
32
- # Logging
33
- log() { echo -e "$*"; }
34
- log_info() { log "${BLUE}[INFO]${NC} $*"; }
35
- log_success() { log "${GREEN}[OK]${NC} $*"; }
36
- log_warn() { log "${YELLOW}[WARN]${NC} $*"; }
37
- log_error() { log "${RED}[ERROR]${NC} $*"; }
38
- log_step() { log "\n${BOLD}==> $*${NC}"; }
38
+ # Logging delegates to shared ui.sh primitives
39
+ ui_init
40
+ log() { printf '%b\n' "$*"; }
41
+ log_info() { ui_info "$@"; }
42
+ log_success() { ui_ok "$@"; }
43
+ log_warn() { ui_warn "$@"; }
44
+ log_error() { ui_err "$@"; }
45
+ log_step() {
46
+ echo ""
47
+ ui_section "$*"
48
+ }
39
49
 
40
50
  # Persistent logging
41
51
  persist_log() {
@@ -100,7 +110,7 @@ list_backups() {
100
110
  timestamp=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M:%S" "$backup" 2>/dev/null || stat -c "%y" "$backup" 2>/dev/null | cut -d'.' -f1)
101
111
  size=$(du -sh "$backup" 2>/dev/null | cut -f1)
102
112
  printf " %2d. %-30s %s %s\n" "$i" "$name" "$timestamp" "$size"
103
- ((i++))
113
+ ((i++)) || true
104
114
  fi
105
115
  done < <(find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup_*" | sort -r)
106
116
 
@@ -148,17 +158,22 @@ create_backup() {
148
158
  dest_dir=$(dirname "$backup_path/$rel_path")
149
159
  mkdir -p "$dest_dir"
150
160
  cp -a "$target" "$backup_path/$rel_path" 2>/dev/null || true
151
- ((backed_up++))
161
+ ((backed_up++)) || true
152
162
  [[ "$VERBOSE" == "1" ]] && log_info "Backed up: $rel_path"
153
163
  fi
154
164
  done
155
165
 
166
+ local git_commit="unknown"
167
+ if cd "$DOTFILES_SOURCE" 2>/dev/null; then
168
+ git_commit=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
169
+ fi
170
+
156
171
  # Record metadata
157
172
  cat >"$backup_path/.backup_meta" <<EOF
158
173
  timestamp=$timestamp
159
174
  reason=$reason
160
175
  chezmoi_version=$(chezmoi --version 2>/dev/null || echo "unknown")
161
- git_commit=$(cd "$DOTFILES_SOURCE" 2>/dev/null && git rev-parse --short HEAD 2>/dev/null || echo "unknown")
176
+ git_commit=$git_commit
162
177
  files_backed_up=$backed_up
163
178
  EOF
164
179
 
@@ -229,7 +244,7 @@ perform_rollback() {
229
244
  dest_dir=$(dirname "$dest")
230
245
  mkdir -p "$dest_dir"
231
246
  cp -a "$file" "$dest"
232
- ((restored++))
247
+ ((restored++)) || true
233
248
  [[ "$VERBOSE" == "1" ]] && log_info "Restored: $rel_path"
234
249
  fi
235
250
  done < <(find "$backup_path" -type f -print0)
@@ -237,6 +252,30 @@ perform_rollback() {
237
252
  if [[ "$dry_run" != "1" ]]; then
238
253
  log_success "Rollback complete: $restored file(s) restored"
239
254
  persist_log "ROLLBACK: from $(basename "$backup_path"), $restored files restored"
255
+ dot_log info "rollback_end" "files=$restored" "backup=$(basename "$backup_path")"
256
+
257
+ # AI-Driven Analysis of the failure
258
+ if command -v dot >/dev/null 2>&1 && [[ "${DOTFILES_AI:-0}" == "1" ]]; then
259
+ log_step "AI Root-Cause Analysis"
260
+ local drift
261
+ drift=$(chezmoi status 2>/dev/null || true)
262
+ local last_log=""
263
+ if cd "$DOTFILES_SOURCE" 2>/dev/null; then
264
+ last_log=$(git log -n 5 --oneline 2>/dev/null || true)
265
+ fi
266
+
267
+ local ai_prompt
268
+ ai_prompt="System rollback was triggered from $(basename "$backup_path").
269
+ Recent Git History:
270
+ $last_log
271
+
272
+ Current Drift after rollback:
273
+ $drift
274
+
275
+ Analyze why the environment may have reached a state requiring rollback and suggest architectural hardening steps."
276
+
277
+ dot cl --pattern hardener "$ai_prompt" || true
278
+ fi
240
279
  fi
241
280
  }
242
281
 
@@ -265,7 +304,7 @@ git_reset() {
265
304
  git stash push -m "Auto-stash before rollback $(date +%Y%m%d_%H%M%S)"
266
305
  log_success "Changes auto-stashed (use 'git stash pop' to recover)"
267
306
  else
268
- read -rp "Stash changes? [y/N] " response
307
+ read -t 30 -rp "Stash changes? [y/N] " response || response="N"
269
308
  if [[ "$response" =~ ^[Yy]$ ]]; then
270
309
  git stash push -m "Auto-stash before rollback $(date +%Y%m%d_%H%M%S)"
271
310
  log_success "Changes stashed"
@@ -327,9 +366,11 @@ restore_file() {
327
366
 
328
367
  local source_file="$backup/$file_path"
329
368
 
369
+ # shellcheck disable=SC1091
330
370
  # Verify resolved source path stays within the backup directory
331
371
  local resolved_source
332
372
  resolved_source="$(cd "$(dirname "$source_file")" 2>/dev/null && pwd)/$(basename "$source_file")" || {
373
+ # shellcheck disable=SC1091
333
374
  log_error "Cannot resolve source path: $source_file"
334
375
  return 1
335
376
  }
@@ -434,6 +475,11 @@ main() {
434
475
  local command="${1:-status}"
435
476
  shift || true
436
477
 
478
+ if [[ "$command" == "help" ]]; then
479
+ usage
480
+ exit 0
481
+ fi
482
+
437
483
  # Parse global options
438
484
  while [[ $# -gt 0 ]]; do
439
485
  case "$1" in
@@ -459,6 +505,18 @@ main() {
459
505
 
460
506
  ensure_dirs
461
507
 
508
+ # Concurrency guard
509
+ LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/dotfiles-rollback.lock"
510
+ if command -v flock >/dev/null 2>&1; then
511
+ exec 9>"$LOCK_FILE"
512
+ if ! flock -n 9; then
513
+ ui_warn "Already running" "Another rollback instance is active"
514
+ exit 0
515
+ fi
516
+ fi
517
+
518
+ dot_log info "rollback_start" "command=$command"
519
+
462
520
  case "$command" in
463
521
  status)
464
522
  show_status
@@ -474,7 +532,7 @@ main() {
474
532
  exit 1
475
533
  fi
476
534
  if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
477
- read -rp "Rollback to $(basename "$latest")? [y/N] " response
535
+ read -t 30 -rp "Rollback to $(basename "$latest")? [y/N] " response || response="N"
478
536
  [[ ! "$response" =~ ^[Yy]$ ]] && exit 0
479
537
  fi
480
538
  perform_rollback "$latest" "$DRY_RUN"
@@ -492,14 +550,14 @@ main() {
492
550
  exit 1
493
551
  fi
494
552
  if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
495
- read -rp "Rollback to $(basename "$backup")? [y/N] " response
553
+ read -t 30 -rp "Rollback to $(basename "$backup")? [y/N] " response || response="N"
496
554
  [[ ! "$response" =~ ^[Yy]$ ]] && exit 0
497
555
  fi
498
556
  perform_rollback "$backup" "$DRY_RUN"
499
557
  ;;
500
558
  git-reset)
501
559
  if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
502
- read -rp "Reset to last known good commit? [y/N] " response
560
+ read -t 30 -rp "Reset to last known good commit? [y/N] " response || response="N"
503
561
  [[ ! "$response" =~ ^[Yy]$ ]] && exit 0
504
562
  fi
505
563
  git_reset "$DRY_RUN"