@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,38 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Unified doctor orchestrator — parses flags and dispatches to existing scripts.
4
+ set -euo pipefail
5
+
6
+ _cleanup_files=()
7
+ trap 'rm -f "${_cleanup_files[@]}"' EXIT
8
+
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
11
+ # shellcheck source=../dot/lib/ui.sh
12
+ # shellcheck disable=SC1091
13
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
14
+ ui_init
15
+
16
+ passthrough=()
17
+ target="scripts/diagnostics/doctor.sh"
18
+
19
+ for arg in "$@"; do
20
+ case "$arg" in
21
+ --heal | -H) target="scripts/ops/heal.sh" ;;
22
+ --audit | -a) target="scripts/ops/health-check.sh" ;;
23
+ --score | -s) target="scripts/diagnostics/scorecard.sh" ;;
24
+ --smoke | -m) target="scripts/diagnostics/smoke-test.sh" ;;
25
+ --drift | -d) target="scripts/diagnostics/drift-dashboard.sh" ;;
26
+ --benchmark | -b) target="tests/benchmark.sh" ;;
27
+ --json | -j | --ai | -A) passthrough+=("$arg") ;;
28
+ *) passthrough+=("$arg") ;;
29
+ esac
30
+ done
31
+
32
+ script="$REPO_ROOT/$target"
33
+ if [[ ! -f "$script" ]]; then
34
+ ui_err "Script not found" "$target"
35
+ exit 1
36
+ fi
37
+
38
+ exec bash "$script" "${passthrough[@]+"${passthrough[@]}"}"
@@ -1,115 +1,541 @@
1
1
  #!/usr/bin/env bash
2
- # MIT License
3
- # Copyright (c) 2026 Sebastien Rousseau
4
- # See LICENSE file for details.
5
-
6
- # Script: doctor.sh
7
- # Description: Diagnostics tool for the dotfiles environment.
8
- # Checks dependencies, paths, and configuration integrity.
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Dotfiles Doctor.
4
+ ##
5
+ ## Diagnoses dotfiles environment health by checking dependencies, paths,
6
+ ## and configuration integrity. Reports errors, warnings, and suggests
7
+ ## remediation steps.
8
+ ##
9
+ ## # Usage
10
+ ## dot doctor
11
+ ##
12
+ ## # Exit Codes
13
+ ## - 0: All checks passed (may have warnings)
14
+ ## - 1: Critical errors detected
15
+ ##
16
+ ## # Idempotency
17
+ ## Safe to run repeatedly. Read-only checks.
9
18
 
10
19
  set -euo pipefail
11
20
 
12
- # Colors (respect NO_COLOR: https://no-color.org)
13
- if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
14
- GREEN='\033[0;32m'
15
- RED='\033[0;31m'
16
- YELLOW='\033[1;33m'
17
- NC='\033[0m'
18
- else
19
- GREEN='' RED='' YELLOW='' NC=''
20
- fi
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+ # shellcheck source=../dot/lib/ui.sh
23
+ # shellcheck disable=SC1091
24
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
25
+ # shellcheck source=../dot/lib/platform.sh
26
+ # shellcheck disable=SC1091
27
+ source "$SCRIPT_DIR/../dot/lib/platform.sh"
28
+ # shellcheck source=../dot/lib/log.sh
29
+ # shellcheck disable=SC1091
30
+ source "$SCRIPT_DIR/../dot/lib/log.sh"
31
+ export DOT_COMMAND="doctor"
32
+
33
+ ui_init
21
34
 
22
- echo " Dotfiles Doctor - System Diagnostics"
23
- echo "-------------------------------------"
35
+ # Extend PATH to include common non-standard install locations
36
+ export PATH="$HOME/.atuin/bin:$HOME/.local/bin:$PATH"
24
37
 
25
38
  Errors=0
26
39
  Warnings=0
40
+ AI_DEBUG=0
27
41
 
28
- log_success() { echo -e "${GREEN} $1${NC}"; }
29
- log_fail() {
30
- echo -e "${RED} $1${NC}"
42
+ for arg in "$@"; do
43
+ case "$arg" in
44
+ --ai) AI_DEBUG=1 ;;
45
+ esac
46
+ done
47
+
48
+ # --- Output helpers (delegate to shared ui.sh) ---
49
+ _ok() { ui_ok "$1" "${2:-}"; }
50
+ _fail() {
51
+ ui_err "$1" "${2:-}"
31
52
  Errors=$((Errors + 1))
32
53
  }
33
- log_warn() {
34
- echo -e "${YELLOW}️ $1${NC}"
54
+ _warn() {
55
+ ui_warn "$1" "${2:-}"
35
56
  Warnings=$((Warnings + 1))
36
57
  }
58
+ _section() {
59
+ echo ""
60
+ ui_section "$1"
61
+ }
62
+
63
+ pretty_path() {
64
+ local value="${1:-}"
65
+ if [[ -n "$value" ]]; then
66
+ printf '%s' "${value/#$HOME/\~}"
67
+ fi
68
+ }
69
+
70
+ tool_source() {
71
+ local path="${1:-}"
72
+ if [[ "$path" == "$HOME/.local/share/mise/"* ]]; then
73
+ echo "mise"
74
+ elif [[ "$path" == /usr/bin/* || "$path" == /bin/* || "$path" == /usr/sbin/* || "$path" == /sbin/* ]]; then
75
+ echo "system"
76
+ else
77
+ echo "custom"
78
+ fi
79
+ }
37
80
 
38
- # 1. Check Dependencies
39
- echo "Checking Core Dependencies..."
40
- for cmd in git curl chezmoi starship rg bat; do
81
+ check_cmd() {
82
+ local cmd="$1"
83
+ if command -v "$cmd" &>/dev/null; then return 0; fi
84
+ if command -v mise &>/dev/null; then
85
+ if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
86
+ return 0
87
+ fi
88
+ fi
89
+ return 1
90
+ }
91
+
92
+ get_cmd_path() {
93
+ local cmd="$1"
41
94
  if command -v "$cmd" &>/dev/null; then
42
- log_success "Found $cmd: $(command -v "$cmd")"
95
+ command -v "$cmd"
96
+ elif command -v mise &>/dev/null; then
97
+ local bin_path
98
+ bin_path=$(mise bin-paths 2>/dev/null | grep -E "/$cmd(/|$)" | head -n 1)
99
+ if [ -n "$bin_path" ]; then
100
+ echo "$bin_path/$cmd"
101
+ else
102
+ echo "$cmd"
103
+ fi
104
+ else
105
+ echo "$cmd"
106
+ fi
107
+ }
108
+
109
+ # --- Header ---
110
+ ui_header "Dotfiles Doctor"
111
+
112
+ # --- Core Shells ---
113
+ _section "Core Shells"
114
+ for cmd in zsh fish starship; do
115
+ if check_cmd "$cmd"; then
116
+ cmd_path="$(get_cmd_path "$cmd")"
117
+ _ok "$cmd" "$(pretty_path "$cmd_path") ($(tool_source "$cmd_path"))"
118
+ elif [[ "$cmd" == "fish" ]]; then
119
+ _warn "$cmd" "optional"
43
120
  else
44
- log_fail "Missing $cmd"
121
+ _fail "$cmd" "missing"
45
122
  fi
46
123
  done
47
124
 
48
- echo -e "\nChecking Optional AI CLIs..."
49
- for cmd in claude gemini sgpt ollama opencode aider; do
50
- if command -v "$cmd" &>/dev/null; then
51
- log_success "Found $cmd: $(command -v "$cmd")"
125
+ if check_cmd "nu"; then
126
+ cmd_path="$(get_cmd_path "nu")"
127
+ _ok "nu" "$(pretty_path "$cmd_path") ($(tool_source "$cmd_path"))"
128
+ elif check_cmd "nushell"; then
129
+ cmd_path="$(get_cmd_path "nushell")"
130
+ _ok "nu" "$(pretty_path "$cmd_path") ($(tool_source "$cmd_path"))"
131
+ else
132
+ _warn "nu" "optional"
133
+ fi
134
+
135
+ # --- Modern CLI Tools ---
136
+ _section "Modern CLI Tools"
137
+ for cmd in rg bat chezmoi fzf zoxide atuin yazi zellij; do
138
+ if check_cmd "$cmd"; then
139
+ _ok "$cmd" "$(pretty_path "$(get_cmd_path "$cmd")")"
140
+ elif [[ "$cmd" == "bat" ]] && check_cmd "batcat"; then
141
+ _ok "$cmd" "$(pretty_path "$(get_cmd_path "batcat")") (batcat)"
52
142
  else
53
- log_warn "Missing $cmd (optional)"
143
+ _fail "$cmd" "missing"
54
144
  fi
55
145
  done
56
146
 
57
- # 2. Check XDG Compliance
58
- echo -e "\nChecking Environment..."
59
- if [[ -z "${XDG_CONFIG_HOME:-}" ]]; then
60
- log_warn "XDG_CONFIG_HOME is not set (Defaulting to ~/.config)"
147
+ # --- Infrastructure ---
148
+ _section "Infrastructure"
149
+ for cmd in pueue wasmtime nix sops age hyperfine; do
150
+ if check_cmd "$cmd"; then
151
+ _ok "$cmd" "$(pretty_path "$(get_cmd_path "$cmd")")"
152
+ elif [[ "$cmd" == "nix" ]]; then
153
+ _ok "$cmd" "optional (not installed)"
154
+ else
155
+ _fail "$cmd" "missing"
156
+ fi
157
+ done
158
+
159
+ if check_cmd pueue; then
160
+ if "$(get_cmd_path pueue)" status >/dev/null 2>&1; then
161
+ _ok "pueue daemon" "running"
162
+ elif command -v pueued >/dev/null 2>&1 && pueued -d >/dev/null 2>&1 && "$(get_cmd_path pueue)" status >/dev/null 2>&1; then
163
+ _ok "pueue daemon" "started"
164
+ else
165
+ _warn "pueue daemon" "not running (pueued -d)"
166
+ fi
167
+ fi
168
+
169
+ # --- AI CLIs ---
170
+ _section "AI CLIs"
171
+ for cmd in claude copilot gemini sgpt ollama opencode aider kiro-cli; do
172
+ if check_cmd "$cmd"; then
173
+ _ok "$cmd" "$(pretty_path "$(get_cmd_path "$cmd")")"
174
+ else
175
+ _warn "$cmd" "optional"
176
+ fi
177
+ done
178
+
179
+ # --- Environment ---
180
+ _section "Environment"
181
+ if [[ -n "${XDG_CONFIG_HOME:-}" ]]; then
182
+ _ok "XDG_CONFIG_HOME" "$(pretty_path "$XDG_CONFIG_HOME")"
183
+ else
184
+ _warn "XDG_CONFIG_HOME" "defaulting to ~/.config"
185
+ fi
186
+
187
+ # Validate XDG paths are absolute
188
+ for var in XDG_CONFIG_HOME XDG_DATA_HOME XDG_CACHE_HOME XDG_STATE_HOME; do
189
+ val="${!var:-}"
190
+ if [[ -n "$val" ]] && [[ "$val" != /* ]]; then
191
+ _warn "$var" "not absolute: $val"
192
+ fi
193
+ done
194
+
195
+ if [[ -n "${PIPX_HOME:-}" ]]; then
196
+ _ok "PIPX_HOME" "$(pretty_path "$PIPX_HOME")"
197
+ else
198
+ _warn "PIPX_HOME" "not set"
199
+ fi
200
+
201
+ # --- Platform ---
202
+ _section "Platform"
203
+
204
+ platform_id="$(dot_platform_id)"
205
+ _os_name="$(uname -s)"
206
+ _kernel="$(uname -sr)"
207
+ _arch="$(uname -m)"
208
+ _user="$(whoami 2>/dev/null || echo "${USER:-unknown}")"
209
+ _hostname_val="$(hostname -s 2>/dev/null || hostname 2>/dev/null || echo "unknown")"
210
+
211
+ # Shell version
212
+ _shell_name="${SHELL##*/}"
213
+ _shell_ver="$("$SHELL" --version 2>&1 | head -1 | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1 || true)"
214
+ _shell="${_shell_name}${_shell_ver:+ $_shell_ver}"
215
+
216
+ # Terminal
217
+ _terminal="${TERM_PROGRAM:-${TERM:-unknown}}"
218
+
219
+ # Uptime (portable)
220
+ if uptime -p >/dev/null 2>&1; then
221
+ _uptime="$(uptime -p 2>/dev/null | sed 's/^up //')"
61
222
  else
62
- log_success "XDG_CONFIG_HOME=$XDG_CONFIG_HOME"
223
+ _uptime="$(uptime 2>/dev/null | sed -E 's/^.* up ([^,]+(, [^,]+){0,2}), [0-9]+ users?.*$/\1/' || true)"
63
224
  fi
64
225
 
65
- if [[ -z "${PIPX_HOME:-}" ]]; then
66
- log_warn "PIPX_HOME is not set (Check paths configuration)"
226
+ # --- OS-specific detection ---
227
+ _os="" _host="" _cpu="" _cpu_cores="" _gpu="" _mem="" _resolution="" _packages="" _de=""
228
+
229
+ if [[ "$_os_name" == "Darwin" ]]; then
230
+ # macOS
231
+ _os="macOS $(sw_vers -productVersion 2>/dev/null || echo "unknown")"
232
+ _host="$(/usr/sbin/system_profiler SPHardwareDataType 2>/dev/null | awk -F': ' '/Model Name/{print $2}' || sysctl -n hw.model 2>/dev/null || echo "Mac")"
233
+ _cpu="$(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo "$_arch")"
234
+ _cpu_cores="$(sysctl -n hw.ncpu 2>/dev/null || echo "?")"
235
+ _gpu="$(system_profiler SPDisplaysDataType 2>/dev/null | awk -F': ' '/Chipset Model|Chip/{print $2; exit}' || echo "n/a")"
236
+ _mem_total="$(sysctl -n hw.memsize 2>/dev/null || echo 0)"
237
+ _mem_total_gb="$(awk "BEGIN{printf \"%.2f\", ${_mem_total}/1073741824}")"
238
+ _mem_pages="$(vm_stat 2>/dev/null | awk '/Pages active/{gsub(/\./,"",$3); print $3}')"
239
+ _mem_used_gb="$(awk "BEGIN{printf \"%.2f\", ${_mem_pages:-0}*4096/1073741824}")"
240
+ _mem="${_mem_used_gb} GiB / ${_mem_total_gb} GiB"
241
+ _resolution="$(system_profiler SPDisplaysDataType 2>/dev/null | awk '/Resolution/{gsub(/^ +/,""); print; exit}' | sed 's/Resolution: //' || echo "n/a")"
242
+ _packages="$(brew list --formula 2>/dev/null | wc -l | tr -d ' ') (brew)"
243
+ _de="Aqua"
244
+
245
+ elif [[ -r /etc/os-release ]]; then
246
+ # Linux (Debian, Ubuntu, Arch, Fedora, RHEL, etc.)
247
+ # shellcheck disable=SC1091
248
+ . /etc/os-release
249
+ _os="${PRETTY_NAME:-$ID}"
250
+
251
+ _host="$(cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null || cat /sys/firmware/devicetree/base/model 2>/dev/null || echo "Linux")"
252
+
253
+ if command -v lscpu >/dev/null 2>&1; then
254
+ _cpu="$(lscpu | awk -F': +' '/Model name/{print $2}')"
255
+ _cpu_cores="$(lscpu | awk -F': +' '/^CPU\(s\):/{print $2}')"
256
+ else
257
+ _cpu="$(grep -m1 'model name' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^ //' || uname -p)"
258
+ _cpu_cores="$(grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo "?")"
259
+ fi
260
+
261
+ if command -v lspci >/dev/null 2>&1; then
262
+ _gpu="$(lspci 2>/dev/null | grep -iE 'vga|3d|display' | head -1 | sed 's/.*: //')"
263
+ else
264
+ _gpu="n/a"
265
+ fi
266
+
267
+ if command -v free >/dev/null 2>&1; then
268
+ _mem="$(free -b | awk '/Mem:/{printf "%.2f GiB / %.2f GiB", $3/1073741824, $2/1073741824}')"
269
+ elif [[ -r /proc/meminfo ]]; then
270
+ _mem_total_kb="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
271
+ _mem_avail_kb="$(awk '/MemAvailable/{print $2}' /proc/meminfo)"
272
+ _mem_used_kb=$((_mem_total_kb - _mem_avail_kb))
273
+ _mem="$(awk "BEGIN{printf \"%.2f GiB / %.2f GiB\", ${_mem_used_kb}/1048576, ${_mem_total_kb}/1048576}")"
274
+ else
275
+ _mem="n/a"
276
+ fi
277
+
278
+ # Resolution (Wayland or X11)
279
+ if command -v wlr-randr >/dev/null 2>&1; then
280
+ _resolution="$(wlr-randr 2>/dev/null | awk '/current/{print $1; exit}' || echo "n/a")"
281
+ elif command -v xrandr >/dev/null 2>&1; then
282
+ _resolution="$(xrandr 2>/dev/null | awk '/\*/{print $1; exit}' || echo "n/a")"
283
+ elif command -v xdpyinfo >/dev/null 2>&1; then
284
+ _resolution="$(xdpyinfo 2>/dev/null | awk '/dimensions/{print $2}' || echo "n/a")"
285
+ else
286
+ _resolution="n/a"
287
+ fi
288
+
289
+ # Packages (multi-distro)
290
+ _pkg_count=0
291
+ _pkg_mgr="pkg"
292
+ if command -v dpkg >/dev/null 2>&1; then
293
+ _pkg_count="$(dpkg --get-selections 2>/dev/null | wc -l | tr -d ' ')"
294
+ _pkg_mgr="dpkg"
295
+ elif command -v rpm >/dev/null 2>&1; then
296
+ _pkg_count="$(rpm -qa 2>/dev/null | wc -l | tr -d ' ')"
297
+ _pkg_mgr="rpm"
298
+ elif command -v pacman >/dev/null 2>&1; then
299
+ _pkg_count="$(pacman -Q 2>/dev/null | wc -l | tr -d ' ')"
300
+ _pkg_mgr="pacman"
301
+ fi
302
+ _packages="${_pkg_count} (${_pkg_mgr})"
303
+
304
+ _de="${XDG_CURRENT_DESKTOP:-${DESKTOP_SESSION:-n/a}}"
305
+
67
306
  else
68
- log_success "PIPX_HOME=$PIPX_HOME"
307
+ # Fallback (unknown OS)
308
+ _os="$(uname -sr)"
309
+ _host="unknown"
310
+ _cpu="$(uname -p 2>/dev/null || echo "unknown")"
311
+ _cpu_cores="?"
312
+ _gpu="n/a"
313
+ _mem="n/a"
314
+ _resolution="n/a"
315
+ _packages="n/a"
316
+ _de="n/a"
317
+ fi
318
+
319
+ # WSL detection and overrides
320
+ _wsl=""
321
+ if [[ -f /proc/version ]] && grep -qi microsoft /proc/version 2>/dev/null; then
322
+ _wsl="yes"
323
+ _os="${_os} (WSL)"
324
+ _de="Windows Desktop (WSL)"
325
+ _terminal="${TERM_PROGRAM:-Windows Terminal}"
69
326
  fi
70
327
 
71
- # 3. Check Chezmoi State
72
- echo -e "\nChecking Chezmoi State..."
328
+ # Print platform info
329
+ _C='\033[0;36m'
330
+ _W='\033[1;37m'
331
+ _N='\033[0m'
332
+ _D='\033[2m'
333
+
334
+ printf '\n'
335
+ printf ' %b%s%b@%b%s%b\n' "$_C" "$_user" "$_N" "$_C" "$_hostname_val" "$_N"
336
+ printf ' %b%s%b\n' "$_D" "$(printf '%*s' "$((${#_user} + 1 + ${#_hostname_val}))" '' | tr ' ' '-')" "$_N"
337
+ printf ' %bOS:%b %s\n' "$_W" "$_N" "$_os"
338
+ printf ' %bHost:%b %s\n' "$_W" "$_N" "$_host"
339
+ printf ' %bKernel:%b %s\n' "$_W" "$_N" "$_kernel"
340
+ printf ' %bUptime:%b %s\n' "$_W" "$_N" "${_uptime:-n/a}"
341
+ printf ' %bPackages:%b %s\n' "$_W" "$_N" "$_packages"
342
+ printf ' %bShell:%b %s\n' "$_W" "$_N" "$_shell"
343
+ printf ' %bResolution:%b %s\n' "$_W" "$_N" "$_resolution"
344
+ printf ' %bDE:%b %s\n' "$_W" "$_N" "$_de"
345
+ printf ' %bTerminal:%b %s\n' "$_W" "$_N" "$_terminal"
346
+ printf ' %bCPU:%b %s (%s)\n' "$_W" "$_N" "$_cpu" "$_cpu_cores"
347
+ printf ' %bGPU:%b %s\n' "$_W" "$_N" "${_gpu:-n/a}"
348
+ printf ' %bMemory:%b %s\n' "$_W" "$_N" "$_mem"
349
+ printf ' %bArch:%b %s\n' "$_W" "$_N" "$_arch"
350
+
351
+ if [[ -n "$_wsl" ]]; then
352
+ echo ""
353
+ if command -v wslpath >/dev/null 2>&1; then
354
+ _ok "WSL bridge" "wslpath available"
355
+ else
356
+ _warn "WSL bridge" "wslpath missing"
357
+ fi
358
+ if [[ "$PWD" == /mnt/* ]]; then
359
+ _warn "WSL filesystem" "/mnt causes IO latency"
360
+ else
361
+ _ok "WSL filesystem" "native"
362
+ fi
363
+ fi
364
+
365
+ # --- State ---
366
+ _section "State"
73
367
  if chezmoi verify &>/dev/null; then
74
- log_success "Chezmoi state is synchronized"
368
+ _ok "chezmoi" "synchronized"
75
369
  else
76
- log_fail "Chezmoi state has drifted (Run 'dot drift' to see details)"
370
+ _fail "chezmoi" "drifted (run dot drift)"
77
371
  fi
78
372
 
79
- # 4. Check Critical Files
80
- echo -e "\nChecking Critical Files..."
81
373
  if [[ -f "$HOME/.zshrc" ]]; then
82
- log_success "Found .zshrc"
374
+ _ok ".zshrc" "present"
83
375
  else
84
- log_fail "Missing .zshrc"
376
+ _fail ".zshrc" "missing"
85
377
  fi
86
378
 
87
- # 5. Check for Broken Symlinks (Ghost Links)
88
- echo -e "\nChecking for Broken Symlinks..."
89
- broken_links=0
90
- while IFS= read -r -d '' link; do
91
- if [[ ! -e "$link" ]]; then
92
- log_warn "Broken symlink: $link -> $(readlink "$link")"
93
- broken_links=$((broken_links + 1))
379
+ if command -v dot >/dev/null 2>&1; then
380
+ dot_path="$(command -v dot)"
381
+ if [[ "$dot_path" == "$HOME/.local/bin/dot" ]]; then
382
+ _ok "dot" "$(pretty_path "$dot_path")"
383
+ else
384
+ _warn "dot" "$(pretty_path "$dot_path") (expected ~/.local/bin/dot)"
94
385
  fi
95
- done < <(find "$HOME" -maxdepth 3 -type l -print0 2>/dev/null)
386
+ else
387
+ _fail "dot" "not found in PATH"
388
+ fi
389
+
390
+ # --- Topgrade Integration ---
391
+ _section "Topgrade Integration"
392
+
393
+ if command -v antigravity >/dev/null 2>&1; then
394
+ ag_path="$(command -v antigravity)"
395
+ if [[ "$ag_path" == "$HOME/.local/bin/antigravity" ]]; then
396
+ _ok "antigravity wrapper" "$(pretty_path "$ag_path")"
397
+ else
398
+ _warn "antigravity wrapper" "$(pretty_path "$ag_path") (expected ~/.local/bin/antigravity)"
399
+ fi
400
+ else
401
+ _warn "antigravity" "optional"
402
+ fi
403
+
404
+ if [[ -f "$HOME/.config/fish/fish_plugins" ]]; then
405
+ if grep -qx "jorgebucaran/fisher" "$HOME/.config/fish/fish_plugins"; then
406
+ _ok "fish_plugins" "contains jorgebucaran/fisher"
407
+ else
408
+ _warn "fish_plugins" "present but missing jorgebucaran/fisher"
409
+ fi
410
+ else
411
+ _fail "fish_plugins" "missing (~/.config/fish/fish_plugins)"
412
+ fi
413
+
414
+ if command -v cargo-install-update >/dev/null 2>&1; then
415
+ _ok "cargo-install-update" "$(pretty_path "$(command -v cargo-install-update)")"
416
+ else
417
+ _warn "cargo-install-update" "missing (install: cargo install cargo-update)"
418
+ fi
419
+
420
+ # --- Symlinks ---
421
+ broken_links=0
422
+ for root in "$HOME/.config" "$HOME/.local/bin" "$HOME/.local/share" "$HOME/.ssh"; do
423
+ [[ -d "$root" ]] || continue
424
+ while IFS= read -r -d '' link; do
425
+ link_name="$(basename "$link")"
426
+ [[ "$link" == *"google-chrome-backup"* ]] && continue
427
+ [[ "$link_name" == SingletonLock || "$link_name" == SingletonCookie || "$link_name" == SingletonSocket ]] && continue
428
+ [[ -e "$link" ]] || broken_links=$((broken_links + 1))
429
+ done < <(find "$root" -maxdepth 3 -type l -print0 2>/dev/null)
430
+ done
96
431
 
97
432
  if [[ $broken_links -eq 0 ]]; then
98
- log_success "No broken symlinks found"
433
+ _ok "symlinks" "none broken"
434
+ else
435
+ _warn "symlinks" "$broken_links broken"
436
+ fi
437
+
438
+ # --- Portability ---
439
+ ghost_paths=0
440
+ if command -v chezmoi >/dev/null 2>&1; then
441
+ while IFS= read -r managed_path; do
442
+ [[ "$managed_path" == "$HOME/.config/"* ]] || continue
443
+ [[ -f "$managed_path" ]] || continue
444
+ grep -Iq . "$managed_path" 2>/dev/null || continue
445
+
446
+ match_count=$(
447
+ grep -nE '"/home/(linuxbrew)?[^$]|/Users/[^$]' "$managed_path" 2>/dev/null |
448
+ grep -v "linuxbrew" |
449
+ grep -v "/mozilla/firefox" |
450
+ grep -v "/google-chrome" |
451
+ grep -v "/chromium" |
452
+ grep -v "/chezmoi/chezmoi.toml" |
453
+ grep -v "/bun/" |
454
+ grep -v "/.bun/" |
455
+ grep -v "/noctalia/" |
456
+ grep -c -v -- "-backup/" ||
457
+ true
458
+ )
459
+
460
+ ghost_paths=$((ghost_paths + ${match_count:-0}))
461
+ done < <(chezmoi managed --path-style=absolute 2>/dev/null || true)
462
+
463
+ if [[ $ghost_paths -gt 0 ]]; then
464
+ _warn "portability" "$ghost_paths hardcoded paths in managed ~/.config files"
465
+ else
466
+ _ok "portability" "no hardcoded paths in managed ~/.config files"
467
+ fi
468
+ else
469
+ _warn "portability" "chezmoi not found (scan skipped)"
470
+ fi
471
+
472
+ # --- Performance ---
473
+ _section "Performance"
474
+
475
+ # Check shell cache freshness — stale caches force runtime regeneration
476
+ stale_caches=0
477
+ stale_tools=""
478
+ cache_base="${XDG_CACHE_HOME:-$HOME/.cache}"
479
+ for tool in mise starship zoxide atuin fzf direnv; do
480
+ tool_bin="$(command -v "$tool" 2>/dev/null || true)"
481
+ [[ -n "$tool_bin" ]] || continue
482
+ for shell_dir in zsh bash fish; do
483
+ case "$shell_dir" in
484
+ fish) cache_file="$cache_base/$shell_dir/${tool}-init.fish" ;;
485
+ *) cache_file="$cache_base/$shell_dir/${tool}-init.$shell_dir" ;;
486
+ esac
487
+ if [[ ! -f "$cache_file" ]] || [[ "$tool_bin" -nt "$cache_file" ]]; then
488
+ stale_caches=$((stale_caches + 1))
489
+ # Track unique tool names for the summary
490
+ case "$stale_tools" in
491
+ *"$tool"*) ;;
492
+ *) stale_tools="${stale_tools:+$stale_tools, }$tool" ;;
493
+ esac
494
+ break # one stale shell is enough to flag the tool
495
+ fi
496
+ done
497
+ done
498
+
499
+ if [[ $stale_caches -eq 0 ]]; then
500
+ _ok "shell caches" "fresh"
99
501
  else
100
- log_warn "$broken_links broken symlink(s) detected"
502
+ _warn "shell caches" "stale ($stale_tools) — run dot prewarm"
101
503
  fi
102
504
 
103
- # Summary
104
- echo -e "\n-------------------------------------"
505
+ if command -v hyperfine >/dev/null 2>&1; then
506
+ if bash "$SCRIPT_DIR/../../tests/performance/bench.sh" 2>/dev/null; then
507
+ _ok "startup latency" "within target thresholds"
508
+ else
509
+ _warn "startup latency" "threshold exceeded (run dot prewarm)"
510
+ fi
511
+ else
512
+ _warn "hyperfine" "missing (benchmark skipped)"
513
+ fi
514
+
515
+ # --- Summary ---
516
+ dot_log info "doctor_complete" "errors=$Errors" "warnings=$Warnings"
517
+ dot_metric "doctor_errors" "$Errors" "count"
518
+ dot_metric "doctor_warnings" "$Warnings" "count"
519
+ echo ""
105
520
  if [[ $Errors -eq 0 ]]; then
106
521
  if [[ $Warnings -eq 0 ]]; then
107
- echo -e "${GREEN}All systems healthy! ${NC}"
522
+ ui_ok "Healthy" "All checks passed."
108
523
  else
109
- echo -e "${YELLOW}System healthy with $Warnings warnings.${NC}"
524
+ ui_ok "Healthy" "$Warnings warning(s)."
110
525
  fi
111
526
  else
112
- echo -e "${RED}Found $Errors errors and $Warnings warnings.${NC}"
113
- echo "Run 'dot heal' to attempt auto-repair."
527
+ ui_err "$Errors error(s)" "$Warnings warning(s). Run 'dot heal' to repair."
528
+
529
+ if [[ $AI_DEBUG -eq 1 ]]; then
530
+ _section "AI Problem Analysis"
531
+ doctor_report=$(~/.local/bin/dot doctor | grep -E "(✗|⚠)")
532
+ ai_prompt="The dotfiles diagnostic 'dot doctor' found the following issues:
533
+ ---
534
+ $doctor_report
535
+ ---
536
+ Suggest specific shell commands to fix these issues according to our architectural standards."
537
+ dot cl --pattern hardener "$ai_prompt"
538
+ fi
114
539
  exit 1
115
540
  fi
541
+ echo ""