@sebastienrousseau/dotfiles 0.2.499 → 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 (538) hide show
  1. package/CHANGELOG.md +375 -0
  2. package/LICENSE +1283 -0
  3. package/README.md +284 -0
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +4 -3
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +78 -0
  9. package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
  10. package/docs/adr/ADR-002-shell-performance.md +121 -0
  11. package/docs/adr/ADR-003-security-first.md +140 -0
  12. package/docs/adr/ADR-004-cli-architecture.md +157 -0
  13. package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
  14. package/docs/adr/ADR-006-shell-selection.md +115 -0
  15. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  16. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  17. package/docs/adr/README.md +32 -0
  18. package/docs/architecture/ARCHITECTURE.md +113 -0
  19. package/docs/architecture/INTEROP.md +36 -0
  20. package/docs/architecture/REPO_LAYOUT.md +237 -0
  21. package/docs/architecture/WALKTHROUGH.md +82 -0
  22. package/docs/architecture/fleet-deployment.md +73 -0
  23. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  24. package/docs/archive/LEGACY_ROADMAP.md +142 -0
  25. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  26. package/docs/{PLAN.md → archive/PLAN.md} +4 -4
  27. package/docs/archive/REPO_AUDIT.md +23 -0
  28. package/docs/guides/INSTALL.md +140 -0
  29. package/docs/guides/NEOVIM_IDE_GUIDE.md +52 -0
  30. package/docs/guides/THEMING.md +222 -0
  31. package/docs/guides/TROUBLESHOOTING.md +148 -0
  32. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +723 -0
  33. package/docs/index.md +39 -0
  34. package/docs/interop/A2A.md +32 -0
  35. package/docs/manual/00-introduction.md +85 -0
  36. package/docs/manual/01-concepts/01-architecture.md +134 -0
  37. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  38. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  39. package/docs/manual/01-concepts/04-fleet.md +142 -0
  40. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  41. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  42. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  43. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  44. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  45. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  46. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  47. package/docs/manual/03-reference/02-config-files.md +259 -0
  48. package/docs/manual/03-reference/03-environment.md +120 -0
  49. package/docs/manual/03-reference/04-templates.md +184 -0
  50. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  51. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  52. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  53. package/docs/manual/04-cookbook/03-faq.md +167 -0
  54. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  55. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  56. package/docs/manual/05-appendices/C-glossary.md +36 -0
  57. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  58. package/docs/manual/05-appendices/E-license.md +34 -0
  59. package/docs/manual/_toc.yml +58 -0
  60. package/docs/manual/command-index.md +58 -0
  61. package/docs/manual/concept-index.md +164 -0
  62. package/docs/operations/ATTESTATION.md +39 -0
  63. package/docs/operations/MAINTENANCE.md +59 -0
  64. package/docs/operations/MIGRATION.md +101 -0
  65. package/docs/operations/OPERATIONS.md +164 -0
  66. package/docs/operations/RELIABILITY.md +116 -0
  67. package/docs/{ROADMAP.md → operations/ROADMAP.md} +22 -22
  68. package/docs/operations/TESTING.md +195 -0
  69. package/docs/operations/TRACEABILITY.md +31 -0
  70. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  71. package/docs/operations/VERSION_SYNC.md +344 -0
  72. package/docs/reference/ALIASES.md +124 -0
  73. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  74. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  75. package/docs/reference/FEATURES.md +62 -0
  76. package/docs/reference/FONTS.md +108 -0
  77. package/docs/reference/PROFILES.md +65 -0
  78. package/docs/reference/SCREENSHOTS.md +117 -0
  79. package/docs/reference/SCRIPTS.md +67 -0
  80. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  81. package/docs/reference/THEMES.md +113 -0
  82. package/docs/reference/TOOLS.md +105 -0
  83. package/docs/reference/UTILS.md +151 -0
  84. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  85. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  86. package/docs/security/COMPLIANCE.md +453 -0
  87. package/docs/security/ENCRYPTION.md +52 -0
  88. package/docs/security/FMEA.md +155 -0
  89. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  90. package/docs/security/KEYS.md +45 -0
  91. package/docs/security/KEY_ROTATION.md +219 -0
  92. package/docs/security/MCP_POLICY.md +69 -0
  93. package/docs/security/POLICY_RELEASES.md +33 -0
  94. package/docs/security/README.md +24 -0
  95. package/docs/security/SECRETS.md +146 -0
  96. package/docs/security/SECURITY.md +41 -0
  97. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  98. package/docs/security/SOUP_REGISTER.md +32 -0
  99. package/docs/security/THREAT_MODEL.md +120 -0
  100. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  101. package/docs/themes/README.md +6 -0
  102. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  103. package/docs/themes/hero-shot.svg +78 -0
  104. package/dot_config/.module-manifest.json +69 -0
  105. package/dot_config/ai/identity.md +20 -0
  106. package/dot_config/ai/patterns/architect.md +14 -0
  107. package/dot_config/ai/patterns/hardener.md +13 -0
  108. package/dot_config/ai/patterns/refactor.md +13 -0
  109. package/dot_config/aider/aider.conf.yml +32 -0
  110. package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
  111. package/dot_config/ansible/ansible.cfg +11 -0
  112. package/dot_config/atuin/config.toml +40 -0
  113. package/dot_config/bat/config +23 -0
  114. package/dot_config/brave-flags.conf.tmpl +7 -0
  115. package/dot_config/btop/btop.conf +16 -0
  116. package/dot_config/btop/themes/tokyonight.theme +34 -0
  117. package/dot_config/bun/bunfig.toml.tmpl +33 -0
  118. package/dot_config/claude/mcp_servers.json +20 -0
  119. package/dot_config/containers/containers.conf +14 -0
  120. package/dot_config/curl/dot_curlrc +18 -0
  121. package/dot_config/dlv/config.yml +39 -0
  122. package/dot_config/docker/config.json +15 -0
  123. package/dot_config/dotfiles/agent-card.json +29 -0
  124. package/dot_config/dotfiles/agent-profiles.json +92 -0
  125. package/dot_config/dotfiles/boot/README.md +11 -0
  126. package/dot_config/dotfiles/grub/README.md +11 -0
  127. package/dot_config/dotfiles/lock/README.md +11 -0
  128. package/dot_config/dotfiles/mcp-lock.json +33 -0
  129. package/dot_config/dotfiles/mcp-policy.json +52 -0
  130. package/dot_config/dotfiles/mcp-registry.json +47 -0
  131. package/dot_config/dotfiles/model-registry.json +20 -0
  132. package/dot_config/dotfiles/policy-bundles.json +38 -0
  133. package/dot_config/dotfiles/prompt-registry.json +16 -0
  134. package/dot_config/dotfiles/versions.env +18 -0
  135. package/dot_config/duf/duf.conf +6 -0
  136. package/dot_config/duti/defaults.duti +5 -0
  137. package/dot_config/emoji/emoji.txt +34 -0
  138. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  139. package/dot_config/environment.d/90-wayland.conf +19 -0
  140. package/dot_config/fastfetch/config.jsonc +28 -0
  141. package/dot_config/firefox/user.js.tmpl +58 -0
  142. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  143. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  144. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  145. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  146. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  147. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  148. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  149. package/dot_config/fish/config.fish.tmpl +44 -0
  150. package/dot_config/fish/fish_plugins +1 -0
  151. package/dot_config/fish/functions/_.fish +3 -0
  152. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  153. package/dot_config/fish/functions/als.fish +46 -0
  154. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  155. package/dot_config/fish/functions/c.fish +3 -0
  156. package/dot_config/fish/functions/cat.fish +9 -0
  157. package/dot_config/fish/functions/d.fish +7 -0
  158. package/dot_config/fish/functions/dot.fish +34 -0
  159. package/dot_config/fish/functions/h.fish +3 -0
  160. package/dot_config/fish/functions/l.fish +7 -0
  161. package/dot_config/fish/functions/la.fish +7 -0
  162. package/dot_config/fish/functions/ll.fish +7 -0
  163. package/dot_config/fish/functions/log_error.fish +13 -0
  164. package/dot_config/fish/functions/log_info.fish +13 -0
  165. package/dot_config/fish/functions/lr.fish +7 -0
  166. package/dot_config/fish/functions/lra.fish +7 -0
  167. package/dot_config/fish/functions/ls.fish +7 -0
  168. package/dot_config/fish/functions/lt.fish +7 -0
  169. package/dot_config/fish/functions/lta.fish +7 -0
  170. package/dot_config/fish/functions/notify-run.fish +11 -0
  171. package/dot_config/fish/functions/q.fish +3 -0
  172. package/dot_config/fish/functions/silent-run.fish +7 -0
  173. package/dot_config/fish/functions/yy.fish +8 -0
  174. package/dot_config/flatpak/flatpak.list +4 -0
  175. package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
  176. package/dot_config/foot/foot.ini.tmpl +33 -0
  177. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  178. package/dot_config/fzf/fzf.zsh +48 -0
  179. package/dot_config/gem/gemrc +9 -0
  180. package/dot_config/gh/config.yml +12 -0
  181. package/dot_config/ghostty/config.tmpl +165 -0
  182. package/dot_config/git/allowed_signers.tmpl +18 -0
  183. package/dot_config/git/attributes +12 -0
  184. package/dot_config/git/commit-template +10 -0
  185. package/dot_config/git/ignore +27 -0
  186. package/dot_config/gnupg/gpg-agent.conf +11 -0
  187. package/dot_config/go/golangci.yml +118 -0
  188. package/dot_config/go/gopls.json +30 -0
  189. package/dot_config/goose/config.yaml +29 -0
  190. package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
  191. package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
  192. package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
  193. package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
  194. package/dot_config/htop/htoprc +20 -0
  195. package/dot_config/inputrc +2 -0
  196. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  197. package/dot_config/just/justfile +122 -0
  198. package/dot_config/k9s/config.yaml +65 -0
  199. package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
  200. package/dot_config/kanshi/config.tmpl +22 -0
  201. package/dot_config/karabiner/karabiner.json +14 -0
  202. package/dot_config/kitty/kitty.conf.tmpl +53 -0
  203. package/dot_config/lazydocker/config.yml +186 -0
  204. package/dot_config/lazygit/config.yml +35 -0
  205. package/dot_config/mako/config +47 -0
  206. package/dot_config/mas/masapps.txt +5 -0
  207. package/dot_config/micro/settings.json +3 -0
  208. package/dot_config/mimeapps.list +77 -0
  209. package/dot_config/minikube/config.json +13 -0
  210. package/dot_config/mise/config.toml +99 -0
  211. package/dot_config/mongosh/mongoshrc.js +68 -0
  212. package/dot_config/mpv/input.conf +47 -0
  213. package/dot_config/mpv/mpv.conf +47 -0
  214. package/dot_config/mycli/myclirc +67 -0
  215. package/dot_config/nano/nanorc +28 -0
  216. package/dot_config/ncdu/config +12 -0
  217. package/dot_config/niri/config.kdl.tmpl +327 -0
  218. package/dot_config/nushell/aliases.nu +18 -0
  219. package/dot_config/nushell/completions.nu.tmpl +52 -0
  220. package/dot_config/nushell/config.nu.tmpl +86 -0
  221. package/dot_config/nushell/env.nu.tmpl +94 -0
  222. package/dot_config/nushell/functions.nu.tmpl +17 -0
  223. package/dot_config/nvim/init.lua +18 -0
  224. package/dot_config/nvim/lazy-lock.json +58 -0
  225. package/dot_config/nvim/lua/config/autocmds.lua +107 -0
  226. package/dot_config/nvim/lua/config/keymaps.lua +92 -0
  227. package/dot_config/nvim/lua/config/lazy.lua +44 -0
  228. package/dot_config/nvim/lua/config/options.lua +49 -0
  229. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  230. package/dot_config/nvim/lua/plugins/coding.lua +216 -0
  231. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  232. package/dot_config/nvim/lua/plugins/dap.lua +412 -0
  233. package/dot_config/nvim/lua/plugins/editor.lua +55 -0
  234. package/dot_config/nvim/lua/plugins/git.lua +10 -0
  235. package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
  236. package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
  237. package/dot_config/nvim/lua/plugins/rust.lua +34 -0
  238. package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
  239. package/dot_config/nvim/lua/plugins/ui.lua +509 -0
  240. package/dot_config/paru/paru.conf +10 -0
  241. package/dot_config/pip/pip.conf.tmpl +32 -0
  242. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  243. package/dot_config/pueue/pueue.yml +34 -0
  244. package/dot_config/pypoetry/config.toml +6 -0
  245. package/dot_config/pyrightconfig.json +5 -0
  246. package/dot_config/raycast/README.md +13 -0
  247. package/dot_config/redis/redisclirc +41 -0
  248. package/dot_config/ripgrep/ripgreprc +21 -0
  249. package/dot_config/shell/00-core-paths.sh.tmpl +133 -0
  250. package/dot_config/shell/05-core-safety.sh +47 -0
  251. package/dot_config/shell/10-secrets.sh +40 -0
  252. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  253. package/dot_config/shell/40-ls-colors.sh +48 -0
  254. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  255. package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
  256. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  257. package/dot_config/shell/90-ux-aliases.sh.tmpl +120 -0
  258. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +54 -0
  259. package/dot_config/shell/Brewfile +207 -0
  260. package/dot_config/shell/Brewfile.cask +92 -0
  261. package/dot_config/shell/Brewfile.cli +127 -0
  262. package/dot_config/shell/README.md +267 -0
  263. package/dot_config/shell/als_data.txt.tmpl +65 -0
  264. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  265. package/dot_config/shell/custom/context_suggest.zsh +68 -0
  266. package/dot_config/shell/custom/error_analysis.zsh +45 -0
  267. package/dot_config/sops/dot_sops.yaml +23 -0
  268. package/dot_config/starship.toml.tmpl +202 -0
  269. package/dot_config/swaylock/config +43 -0
  270. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  271. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  272. package/dot_config/systemd/user/pueued.service +12 -0
  273. package/dot_config/systemd/user/ssh-agent.service +12 -0
  274. package/dot_config/task/Taskfile.yml +86 -0
  275. package/dot_config/tflint/tflint.hcl +9 -0
  276. package/dot_config/tmux/tmux.conf.tmpl +223 -0
  277. package/dot_config/topgrade.toml.tmpl +54 -0
  278. package/dot_config/user-dirs.dirs +9 -0
  279. package/dot_config/vscode/extensions.txt +11 -0
  280. package/dot_config/vscode/settings.json.tmpl +82 -0
  281. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  282. package/dot_config/waybar/style.css.tmpl +211 -0
  283. package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
  284. package/dot_config/wget/wgetrc +12 -0
  285. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  286. package/dot_config/yarn/yarnrc.yml +36 -0
  287. package/dot_config/yazi/keymap.toml +67 -0
  288. package/dot_config/yazi/theme.toml +102 -0
  289. package/dot_config/yazi/yazi.toml +40 -0
  290. package/dot_config/zathura/zathurarc +52 -0
  291. package/dot_config/zellij/config.kdl.tmpl +79 -0
  292. package/dot_config/zsh/dot_zprofile +7 -0
  293. package/dot_config/zsh/dot_zshenv +5 -0
  294. package/dot_config/zsh/dot_zshrc.tmpl +498 -0
  295. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  296. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
  297. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
  298. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  299. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +194 -0
  300. package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
  301. package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
  302. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  303. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  304. package/dot_local/bin/executable_ai-update +195 -0
  305. package/dot_local/bin/executable_ai_core +152 -0
  306. package/dot_local/bin/executable_antigravity +11 -0
  307. package/dot_local/bin/executable_b64 +84 -0
  308. package/dot_local/bin/executable_bm +77 -0
  309. package/dot_local/bin/executable_cb +39 -0
  310. package/dot_local/bin/executable_dot +589 -0
  311. package/dot_local/bin/executable_dot-ai +36 -0
  312. package/dot_local/bin/executable_dot-bootstrap +77 -0
  313. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  314. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  315. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  316. package/dot_local/bin/executable_dot-theme-sync +952 -0
  317. package/dot_local/bin/executable_dot_completion +57 -0
  318. package/dot_local/bin/executable_dtags +28 -0
  319. package/dot_local/bin/executable_epoch +67 -0
  320. package/dot_local/bin/executable_extract +41 -0
  321. package/dot_local/bin/executable_gbd +52 -0
  322. package/dot_local/bin/executable_gd +42 -0
  323. package/dot_local/bin/executable_git-ai-commit +175 -0
  324. package/dot_local/bin/executable_git-ai-diff +169 -0
  325. package/dot_local/bin/executable_gl +101 -0
  326. package/dot_local/bin/executable_hash +161 -0
  327. package/dot_local/bin/executable_hashsum +160 -0
  328. package/dot_local/bin/executable_hex +115 -0
  329. package/dot_local/bin/executable_jsonv +78 -0
  330. package/dot_local/bin/executable_jwt +94 -0
  331. package/dot_local/bin/executable_kill-port +75 -0
  332. package/dot_local/bin/executable_lorem +118 -0
  333. package/dot_local/bin/executable_mkscript +35 -0
  334. package/dot_local/bin/executable_monitor +56 -0
  335. package/dot_local/bin/executable_myip +51 -0
  336. package/dot_local/bin/executable_notify +22 -0
  337. package/dot_local/bin/executable_open +36 -0
  338. package/dot_local/bin/executable_pw +27 -0
  339. package/dot_local/bin/executable_rec-start +46 -0
  340. package/dot_local/bin/executable_rec-stop +35 -0
  341. package/dot_local/bin/executable_regex +132 -0
  342. package/dot_local/bin/executable_start-niri +8 -0
  343. package/dot_local/bin/executable_tmux-sessionizer +314 -0
  344. package/dot_local/bin/executable_tour +175 -0
  345. package/dot_local/bin/executable_up +21 -0
  346. package/dot_local/bin/executable_update +142 -0
  347. package/dot_local/bin/executable_uuid +87 -0
  348. package/dot_local/bin/executable_win +32 -0
  349. package/dot_local/bin/executable_yamlv +57 -0
  350. package/dot_local/share/bash-completion/completions/dot +72 -0
  351. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  352. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  353. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  354. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  355. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  356. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  357. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  358. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  359. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  360. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  361. package/dot_local/share/man/man1/dot.1 +149 -0
  362. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  363. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  364. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  365. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  366. package/dot_local/share/zsh/completions/.keep +0 -0
  367. package/dot_local/share/zsh/completions/_dot +283 -0
  368. package/install.sh +342 -0
  369. package/package.json +1 -1
  370. package/scripts/ci/check-copyright-headers.sh +96 -0
  371. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  372. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  373. package/scripts/ci/validate-ci-config.sh +224 -0
  374. package/scripts/demo/record.sh +42 -0
  375. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  376. package/scripts/diagnostics/alias-governance.sh +137 -0
  377. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  378. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  379. package/scripts/diagnostics/benchmark.sh +381 -0
  380. package/scripts/diagnostics/conflicts.sh +72 -0
  381. package/scripts/diagnostics/doctor-unified.sh +38 -0
  382. package/scripts/diagnostics/doctor.sh +541 -0
  383. package/scripts/diagnostics/drift-dashboard.sh +37 -0
  384. package/scripts/diagnostics/health.sh +597 -0
  385. package/scripts/diagnostics/history-analysis.sh +85 -0
  386. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  387. package/scripts/diagnostics/perf.sh +225 -0
  388. package/scripts/diagnostics/scorecard.sh +118 -0
  389. package/scripts/diagnostics/secret-governance.sh +58 -0
  390. package/scripts/diagnostics/security-score.sh +438 -0
  391. package/scripts/diagnostics/smoke-test.sh +87 -0
  392. package/scripts/diagnostics/snapshot.sh +89 -0
  393. package/scripts/diagnostics/verify.sh +107 -0
  394. package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
  395. package/scripts/diagnostics/version-locks.sh +79 -0
  396. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  397. package/scripts/docs/build-manual.sh +883 -0
  398. package/scripts/docs/check-manual.sh +213 -0
  399. package/scripts/dot/commands/agent.sh +465 -0
  400. package/scripts/dot/commands/ai.sh +416 -0
  401. package/scripts/dot/commands/aliases.sh +250 -0
  402. package/scripts/dot/commands/appearance.sh +80 -0
  403. package/scripts/dot/commands/core.sh +185 -0
  404. package/scripts/dot/commands/diagnostics.sh +229 -0
  405. package/scripts/dot/commands/fleet.sh +399 -0
  406. package/scripts/dot/commands/lint.sh +177 -0
  407. package/scripts/dot/commands/manual.sh +168 -0
  408. package/scripts/dot/commands/meta.sh +248 -0
  409. package/scripts/dot/commands/patterns.sh +54 -0
  410. package/scripts/dot/commands/restore.sh +231 -0
  411. package/scripts/dot/commands/secrets.sh +223 -0
  412. package/scripts/dot/commands/security.sh +76 -0
  413. package/scripts/dot/commands/tools.sh +469 -0
  414. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  415. package/scripts/dot/lib/bento.sh +49 -0
  416. package/scripts/dot/lib/log.sh +194 -0
  417. package/scripts/dot/lib/platform.sh +98 -0
  418. package/scripts/dot/lib/ui.sh +507 -0
  419. package/scripts/dot/lib/utils.sh +372 -0
  420. package/scripts/fonts/install-nerd-fonts.sh +68 -0
  421. package/scripts/fonts/patch-fonts.sh +35 -0
  422. package/scripts/git-hooks/install.sh +11 -0
  423. package/scripts/git-hooks/pre-commit +12 -0
  424. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  425. package/scripts/git-hooks/pre-push +29 -0
  426. package/scripts/git-hooks/prepare-commit-msg +29 -0
  427. package/scripts/lib/secrets_provider.sh +158 -0
  428. package/scripts/maintenance/check-updates.sh +131 -0
  429. package/scripts/ops/ai-setup.sh +55 -0
  430. package/scripts/ops/bundle.sh +77 -0
  431. package/scripts/ops/chaos.sh +49 -0
  432. package/scripts/ops/chezmoi-apply.sh +270 -0
  433. package/scripts/ops/chezmoi-diff.sh +15 -0
  434. package/scripts/ops/chezmoi-remove.sh +45 -0
  435. package/scripts/ops/chezmoi-update.sh +48 -0
  436. package/scripts/ops/heal-chezmoi.sh +51 -0
  437. package/scripts/ops/heal-system.sh +128 -0
  438. package/scripts/ops/heal-tools.sh +340 -0
  439. package/scripts/ops/heal.sh +222 -0
  440. package/scripts/ops/post-apply-repair.sh +106 -0
  441. package/scripts/ops/prewarm.sh +127 -0
  442. package/scripts/ops/release.sh +252 -0
  443. package/scripts/ops/rollback.sh +589 -0
  444. package/scripts/ops/setup.sh +137 -0
  445. package/scripts/ops/teleport.sh +33 -0
  446. package/scripts/qa/coverage-baseline.sh +60 -0
  447. package/scripts/qa/docs-coverage.sh +111 -0
  448. package/scripts/qa/reliability-audit.sh +138 -0
  449. package/scripts/qa/traceability-coverage.sh +116 -0
  450. package/scripts/qa/validate-examples.sh +26 -0
  451. package/scripts/qa/wsl-contract.sh +11 -0
  452. package/scripts/release/package-policy-bundles.sh +125 -0
  453. package/scripts/secrets/age-init.sh +70 -0
  454. package/scripts/secrets/create-secrets-file.sh +45 -0
  455. package/scripts/secrets/encrypt-ssh-key.sh +43 -0
  456. package/scripts/security/backup.sh +57 -0
  457. package/scripts/security/dns-doh.sh +51 -0
  458. package/scripts/security/encryption-check.sh +54 -0
  459. package/scripts/security/enforce-policies.sh +334 -0
  460. package/scripts/security/firewall.sh +90 -0
  461. package/scripts/security/lock-configs.sh +57 -0
  462. package/scripts/security/lock-screen.sh +55 -0
  463. package/scripts/security/manage-secrets.sh +428 -0
  464. package/scripts/security/ssh-cert.sh +203 -0
  465. package/scripts/security/telemetry-kill.sh +50 -0
  466. package/scripts/security/usb-safety.sh +51 -0
  467. package/scripts/theme/apply-gnome-theme.sh +328 -0
  468. package/scripts/theme/extract-theme.py +677 -0
  469. package/scripts/theme/install-boot-logo.sh +62 -0
  470. package/scripts/theme/install-catppuccin-themes.sh +370 -0
  471. package/scripts/theme/install-cursors.sh +25 -0
  472. package/scripts/theme/install-file-icons.sh +26 -0
  473. package/scripts/theme/install-grub-theme.sh +61 -0
  474. package/scripts/theme/install-lock-icon.sh +30 -0
  475. package/scripts/theme/merge-wallpaper.sh +141 -0
  476. package/scripts/theme/rebuild-themes.sh +309 -0
  477. package/scripts/theme/switch.sh +421 -0
  478. package/scripts/theme/wallpaper-rotate.sh +136 -0
  479. package/scripts/theme/wallpaper-sync.sh +397 -0
  480. package/scripts/tools/cmatrix.sh +21 -0
  481. package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
  482. package/scripts/tools/emoji-picker.sh +48 -0
  483. package/scripts/tools/figlet-banner.sh +18 -0
  484. package/scripts/tools/log-rotate.sh +30 -0
  485. package/scripts/tools/lolcat-wrap.sh +19 -0
  486. package/scripts/tools/pipes.sh +48 -0
  487. package/scripts/tuning/linux.sh +185 -0
  488. package/scripts/tuning/macos.sh +55 -0
  489. package/scripts/uninstall.sh +85 -0
  490. package/scripts/version-sync.sh +487 -0
  491. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  492. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  493. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  494. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  495. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  496. package/templates/projects/go/README.md +4 -0
  497. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  498. package/templates/projects/go/go.sum +0 -0
  499. package/templates/projects/molecule/README.md +7 -0
  500. package/templates/projects/molecule/converge.yml +7 -0
  501. package/templates/projects/molecule/molecule.yml +16 -0
  502. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  503. package/templates/projects/node/README.md +4 -0
  504. package/templates/projects/node/package-lock.json +12 -0
  505. package/templates/projects/node/src/index.js +1 -0
  506. package/templates/projects/packer/README.md +15 -0
  507. package/templates/projects/packer/main.pkr.hcl +15 -0
  508. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  509. package/templates/projects/python/README.md +4 -0
  510. package/templates/projects/python/pyproject.toml +15 -0
  511. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  512. package/templates/projects/python/tests/test_basic.py +1 -0
  513. package/docs/ARCHITECTURE.md +0 -62
  514. package/docs/COMPLIANCE.md +0 -47
  515. package/docs/OPERATIONS.md +0 -103
  516. package/docs/PR_DESCRIPTION.md +0 -150
  517. package/docs/ROADMAP_legacy.md +0 -556
  518. package/docs/SECURITY_CHECKLIST.md +0 -25
  519. package/docs/TASK.md +0 -99
  520. package/docs/WALKTHROUGH.md +0 -46
  521. package/scripts/backup.sh +0 -142
  522. package/scripts/banner.sh +0 -20
  523. package/scripts/benchmark.sh +0 -20
  524. package/scripts/build.sh +0 -41
  525. package/scripts/clean.sh +0 -31
  526. package/scripts/compile.sh +0 -54
  527. package/scripts/copy.sh +0 -108
  528. package/scripts/doctor.sh +0 -79
  529. package/scripts/dotfiles.sh +0 -63
  530. package/scripts/download.sh +0 -35
  531. package/scripts/help.sh +0 -57
  532. package/scripts/lock-configs.sh +0 -57
  533. package/scripts/package.sh +0 -46
  534. package/scripts/ssh.sh +0 -55
  535. package/scripts/teleport.sh +0 -23
  536. package/scripts/test-aliases.sh +0 -25
  537. package/scripts/test_smoke.sh +0 -88
  538. package/scripts/unpack.sh +0 -28
@@ -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
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Dotfiles CLI - Meta Commands
4
+ # upgrade, prewarm, docs, learn, keys, sandbox, mcp, mode, agent
5
+
6
+ set -euo pipefail
7
+
8
+ _META_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ # shellcheck source=../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:-}" "$@"
31
+
32
+ cmd_upgrade() {
33
+ local src_dir
34
+ src_dir="$(require_source_dir)"
35
+
36
+ if [ -f "$src_dir/nix/flake.nix" ] && has_command nix; then
37
+ ui_info "Updating Nix flake"
38
+ (cd "$src_dir" && nix flake update) || true
39
+ ui_info "Running Nix garbage collection"
40
+ nix-collect-garbage -d || true
41
+ fi
42
+
43
+ ui_info "Updating dotfiles"
44
+ chezmoi update || true
45
+
46
+ if has_command nvim; then
47
+ ui_info "Updating Neovim plugins"
48
+ nvim --headless "+Lazy! sync" +qa || true
49
+ fi
50
+
51
+ if [ "${DOTFILES_FONTS:-}" = "1" ]; then
52
+ if [ -f "$src_dir/scripts/fonts/install-nerd-fonts.sh" ]; then
53
+ ui_info "Installing Nerd Fonts"
54
+ sh "$src_dir/scripts/fonts/install-nerd-fonts.sh"
55
+ fi
56
+ fi
57
+ }
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
+
75
+ cmd_docs() {
76
+ local src_dir
77
+ src_dir="$(resolve_source_dir)"
78
+
79
+ if [ -n "$src_dir" ] && [ -f "$src_dir/README.md" ]; then
80
+ if has_command glow; then
81
+ glow "$src_dir/README.md"
82
+ else
83
+ exec cat "$src_dir/README.md"
84
+ fi
85
+ else
86
+ die "README not found."
87
+ fi
88
+ }
89
+
90
+ cmd_learn() {
91
+ local dot_bin
92
+ dot_bin="$(dirname "${BASH_SOURCE[0]}")/../../../dot_local/bin"
93
+ if [ -f "$dot_bin/executable_tour" ]; then
94
+ exec bash "$dot_bin/executable_tour" "$@"
95
+ fi
96
+ # Fallback to ops script
97
+ run_script "scripts/ops/tour.sh" "Tour script" "$@"
98
+ }
99
+
100
+ cmd_keys() {
101
+ local src_dir
102
+ src_dir="$(resolve_source_dir)"
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
+
132
+ if [ -n "$src_dir" ] && [ -f "$src_dir/docs/KEYS.md" ]; then
133
+ if [ -n "${1:-}" ]; then
134
+ rg -i --fixed-strings --context 1 "${1:-}" "$src_dir/docs/KEYS.md" || true
135
+ else
136
+ exec cat "$src_dir/docs/KEYS.md"
137
+ fi
138
+ else
139
+ run_script "scripts/diagnostics/keys.sh" "Keys script" "$@"
140
+ fi
141
+ }
142
+
143
+ cmd_sandbox() {
144
+ local src_dir
145
+ src_dir="$(require_source_dir)"
146
+
147
+ if has_command docker; then
148
+ ui_info "Launching sandbox via Docker"
149
+ docker build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
150
+ exec docker run --rm -it dotfiles-sandbox
151
+ elif has_command podman; then
152
+ ui_info "Launching sandbox via Podman"
153
+ podman build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
154
+ exec podman run --rm -it dotfiles-sandbox
155
+ else
156
+ die "Docker or Podman is required for sandbox."
157
+ fi
158
+ }
159
+
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)
211
+ case "${1:-}" in
212
+ upgrade)
213
+ shift
214
+ cmd_upgrade "$@"
215
+ ;;
216
+ cache-refresh | prewarm)
217
+ shift
218
+ cmd_prewarm "$@"
219
+ ;;
220
+ docs)
221
+ shift
222
+ cmd_docs "$@"
223
+ ;;
224
+ learn)
225
+ shift
226
+ cmd_learn "$@"
227
+ ;;
228
+ keys)
229
+ shift
230
+ cmd_keys "$@"
231
+ ;;
232
+ sandbox)
233
+ shift
234
+ cmd_sandbox "$@"
235
+ ;;
236
+ mcp)
237
+ shift
238
+ cmd_mcp "$@"
239
+ ;;
240
+ mode | agent)
241
+ shift
242
+ cmd_mode "$@"
243
+ ;;
244
+ *)
245
+ echo "Unknown meta command: ${1:-}" >&2
246
+ exit 1
247
+ ;;
248
+ esac
@@ -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
@@ -0,0 +1,231 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # dot restore - Restore dotfiles from backup or previous state
4
+ # Usage: dot restore [--list|-l|--latest|-L|<backup-id>]
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
+ # shellcheck source=../lib/log.sh
12
+ source "$SCRIPT_DIR/../lib/log.sh"
13
+
14
+ DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}"
15
+ BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
16
+ CHEZMOI_SOURCE="${HOME}/.local/share/chezmoi"
17
+
18
+ ui_init
19
+
20
+ usage() {
21
+ echo "Usage: dot restore [OPTIONS]"
22
+ echo ""
23
+ echo "Options:"
24
+ echo " --list, -l List available backups"
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"
29
+ echo " -h, --help Show this help"
30
+ echo ""
31
+ echo "Examples:"
32
+ echo " dot restore --list"
33
+ echo " dot restore --latest"
34
+ echo " dot restore --git HEAD~1"
35
+ echo " dot restore --git v0.2.470"
36
+ }
37
+
38
+ list_backups() {
39
+ if [[ ! -d "$BACKUP_DIR" ]]; then
40
+ log_warn "No backups found at $BACKUP_DIR"
41
+ return 1
42
+ fi
43
+
44
+ ui_header "Available Backups"
45
+ echo "─────────────────────────────────────────"
46
+
47
+ while IFS= read -r backup; do
48
+ echo " $backup"
49
+ done < <(list_backup_names)
50
+
51
+ echo ""
52
+ echo ""
53
+ ui_header "Git History (last 10)"
54
+ echo "─────────────────────────────────────────"
55
+
56
+ if [[ -d "$DOTFILES_DIR/.git" ]]; then
57
+ git -C "$DOTFILES_DIR" log --oneline -10
58
+ elif [[ -d "$CHEZMOI_SOURCE/.git" ]]; then
59
+ git -C "$CHEZMOI_SOURCE" log --oneline -10
60
+ fi
61
+ }
62
+
63
+ restore_from_git() {
64
+ local ref="$1"
65
+ local dry_run="${2:-false}"
66
+ local source_dir
67
+
68
+ if [[ -d "$DOTFILES_DIR/.git" ]]; then
69
+ source_dir="$DOTFILES_DIR"
70
+ elif [[ -d "$CHEZMOI_SOURCE/.git" ]]; then
71
+ source_dir="$CHEZMOI_SOURCE"
72
+ else
73
+ log_error "No git repository found"
74
+ return 1
75
+ fi
76
+
77
+ log_info "Restoring from git ref: $ref"
78
+
79
+ if $dry_run; then
80
+ log_info "Dry run - showing changes:"
81
+ git -C "$source_dir" diff "$ref" --stat
82
+ return 0
83
+ fi
84
+
85
+ # Create backup first
86
+ create_backup
87
+
88
+ # Restore
89
+ git -C "$source_dir" checkout "$ref" -- .
90
+ log_success "Restored from $ref"
91
+
92
+ # Re-apply chezmoi
93
+ if has_command chezmoi; then
94
+ log_info "Re-applying chezmoi..."
95
+ chezmoi apply
96
+ fi
97
+ }
98
+
99
+ show_diff() {
100
+ local ref="$1"
101
+ local source_dir
102
+
103
+ if [[ -d "$DOTFILES_DIR/.git" ]]; then
104
+ source_dir="$DOTFILES_DIR"
105
+ elif [[ -d "$CHEZMOI_SOURCE/.git" ]]; then
106
+ source_dir="$CHEZMOI_SOURCE"
107
+ else
108
+ log_error "No git repository found"
109
+ return 1
110
+ fi
111
+
112
+ git -C "$source_dir" diff "$ref"
113
+ }
114
+
115
+ create_backup() {
116
+ local backup_name
117
+ backup_name="backup-$(date +%Y%m%d_%H%M%S)"
118
+ local backup_path="$BACKUP_DIR/$backup_name"
119
+ local rel_path
120
+
121
+ mkdir -p "$backup_path"
122
+
123
+ log_info "Creating backup: $backup_name"
124
+
125
+ # Backup key config files
126
+ local files_to_backup=(
127
+ "$HOME/.zshrc"
128
+ "$HOME/.config/zsh"
129
+ "$HOME/.config/nvim"
130
+ "$HOME/.config/git"
131
+ "$HOME/.gitconfig"
132
+ )
133
+
134
+ for f in "${files_to_backup[@]}"; do
135
+ if [[ -e "$f" ]]; then
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
139
+ fi
140
+ done
141
+
142
+ log_success "Backup created at $backup_path"
143
+ }
144
+
145
+ restore_latest() {
146
+ if [[ ! -d "$BACKUP_DIR" ]]; then
147
+ log_error "No backups found"
148
+ return 1
149
+ fi
150
+
151
+ local latest
152
+ latest=$(list_backup_names | head -1)
153
+
154
+ if [[ -z "$latest" ]]; then
155
+ log_error "No backups found"
156
+ return 1
157
+ fi
158
+
159
+ log_info "Restoring from: $latest"
160
+
161
+ local backup_path="$BACKUP_DIR/$latest"
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
191
+ }
192
+
193
+ # Parse arguments
194
+ DRY_RUN=false
195
+
196
+ while [[ $# -gt 0 ]]; do
197
+ case "$1" in
198
+ -l | --list)
199
+ list_backups
200
+ exit 0
201
+ ;;
202
+ --latest | -L)
203
+ restore_latest
204
+ exit 0
205
+ ;;
206
+ --git | -g)
207
+ restore_from_git "$2" "$DRY_RUN"
208
+ exit 0
209
+ ;;
210
+ --diff | -d)
211
+ show_diff "$2"
212
+ exit 0
213
+ ;;
214
+ --dry-run | -n)
215
+ DRY_RUN=true
216
+ shift
217
+ ;;
218
+ -h | --help)
219
+ usage
220
+ exit 0
221
+ ;;
222
+ *)
223
+ log_error "Unknown option: $1"
224
+ usage
225
+ exit 1
226
+ ;;
227
+ esac
228
+ done
229
+
230
+ # Default: show usage
231
+ usage