@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,168 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # dot manual — open or download the dotfiles manual in multiple formats.
4
+ #
5
+ # Usage:
6
+ # dot manual # open HTML manual in browser
7
+ # dot manual html # alias of no-arg
8
+ # dot manual pdf # download + open PDF
9
+ # dot manual epub # download + open EPUB
10
+ # dot manual text # pipe ASCII text to pager
11
+ # dot manual markdown # pipe Markdown source to pager
12
+ # dot manual download <fmt> # save to current directory
13
+ # dot manual --offline # use bundled offline copy
14
+ # dot manual --local # use locally-built _build/manual/
15
+
16
+ set -euo pipefail
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ # shellcheck source=../lib/utils.sh
20
+ source "$SCRIPT_DIR/../lib/utils.sh"
21
+
22
+ MANUAL_URL="${DOTFILES_MANUAL_URL:-https://sebastienrousseau.github.io/dotfiles/manual}"
23
+ CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/manual"
24
+ OFFLINE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/manual"
25
+
26
+ MODE="open"
27
+ FORMAT="html"
28
+ USE_LOCAL=false
29
+ USE_OFFLINE=false
30
+
31
+ for arg in "$@"; do
32
+ case "$arg" in
33
+ html | html-multi | pdf | epub | text | markdown) FORMAT="$arg" ;;
34
+ download) MODE="download" ;;
35
+ --offline) USE_OFFLINE=true ;;
36
+ --local) USE_LOCAL=true ;;
37
+ --url=*) MANUAL_URL="${arg#*=}" ;;
38
+ --help | -h)
39
+ sed -n 's/^# //p;s/^#$//p' "$0" | head -20
40
+ exit 0
41
+ ;;
42
+ esac
43
+ done
44
+
45
+ format_file() {
46
+ case "$1" in
47
+ html) echo "dotfiles.html" ;;
48
+ html-multi) echo "html/index.html" ;;
49
+ pdf) echo "dotfiles.pdf" ;;
50
+ epub) echo "dotfiles.epub" ;;
51
+ text) echo "dotfiles.txt" ;;
52
+ markdown) echo "dotfiles-md.tar.gz" ;;
53
+ *) return 1 ;;
54
+ esac
55
+ }
56
+
57
+ resolve_source() {
58
+ local fmt="$1"
59
+ local fname
60
+ fname="$(format_file "$fmt")"
61
+
62
+ if $USE_LOCAL; then
63
+ local src_dir
64
+ src_dir="$(require_source_dir)/_build/manual"
65
+ if [[ -f "$src_dir/$fname" ]]; then
66
+ echo "$src_dir/$fname"
67
+ return 0
68
+ fi
69
+ ui_err "manual" "local build not found at $src_dir/$fname — run bash scripts/docs/build-manual.sh"
70
+ return 1
71
+ fi
72
+
73
+ if $USE_OFFLINE; then
74
+ if [[ -f "$OFFLINE_DIR/$fname" ]]; then
75
+ echo "$OFFLINE_DIR/$fname"
76
+ return 0
77
+ fi
78
+ ui_err "manual" "offline copy not found at $OFFLINE_DIR/$fname"
79
+ return 1
80
+ fi
81
+
82
+ local cache_path="$CACHE_DIR/$fname"
83
+ if [[ ! -f "$cache_path" ]] || [[ $(find "$cache_path" -mtime +7 -print 2>/dev/null | wc -l) -gt 0 ]]; then
84
+ mkdir -p "$(dirname "$cache_path")"
85
+ local url="$MANUAL_URL/$fname"
86
+ ui_info "manual" "fetching $url"
87
+ if ! curl -fsSL "$url" -o "$cache_path"; then
88
+ ui_err "manual" "failed to download $url"
89
+ return 1
90
+ fi
91
+ fi
92
+ echo "$cache_path"
93
+ }
94
+
95
+ open_file() {
96
+ local path="$1"
97
+ case "$(uname -s)" in
98
+ Darwin)
99
+ # Use the system open explicitly — ~/.local/bin/open is a wrapper
100
+ # that would recurse on itself.
101
+ /usr/bin/open "$path"
102
+ ;;
103
+ Linux)
104
+ if command -v xdg-open &>/dev/null; then
105
+ xdg-open "$path"
106
+ elif command -v gio &>/dev/null; then
107
+ gio open "$path"
108
+ else
109
+ ui_err "manual" "no opener found (xdg-open, gio); use file://$path"
110
+ return 1
111
+ fi
112
+ ;;
113
+ *)
114
+ ui_info "manual" "saved to: $path"
115
+ ;;
116
+ esac
117
+ }
118
+
119
+ cmd_open() {
120
+ local path
121
+ path="$(resolve_source "$FORMAT")"
122
+ [[ -z "$path" ]] && exit 1
123
+
124
+ case "$FORMAT" in
125
+ text)
126
+ ${PAGER:-less} "$path"
127
+ ;;
128
+ markdown)
129
+ local tmpdir
130
+ tmpdir="$(mktemp -d)"
131
+ tar -xzf "$path" -C "$tmpdir"
132
+ ui_info "manual" "Markdown source extracted to: $tmpdir"
133
+ open_file "$tmpdir" 2>/dev/null || true
134
+ ;;
135
+ html)
136
+ if ! $USE_LOCAL && ! $USE_OFFLINE; then
137
+ open_file "$MANUAL_URL/"
138
+ else
139
+ open_file "$path"
140
+ fi
141
+ ;;
142
+ html-multi)
143
+ if ! $USE_LOCAL && ! $USE_OFFLINE; then
144
+ open_file "$MANUAL_URL/html/"
145
+ else
146
+ open_file "$path"
147
+ fi
148
+ ;;
149
+ *)
150
+ open_file "$path"
151
+ ;;
152
+ esac
153
+ }
154
+
155
+ cmd_download() {
156
+ local path
157
+ path="$(resolve_source "$FORMAT")"
158
+ [[ -z "$path" ]] && exit 1
159
+ local dest
160
+ dest="./$(basename "$path")"
161
+ cp "$path" "$dest"
162
+ ui_ok "manual" "saved: $dest"
163
+ }
164
+
165
+ case "$MODE" in
166
+ open) cmd_open ;;
167
+ download) cmd_download ;;
168
+ esac
@@ -1,46 +1,87 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # Dotfiles CLI - Meta Commands
3
- # upgrade, docs, learn, keys, sandbox
4
+ # upgrade, prewarm, docs, learn, keys, sandbox, mcp, mode, agent
4
5
 
5
6
  set -euo pipefail
6
7
 
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ _META_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
9
  # shellcheck source=../lib/utils.sh
9
- source "$SCRIPT_DIR/../lib/utils.sh"
10
+ source "$_META_DIR/../lib/utils.sh"
11
+ # shellcheck source=../lib/log.sh
12
+ source "$_META_DIR/../lib/log.sh"
13
+ # shellcheck source=agent.sh
14
+ source "$_META_DIR/agent.sh"
15
+
16
+ meta_banner_section() {
17
+ case "${1:-}" in
18
+ mcp | mode | agent)
19
+ printf '%s\n' "AI and Agents"
20
+ ;;
21
+ docs | keys | learn | search | help | version)
22
+ printf '%s\n' "Reference"
23
+ ;;
24
+ *)
25
+ printf '%s\n' "Meta"
26
+ ;;
27
+ esac
28
+ }
29
+
30
+ dot_ui_command_banner "$(meta_banner_section "${1:-}")" "${1:-}" "$@"
10
31
 
11
32
  cmd_upgrade() {
12
33
  local src_dir
13
34
  src_dir="$(require_source_dir)"
14
35
 
15
36
  if [ -f "$src_dir/nix/flake.nix" ] && has_command nix; then
16
- echo "Updating Nix flake..."
37
+ ui_info "Updating Nix flake"
17
38
  (cd "$src_dir" && nix flake update) || true
18
- echo "Running Nix garbage collection..."
39
+ ui_info "Running Nix garbage collection"
19
40
  nix-collect-garbage -d || true
20
41
  fi
21
42
 
22
- echo "Updating dotfiles..."
43
+ ui_info "Updating dotfiles"
23
44
  chezmoi update || true
24
45
 
25
46
  if has_command nvim; then
26
- echo "Updating Neovim plugins..."
47
+ ui_info "Updating Neovim plugins"
27
48
  nvim --headless "+Lazy! sync" +qa || true
28
49
  fi
29
50
 
30
51
  if [ "${DOTFILES_FONTS:-}" = "1" ]; then
31
52
  if [ -f "$src_dir/scripts/fonts/install-nerd-fonts.sh" ]; then
32
- echo "Installing Nerd Fonts..."
53
+ ui_info "Installing Nerd Fonts"
33
54
  sh "$src_dir/scripts/fonts/install-nerd-fonts.sh"
34
55
  fi
35
56
  fi
36
57
  }
37
58
 
59
+ cmd_prewarm() {
60
+ local src_dir
61
+ # Clear caches first
62
+ ui_info "Cache" "Clearing shell initialization caches"
63
+ local cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}"
64
+ rm -rf "$cache_dir/zsh"/*-init.zsh "$cache_dir/zsh"/*.zwc 2>/dev/null || true
65
+ rm -rf "$cache_dir/bash"/*-init.bash 2>/dev/null || true
66
+ rm -rf "$cache_dir/fish"/*-init.fish 2>/dev/null || true
67
+ rm -rf "$cache_dir/nushell"/*.nu 2>/dev/null || true
68
+ ui_info "Cache" "Cleared. Regenerating..."
69
+ src_dir="$(resolve_source_dir)"
70
+ if [ -n "$src_dir" ] && [ -f "$src_dir/scripts/ops/prewarm.sh" ]; then
71
+ bash "$src_dir/scripts/ops/prewarm.sh"
72
+ fi
73
+ }
74
+
38
75
  cmd_docs() {
39
76
  local src_dir
40
77
  src_dir="$(resolve_source_dir)"
41
78
 
42
79
  if [ -n "$src_dir" ] && [ -f "$src_dir/README.md" ]; then
43
- exec cat "$src_dir/README.md"
80
+ if has_command glow; then
81
+ glow "$src_dir/README.md"
82
+ else
83
+ exec cat "$src_dir/README.md"
84
+ fi
44
85
  else
45
86
  die "README not found."
46
87
  fi
@@ -52,22 +93,50 @@ cmd_learn() {
52
93
  if [ -f "$dot_bin/executable_tour" ]; then
53
94
  exec bash "$dot_bin/executable_tour" "$@"
54
95
  fi
55
- # Fallback to PATH
56
- exec tour "$@"
96
+ # Fallback to ops script
97
+ run_script "scripts/ops/tour.sh" "Tour script" "$@"
57
98
  }
58
99
 
59
100
  cmd_keys() {
60
101
  local src_dir
61
102
  src_dir="$(resolve_source_dir)"
62
103
 
104
+ if [[ "${1:-}" == "sign-check" ]]; then
105
+ ui_header "Git Signing Status"
106
+ local signing_key="" format="" key_file=""
107
+ signing_key="$(git config --global user.signingkey 2>/dev/null || true)"
108
+ format="$(git config --global gpg.format 2>/dev/null || true)"
109
+ if [[ -z "$signing_key" ]]; then
110
+ ui_warn "No signing key configured (git config --global user.signingkey)"
111
+ else
112
+ ui_info "Key" "$signing_key"
113
+ ui_info "Format" "${format:-gpg}"
114
+ if [[ "$format" == "ssh" ]]; then
115
+ key_file="${signing_key/#\~/$HOME}"
116
+ if [[ -f "$key_file" ]]; then
117
+ ui_info "Status" "SSH key file exists: $key_file"
118
+ else
119
+ ui_warn "SSH key file not found: $key_file"
120
+ fi
121
+ else
122
+ if has_command gpg && gpg --list-keys "$signing_key" >/dev/null 2>&1; then
123
+ ui_info "Status" "GPG key found in keyring"
124
+ else
125
+ ui_warn "GPG key not found in keyring: $signing_key"
126
+ fi
127
+ fi
128
+ fi
129
+ return 0
130
+ fi
131
+
63
132
  if [ -n "$src_dir" ] && [ -f "$src_dir/docs/KEYS.md" ]; then
64
- if [ -n "$1" ]; then
65
- rg -i --fixed-strings --context 1 "$1" "$src_dir/docs/KEYS.md" || true
133
+ if [ -n "${1:-}" ]; then
134
+ rg -i --fixed-strings --context 1 "${1:-}" "$src_dir/docs/KEYS.md" || true
66
135
  else
67
136
  exec cat "$src_dir/docs/KEYS.md"
68
137
  fi
69
138
  else
70
- die "Keybindings catalog not found."
139
+ run_script "scripts/diagnostics/keys.sh" "Keys script" "$@"
71
140
  fi
72
141
  }
73
142
 
@@ -76,11 +145,11 @@ cmd_sandbox() {
76
145
  src_dir="$(require_source_dir)"
77
146
 
78
147
  if has_command docker; then
79
- echo "Launching sandbox via Docker..."
148
+ ui_info "Launching sandbox via Docker"
80
149
  docker build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
81
150
  exec docker run --rm -it dotfiles-sandbox
82
151
  elif has_command podman; then
83
- echo "Launching sandbox via Podman..."
152
+ ui_info "Launching sandbox via Podman"
84
153
  podman build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
85
154
  exec podman run --rm -it dotfiles-sandbox
86
155
  else
@@ -88,12 +157,66 @@ cmd_sandbox() {
88
157
  fi
89
158
  }
90
159
 
91
- # Dispatch
160
+ cmd_mcp() {
161
+ local subcommand="${1:-doctor}"
162
+ if [[ "${1:-}" == --* ]] || [[ "${1:-}" == -* ]] || [[ -z "${1:-}" ]]; then
163
+ subcommand="doctor"
164
+ else
165
+ shift || true
166
+ fi
167
+ case "$subcommand" in
168
+ doctor)
169
+ if [[ "${1:-}" == "doctor" ]]; then
170
+ shift || true
171
+ fi
172
+ run_script "scripts/diagnostics/mcp-doctor.sh" "MCP doctor script" "$@"
173
+ ;;
174
+ registry)
175
+ local repo_root registry_file json_mode=0
176
+ repo_root="$(require_source_dir)"
177
+ registry_file="${MCP_REGISTRY_CONFIG:-$repo_root/dot_config/dotfiles/mcp-registry.json}"
178
+ if [[ "${1:-}" == "registry" ]]; then
179
+ shift || true
180
+ fi
181
+ if [[ "${1:-}" == "--json" || "${1:-}" == "-j" ]]; then
182
+ json_mode=1
183
+ fi
184
+ if [[ ! -f "$registry_file" ]]; then
185
+ die "MCP registry not found: $registry_file"
186
+ fi
187
+ if [[ "$json_mode" -eq 1 ]]; then
188
+ exec cat "$registry_file"
189
+ fi
190
+ if command -v jq >/dev/null 2>&1; then
191
+ ui_header "MCP Registry"
192
+ jq -r '
193
+ .servers
194
+ | to_entries[]
195
+ | "\(.key)\t\(.value.transport)\t\(.value.launcher)\t\(.value.package // .value.url // "local")"
196
+ ' "$registry_file" | while IFS=$'\t' read -r name transport launcher target; do
197
+ ui_ok "$name" "$transport via $launcher -> $target"
198
+ done
199
+ else
200
+ exec cat "$registry_file"
201
+ fi
202
+ ;;
203
+ *)
204
+ echo "Usage: dot mcp [doctor|registry]" >&2
205
+ exit 1
206
+ ;;
207
+ esac
208
+ }
209
+
210
+ # Dispatch — cmd_mode is defined in agent.sh (sourced above)
92
211
  case "${1:-}" in
93
212
  upgrade)
94
213
  shift
95
214
  cmd_upgrade "$@"
96
215
  ;;
216
+ cache-refresh | prewarm)
217
+ shift
218
+ cmd_prewarm "$@"
219
+ ;;
97
220
  docs)
98
221
  shift
99
222
  cmd_docs "$@"
@@ -110,6 +233,14 @@ case "${1:-}" in
110
233
  shift
111
234
  cmd_sandbox "$@"
112
235
  ;;
236
+ mcp)
237
+ shift
238
+ cmd_mcp "$@"
239
+ ;;
240
+ mode | agent)
241
+ shift
242
+ cmd_mode "$@"
243
+ ;;
113
244
  *)
114
245
  echo "Unknown meta command: ${1:-}" >&2
115
246
  exit 1
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # AI Steering Patterns Management.
4
+ # Usage: dot patterns [list|view|edit] [name]
5
+
6
+ set -euo pipefail
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ # shellcheck source=../lib/utils.sh
10
+ source "$SCRIPT_DIR/../lib/utils.sh"
11
+
12
+ PATTERN_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/ai/patterns"
13
+ mkdir -p "$PATTERN_DIR"
14
+
15
+ command="${1:-list}"
16
+ name="${2:-}"
17
+
18
+ case "$command" in
19
+ list)
20
+ ui_header "AI Steering Patterns"
21
+ ls -1 "$PATTERN_DIR" | sed 's/\.md$//' | while read -r p; do
22
+ ui_bullet "$p"
23
+ done
24
+ ;;
25
+ view)
26
+ if [[ -z "$name" ]]; then
27
+ ui_err "Missing pattern name" "Usage: dot patterns view <name>"
28
+ exit 1
29
+ fi
30
+ pattern_file="$PATTERN_DIR/${name}.md"
31
+ if [[ -f "$pattern_file" ]]; then
32
+ ui_header "Pattern: $name"
33
+ if has_command glow; then
34
+ glow "$pattern_file"
35
+ else
36
+ cat "$pattern_file"
37
+ fi
38
+ else
39
+ ui_err "Pattern not found" "$name"
40
+ fi
41
+ ;;
42
+ edit)
43
+ if [[ -z "$name" ]]; then
44
+ ui_err "Missing pattern name" "Usage: dot patterns edit <name>"
45
+ exit 1
46
+ fi
47
+ pattern_file="$PATTERN_DIR/${name}.md"
48
+ ${EDITOR:-nvim} "$pattern_file"
49
+ ;;
50
+ *)
51
+ echo "Usage: dot patterns [list|view|edit] [name]"
52
+ exit 1
53
+ ;;
54
+ esac
@@ -1,34 +1,31 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # dot restore - Restore dotfiles from backup or previous state
3
- # Usage: dot restore [--list|--latest|<backup-id>]
4
+ # Usage: dot restore [--list|-l|--latest|-L|<backup-id>]
4
5
 
5
6
  set -euo pipefail
6
7
 
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ # shellcheck source=../lib/utils.sh
10
+ source "$SCRIPT_DIR/../lib/utils.sh"
11
+ # shellcheck source=../lib/log.sh
12
+ source "$SCRIPT_DIR/../lib/log.sh"
13
+
7
14
  DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}"
8
15
  BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
9
16
  CHEZMOI_SOURCE="${HOME}/.local/share/chezmoi"
10
17
 
11
- # Colors
12
- RED='\033[0;31m'
13
- GREEN='\033[0;32m'
14
- YELLOW='\033[1;33m'
15
- BLUE='\033[0;34m'
16
- NC='\033[0m'
17
-
18
- log_info() { echo -e "${BLUE}[INFO]${NC} $*"; }
19
- log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
20
- log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
21
- log_success() { echo -e "${GREEN}[OK]${NC} $*"; }
18
+ ui_init
22
19
 
23
20
  usage() {
24
21
  echo "Usage: dot restore [OPTIONS]"
25
22
  echo ""
26
23
  echo "Options:"
27
24
  echo " --list, -l List available backups"
28
- echo " --latest Restore from latest backup"
29
- echo " --git <ref> Restore from git ref (commit, tag, branch)"
30
- echo " --diff <ref> Show diff between current and ref"
31
- echo " --dry-run Show what would be restored"
25
+ echo " --latest, -L Restore from latest backup"
26
+ echo " --git, -g <ref> Restore from git ref (commit, tag, branch)"
27
+ echo " --diff, -d <ref> Show diff between current and ref"
28
+ echo " --dry-run, -n Show what would be restored"
32
29
  echo " -h, --help Show this help"
33
30
  echo ""
34
31
  echo "Examples:"
@@ -44,15 +41,16 @@ list_backups() {
44
41
  return 1
45
42
  fi
46
43
 
47
- echo -e "${BLUE}Available Backups:${NC}"
44
+ ui_header "Available Backups"
48
45
  echo "─────────────────────────────────────────"
49
46
 
50
- find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup-*" -printf "%T@ %f\n" 2>/dev/null | sort -rn | cut -d' ' -f2- | while read -r backup; do
47
+ while IFS= read -r backup; do
51
48
  echo " $backup"
52
- done
49
+ done < <(list_backup_names)
53
50
 
54
51
  echo ""
55
- echo -e "${BLUE}Git History (last 10):${NC}"
52
+ echo ""
53
+ ui_header "Git History (last 10)"
56
54
  echo "─────────────────────────────────────────"
57
55
 
58
56
  if [[ -d "$DOTFILES_DIR/.git" ]]; then
@@ -92,7 +90,7 @@ restore_from_git() {
92
90
  log_success "Restored from $ref"
93
91
 
94
92
  # Re-apply chezmoi
95
- if command -v chezmoi >/dev/null 2>&1; then
93
+ if has_command chezmoi; then
96
94
  log_info "Re-applying chezmoi..."
97
95
  chezmoi apply
98
96
  fi
@@ -118,6 +116,7 @@ create_backup() {
118
116
  local backup_name
119
117
  backup_name="backup-$(date +%Y%m%d_%H%M%S)"
120
118
  local backup_path="$BACKUP_DIR/$backup_name"
119
+ local rel_path
121
120
 
122
121
  mkdir -p "$backup_path"
123
122
 
@@ -134,7 +133,9 @@ create_backup() {
134
133
 
135
134
  for f in "${files_to_backup[@]}"; do
136
135
  if [[ -e "$f" ]]; then
137
- cp -r "$f" "$backup_path/" 2>/dev/null || true
136
+ rel_path="${f#"$HOME"/}"
137
+ mkdir -p "$backup_path/$(dirname "$rel_path")"
138
+ cp -r "$f" "$backup_path/$rel_path" 2>/dev/null || true
138
139
  fi
139
140
  done
140
141
 
@@ -148,7 +149,7 @@ restore_latest() {
148
149
  fi
149
150
 
150
151
  local latest
151
- latest=$(find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup-*" -printf "%T@ %f\n" 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-)
152
+ latest=$(list_backup_names | head -1)
152
153
 
153
154
  if [[ -z "$latest" ]]; then
154
155
  log_error "No backups found"
@@ -158,14 +159,35 @@ restore_latest() {
158
159
  log_info "Restoring from: $latest"
159
160
 
160
161
  local backup_path="$BACKUP_DIR/$latest"
161
- local target
162
- for item in "$backup_path"/*; do
163
- if [[ -e "$item" ]]; then
164
- target="$HOME/$(basename "$item")"
165
- cp -r "$item" "$target"
166
- log_success "Restored: $(basename "$item")"
167
- fi
168
- done
162
+ local item rel_path target
163
+ while IFS= read -r -d '' item; do
164
+ rel_path="${item#"$backup_path"/}"
165
+ target="$HOME/$rel_path"
166
+ mkdir -p "$(dirname "$target")"
167
+ cp -r "$item" "$target"
168
+ log_success "Restored: $rel_path"
169
+ done < <(find "$backup_path" -mindepth 1 -maxdepth 1 -print0)
170
+ }
171
+
172
+ list_backup_names() {
173
+ local backup_path
174
+
175
+ shopt -s nullglob
176
+ for backup_path in "$BACKUP_DIR"/backup-*; do
177
+ [[ -d "$backup_path" ]] || continue
178
+ printf '%s\n' "${backup_path##*/}"
179
+ done | while IFS= read -r backup_name; do
180
+ printf '%s\t%s\n' "$(portable_mtime "$BACKUP_DIR/$backup_name")" "$backup_name"
181
+ done | sort -rn | cut -f2-
182
+ shopt -u nullglob
183
+ }
184
+
185
+ portable_mtime() {
186
+ if stat -c %Y "$1" >/dev/null 2>&1; then
187
+ stat -c %Y "$1"
188
+ else
189
+ stat -f %m "$1"
190
+ fi
169
191
  }
170
192
 
171
193
  # Parse arguments
@@ -177,19 +199,19 @@ while [[ $# -gt 0 ]]; do
177
199
  list_backups
178
200
  exit 0
179
201
  ;;
180
- --latest)
202
+ --latest | -L)
181
203
  restore_latest
182
204
  exit 0
183
205
  ;;
184
- --git)
206
+ --git | -g)
185
207
  restore_from_git "$2" "$DRY_RUN"
186
208
  exit 0
187
209
  ;;
188
- --diff)
210
+ --diff | -d)
189
211
  show_diff "$2"
190
212
  exit 0
191
213
  ;;
192
- --dry-run)
214
+ --dry-run | -n)
193
215
  DRY_RUN=true
194
216
  shift
195
217
  ;;