@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,428 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## Secure Configuration Management.
4
+ ##
5
+ ## Manages environment variables and secrets across local development.
6
+ ## Provides init, validate, rotate, and audit capabilities for credentials.
7
+ ##
8
+ ## # Usage
9
+ ## manage-secrets.sh init # Create .env.local from template
10
+ ## manage-secrets.sh validate # Check configuration integrity
11
+ ## manage-secrets.sh check # Scan for hardcoded secrets
12
+ ## manage-secrets.sh rotate github # Secret rotation guide
13
+ ## manage-secrets.sh clean # Remove temporary files
14
+ ##
15
+ ## # Dependencies
16
+ ## - stat: Permission checking
17
+ ## - grep: Pattern matching
18
+ ## - find: File discovery
19
+ ##
20
+ ## # Platform Notes
21
+ ## - macOS: Uses BSD stat syntax
22
+ ## - Linux: Uses GNU stat syntax
23
+ ## - WSL: Works with Linux filesystem permissions
24
+ ##
25
+ ## # Security
26
+ ## - Creates .env.local with 600 permissions
27
+ ## - Automatically adds .env.local to .gitignore
28
+ ## - Never commits secrets to version control
29
+ ##
30
+ ## # Idempotency
31
+ ## Safe to run repeatedly. init requires --force to overwrite.
32
+
33
+ set -euo pipefail
34
+
35
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
36
+ readonly SCRIPT_DIR
37
+ REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
38
+ readonly REPO_ROOT
39
+ readonly ENV_TEMPLATE="${REPO_ROOT}/.github/security-policies/environment-template.env"
40
+ readonly ENV_LOCAL="${REPO_ROOT}/.env.local"
41
+
42
+ # shellcheck source=../dot/lib/ui.sh
43
+ # shellcheck disable=SC1091
44
+ source "${SCRIPT_DIR}/../dot/lib/ui.sh"
45
+ ui_init
46
+
47
+ # Help text
48
+ show_help() {
49
+ cat <<EOF
50
+ Secure Configuration Management
51
+
52
+ USAGE:
53
+ $0 <command> [options]
54
+
55
+ COMMANDS:
56
+ init Initialize secure environment configuration
57
+ validate Validate environment variables and security
58
+ template Show environment variable template
59
+ check Check for hardcoded secrets
60
+ rotate Help rotate secrets and tokens
61
+ clean Clean temporary files and logs
62
+
63
+ OPTIONS:
64
+ -h, --help Show this help message
65
+ -v, --verbose Verbose output
66
+ -f, --force Force operations (use with caution)
67
+
68
+ EXAMPLES:
69
+ $0 init # Initialize .env.local from template
70
+ $0 validate # Validate current configuration
71
+ $0 check # Scan for hardcoded secrets
72
+ $0 rotate github # Guide for rotating GitHub tokens
73
+ $0 clean # Clean up temporary files
74
+
75
+ SECURITY NOTES:
76
+ - Never commit .env.local to version control
77
+ - Use different tokens for different environments
78
+ - Rotate secrets regularly (every 90 days)
79
+ - Use least-privilege principle
80
+ EOF
81
+ }
82
+
83
+ # Logging functions — delegate to shared ui.sh
84
+ log_info() { ui_info "$@"; }
85
+ log_success() { ui_ok "$@"; }
86
+ log_warning() { ui_warn "$@"; }
87
+ log_error() { ui_err "$@"; }
88
+
89
+ # Initialize environment configuration
90
+ init_config() {
91
+ local force_init=false
92
+ if [[ "${1:-}" == "--force" ]]; then
93
+ force_init=true
94
+ fi
95
+
96
+ log_info "Initializing secure environment configuration..."
97
+
98
+ if [[ -f "$ENV_LOCAL" ]] && [[ "$force_init" == "false" ]]; then
99
+ log_warning ".env.local already exists"
100
+ echo "Use --force to overwrite, or edit the existing file manually"
101
+ return 1
102
+ fi
103
+
104
+ if [[ ! -f "$ENV_TEMPLATE" ]]; then
105
+ log_error "Environment template not found: $ENV_TEMPLATE"
106
+ return 1
107
+ fi
108
+
109
+ # Copy template
110
+ cp "$ENV_TEMPLATE" "$ENV_LOCAL"
111
+
112
+ # Set secure permissions
113
+ chmod 600 "$ENV_LOCAL"
114
+
115
+ log_success ".env.local created from template"
116
+ log_info "Next steps:"
117
+ echo " 1. Edit .env.local and configure required variables"
118
+ echo " 2. Run '$0 validate' to check configuration"
119
+ # shellcheck disable=SC1091
120
+ echo " 3. Source the file: source .env.local"
121
+
122
+ # Add to .gitignore if not present
123
+ if [[ -f "${REPO_ROOT}/.gitignore" ]]; then
124
+ if ! grep -q "\.env\.local" "${REPO_ROOT}/.gitignore"; then
125
+ echo ".env.local" >>"${REPO_ROOT}/.gitignore"
126
+ log_info "Added .env.local to .gitignore"
127
+ fi
128
+ fi
129
+ }
130
+
131
+ # Validate environment configuration
132
+ validate_config() {
133
+ log_info "Validating environment configuration..."
134
+
135
+ local issues=0
136
+
137
+ # Check if .env.local exists
138
+ if [[ ! -f "$ENV_LOCAL" ]]; then
139
+ log_error ".env.local not found. Run '$0 init' to create it."
140
+ return 1
141
+ fi
142
+
143
+ # Check file permissions
144
+ local perms
145
+ perms=$(stat -c %a "$ENV_LOCAL" 2>/dev/null || stat -f %OLp "$ENV_LOCAL")
146
+ if [[ "$perms" != "600" ]]; then
147
+ log_warning ".env.local has incorrect permissions ($perms). Should be 600."
148
+ log_info "Fix with: chmod 600 $ENV_LOCAL"
149
+ issues=$((issues + 1))
150
+ fi
151
+
152
+ # Source and validate environment
153
+ # shellcheck source=/dev/null
154
+ # shellcheck disable=SC1091
155
+ if source "$ENV_LOCAL" 2>/dev/null; then
156
+ log_success ".env.local loads successfully"
157
+ else
158
+ log_error ".env.local has syntax errors"
159
+ issues=$((issues + 1))
160
+ fi
161
+
162
+ # Check for required variables
163
+ local required_vars=("GITHUB_TOKEN")
164
+
165
+ for var in "${required_vars[@]}"; do
166
+ if [[ -z "${!var:-}" ]]; then
167
+ log_warning "Required variable $var is not set or empty"
168
+ issues=$((issues + 1))
169
+ else
170
+ log_success "$var is configured"
171
+ fi
172
+ done
173
+
174
+ # Check for security patterns
175
+ if grep -E '(password|secret|key|token)="[^"]{1,}"' "$ENV_LOCAL" >/dev/null 2>&1; then
176
+ log_warning "Found configured credentials (this is expected)"
177
+ fi
178
+
179
+ if [[ $issues -eq 0 ]]; then
180
+ log_success "Environment configuration is valid"
181
+ return 0
182
+ else
183
+ log_error "Found $issues configuration issues"
184
+ return 1
185
+ fi
186
+ }
187
+
188
+ # Show template
189
+ show_template() {
190
+ if [[ -f "$ENV_TEMPLATE" ]]; then
191
+ log_info "Environment variable template:"
192
+ echo "----------------------------------------"
193
+ cat "$ENV_TEMPLATE"
194
+ else
195
+ log_error "Template file not found: $ENV_TEMPLATE"
196
+ return 1
197
+ fi
198
+ }
199
+
200
+ # Check for hardcoded secrets
201
+ check_secrets() {
202
+ log_info "Scanning for hardcoded secrets..."
203
+
204
+ local violations=0
205
+
206
+ # Define patterns to search for
207
+ local patterns=(
208
+ 'password\s*=\s*["\047][^"\047]*["\047]'
209
+ 'token\s*=\s*["\047][^"\047]*["\047]'
210
+ 'secret\s*=\s*["\047][^"\047]*["\047]'
211
+ 'key\s*=\s*["\047][^"\047]*["\047]'
212
+ 'AKIA[0-9A-Z]{16}' # AWS Access Key
213
+ 'ghp_[A-Za-z0-9_]{36}' # GitHub Personal Access Token
214
+ '[0-9a-f]{32,64}' # Potential hash/token
215
+ )
216
+
217
+ # Search in specific file types
218
+ local file_patterns=("*.sh" "*.yml" "*.yaml" "*.toml" "*.json" "*.tmpl")
219
+
220
+ for file_pattern in "${file_patterns[@]}"; do
221
+ while IFS= read -r -d '' file; do
222
+ # Skip the security management files themselves
223
+ if [[ "$file" =~ (environment-template\.env|manage-secrets\.sh|\.env\.local) ]]; then
224
+ continue
225
+ fi
226
+
227
+ for pattern in "${patterns[@]}"; do
228
+ if grep -H -n -E -i "$pattern" "$file" 2>/dev/null; then
229
+ log_warning "Potential secret in $file"
230
+ violations=$((violations + 1))
231
+ fi
232
+ done
233
+ done < <(find "$REPO_ROOT" -name "$file_pattern" -not -path "*/.git/*" -print0)
234
+ done
235
+
236
+ if [[ $violations -eq 0 ]]; then
237
+ log_success "No hardcoded secrets detected"
238
+ else
239
+ log_error "Found $violations potential hardcoded secrets"
240
+ log_info "Review the output above and replace with environment variables"
241
+ fi
242
+
243
+ return $violations
244
+ }
245
+
246
+ # Guide for rotating secrets
247
+ rotate_secrets() {
248
+ local service="${1:-}"
249
+
250
+ if [[ -z "$service" ]]; then
251
+ log_info "Available rotation guides:"
252
+ echo " github - GitHub Personal Access Tokens"
253
+ echo " aws - AWS Access Keys"
254
+ echo " gcp - GCP Service Account Keys"
255
+ echo " ssh - SSH Keys"
256
+ echo ""
257
+ echo "Usage: $0 rotate <service>"
258
+ return 0
259
+ fi
260
+
261
+ case "$service" in
262
+ "github")
263
+ cat <<'EOF'
264
+ GitHub Token Rotation Guide:
265
+
266
+ 1. Create new Personal Access Token:
267
+ - Go to https://github.com/settings/tokens
268
+ - Click "Generate new token (classic)"
269
+ - Set expiration (90 days recommended)
270
+ - Select minimal required scopes:
271
+ • repo (for private repos)
272
+ • workflow (for GitHub Actions)
273
+
274
+ 2. Update environment:
275
+ - Edit .env.local
276
+ - Replace GITHUB_TOKEN value
277
+ - Test with: gh auth status
278
+
279
+ 3. Update CI/CD:
280
+ - Go to repository Settings → Secrets and variables → Actions
281
+ - Update GITHUB_TOKEN secret
282
+
283
+ 4. Revoke old token:
284
+ - Go back to https://github.com/settings/tokens
285
+ - Find old token and click "Delete"
286
+
287
+ 5. Verify:
288
+ - Run: scripts/security/manage-secrets.sh validate
289
+ - Test repository operations
290
+ EOF
291
+ ;;
292
+ "aws")
293
+ cat <<'EOF'
294
+ AWS Access Key Rotation Guide:
295
+
296
+ 1. Create new access key:
297
+ - AWS Console → IAM → Users → [Your User] → Security credentials
298
+ - Click "Create access key"
299
+ - Download credentials
300
+
301
+ 2. Update environment:
302
+ - Edit .env.local
303
+ - Update AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
304
+ - Test with: aws sts get-caller-identity
305
+
306
+ 3. Update CI/CD:
307
+ - Update secrets in GitHub repository
308
+ - Test AWS operations in pipeline
309
+
310
+ 4. Deactivate old key:
311
+ - In AWS Console, set old key status to "Inactive"
312
+ - Wait 24-48 hours, monitor for issues
313
+ - Delete old key if no issues
314
+
315
+ 5. Security best practices:
316
+ - Use IAM roles where possible
317
+ - Implement least privilege access
318
+ - Enable CloudTrail logging
319
+ EOF
320
+ ;;
321
+ "ssh")
322
+ cat <<'EOF'
323
+ SSH Key Rotation Guide:
324
+
325
+ 1. Generate new SSH key:
326
+ - Run: ssh-keygen -t ed25519 -C "your_email@example.com"
327
+ - Save to new file: ~/.ssh/id_ed25519_new
328
+
329
+ 2. Add to SSH agent:
330
+ - Run: ssh-add ~/.ssh/id_ed25519_new
331
+
332
+ 3. Update remote services:
333
+ - GitHub: Settings → SSH and GPG keys → Add new key
334
+ - Servers: Add to ~/.ssh/authorized_keys
335
+
336
+ 4. Update local config:
337
+ - Edit ~/.ssh/config
338
+ - Update IdentityFile paths
339
+
340
+ 5. Test connections:
341
+ - ssh -T git@github.com
342
+ - Test server connections
343
+
344
+ 6. Remove old keys:
345
+ - Remove from remote authorized_keys
346
+ - Remove from local ~/.ssh/
347
+ - Remove from SSH agent
348
+ EOF
349
+ ;;
350
+ *)
351
+ log_error "Unknown service: $service"
352
+ log_info "Available services: github, aws, gcp, ssh"
353
+ return 1
354
+ ;;
355
+ esac
356
+ }
357
+
358
+ # Clean temporary files
359
+ clean_files() {
360
+ log_info "Cleaning temporary files and logs..."
361
+
362
+ local files_to_clean=(
363
+ "${REPO_ROOT}/.security-audit.log"
364
+ "${REPO_ROOT}/security-report.md"
365
+ "${REPO_ROOT}/trivy-results.sarif"
366
+ "${REPO_ROOT}/grype-results.sarif"
367
+ "${REPO_ROOT}/checkov-results.sarif"
368
+ "${REPO_ROOT}/shellcheck-results.sarif"
369
+ "${REPO_ROOT}/container-scan.sarif"
370
+ "${REPO_ROOT}/security-attestation.json"
371
+ )
372
+
373
+ local cleaned=0
374
+ for file in "${files_to_clean[@]}"; do
375
+ if [[ -f "$file" ]]; then
376
+ rm "$file"
377
+ log_success "Removed $file"
378
+ cleaned=$((cleaned + 1))
379
+ fi
380
+ done
381
+
382
+ if [[ $cleaned -eq 0 ]]; then
383
+ log_info "No temporary files to clean"
384
+ else
385
+ log_success "Cleaned $cleaned temporary files"
386
+ fi
387
+ }
388
+
389
+ # Main function
390
+ main() {
391
+ local command="${1:-}"
392
+ shift || true
393
+
394
+ case "$command" in
395
+ "init")
396
+ init_config "$@"
397
+ ;;
398
+ "validate")
399
+ validate_config
400
+ ;;
401
+ "template")
402
+ show_template
403
+ ;;
404
+ "check")
405
+ check_secrets
406
+ ;;
407
+ "rotate")
408
+ rotate_secrets "$@"
409
+ ;;
410
+ "clean")
411
+ clean_files
412
+ ;;
413
+ "-h" | "--help" | "help" | "")
414
+ show_help
415
+ ;;
416
+ *)
417
+ log_error "Unknown command: $command"
418
+ echo ""
419
+ show_help
420
+ exit 1
421
+ ;;
422
+ esac
423
+ }
424
+
425
+ # Execute if run directly
426
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
427
+ main "$@"
428
+ fi
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck shell=bash
4
+ set -euo pipefail
5
+
6
+ # ssh-cert.sh — Short-lived SSH certificate management
7
+ #
8
+ # Supports step-ca (Smallstep) and ssh-keygen-based CA workflows.
9
+ # Short-lived certificates reduce the blast radius of key compromise
10
+ # by expiring automatically (default: 16 hours).
11
+ #
12
+ # Usage:
13
+ # dot ssh-cert issue [--ttl 16h] [--principal user]
14
+ # dot ssh-cert status
15
+ # dot ssh-cert revoke
16
+
17
+ # ---------- configuration -------------------------------------------------- #
18
+
19
+ SSH_DIR="${HOME}/.ssh"
20
+ CERT_FILE="${SSH_DIR}/id_ed25519-cert.pub"
21
+ KEY_FILE="${SSH_DIR}/id_ed25519"
22
+ DEFAULT_TTL="${SSH_CERT_TTL:-16h}"
23
+ DEFAULT_PRINCIPAL="${SSH_CERT_PRINCIPAL:-${USER}}"
24
+ CA_URL="${SSH_CERT_CA_URL:-}"
25
+ CA_PROVISIONER="${SSH_CERT_CA_PROVISIONER:-}"
26
+
27
+ # ---------- helpers -------------------------------------------------------- #
28
+
29
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
+ # shellcheck source=../dot/lib/ui.sh
31
+ # shellcheck disable=SC1091
32
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
33
+ ui_init
34
+
35
+ info() { ui_info "ssh-cert" "$*"; }
36
+ warn() { ui_warn "ssh-cert" "$*"; }
37
+ error() {
38
+ ui_err "ssh-cert" "$*"
39
+ exit 1
40
+ }
41
+
42
+ check_key() {
43
+ if [[ ! -f "$KEY_FILE" ]]; then
44
+ error "SSH key not found at $KEY_FILE. Generate one with: ssh-keygen -t ed25519"
45
+ fi
46
+ }
47
+
48
+ # ---------- issue ---------------------------------------------------------- #
49
+
50
+ cmd_issue() {
51
+ local ttl="$DEFAULT_TTL"
52
+ local principal="$DEFAULT_PRINCIPAL"
53
+
54
+ while [[ $# -gt 0 ]]; do
55
+ case "$1" in
56
+ --ttl)
57
+ ttl="$2"
58
+ shift 2
59
+ ;;
60
+ --principal)
61
+ principal="$2"
62
+ shift 2
63
+ ;;
64
+ *) error "Unknown option: $1" ;;
65
+ esac
66
+ done
67
+
68
+ check_key
69
+
70
+ # Method 1: step-ca (Smallstep) — preferred for production
71
+ if command -v step >/dev/null 2>&1 && [[ -n "$CA_URL" ]]; then
72
+ info "Requesting certificate from step-ca ($CA_URL)..."
73
+ local step_args=(ssh certificate "$principal" "$KEY_FILE"
74
+ --sign
75
+ --not-after "$ttl"
76
+ --ca-url "$CA_URL"
77
+ --force
78
+ )
79
+ if [[ -n "$CA_PROVISIONER" ]]; then
80
+ step_args+=(--provisioner "$CA_PROVISIONER")
81
+ fi
82
+ step "${step_args[@]}"
83
+ info "Certificate issued:"
84
+ step ssh inspect "$CERT_FILE"
85
+ return 0
86
+ fi
87
+
88
+ # Method 2: ssh-keygen with a local CA (for dev/testing)
89
+ local ca_key="${SSH_DIR}/ca_key"
90
+ if [[ ! -f "$ca_key" ]]; then
91
+ warn "No step-ca configured and no local CA key found."
92
+ echo ""
93
+ echo "To use short-lived SSH certificates, choose one of:"
94
+ echo ""
95
+ echo " Option A: Smallstep step-ca (recommended for production)"
96
+ echo " 1. Install: brew install step / sudo pacman -S step-cli step-ca"
97
+ echo " 2. Initialize CA: step ca init --name 'My CA' --provisioner admin"
98
+ echo " 3. Start CA: step-ca \$(step path)/config/ca.json"
99
+ echo " 4. Configure: export SSH_CERT_CA_URL=https://ca.example.com"
100
+ echo " 5. Run: dot ssh-cert issue"
101
+ echo ""
102
+ echo " Option B: Local CA key (for development/testing)"
103
+ echo " 1. Generate CA: ssh-keygen -t ed25519 -f ~/.ssh/ca_key -C 'local-ca'"
104
+ echo " 2. Run: dot ssh-cert issue"
105
+ echo ""
106
+ echo " Environment variables:"
107
+ echo " SSH_CERT_CA_URL step-ca server URL"
108
+ echo " SSH_CERT_CA_PROVISIONER step-ca provisioner name"
109
+ echo " SSH_CERT_TTL Certificate lifetime (default: 16h)"
110
+ echo " SSH_CERT_PRINCIPAL Certificate principal (default: \$USER)"
111
+ return 1
112
+ fi
113
+
114
+ info "Signing with local CA key ($ca_key)..."
115
+ info "TTL: $ttl, Principal: $principal"
116
+
117
+ # Parse TTL to seconds for validity
118
+ local validity="-${ttl}:+${ttl}"
119
+
120
+ ssh-keygen \
121
+ -s "$ca_key" \
122
+ -I "${principal}@$(hostname)-$(date +%s)" \
123
+ -n "$principal" \
124
+ -V "$validity" \
125
+ "${KEY_FILE}.pub"
126
+
127
+ info "Certificate issued:"
128
+ ssh-keygen -L -f "$CERT_FILE"
129
+ info "Expires automatically after $ttl"
130
+ }
131
+
132
+ # ---------- status --------------------------------------------------------- #
133
+
134
+ cmd_status() {
135
+ if [[ ! -f "$CERT_FILE" ]]; then
136
+ info "No SSH certificate found at $CERT_FILE"
137
+ return 0
138
+ fi
139
+
140
+ info "Current certificate:"
141
+ ssh-keygen -L -f "$CERT_FILE"
142
+
143
+ # Check expiry
144
+ local valid_to
145
+ valid_to=$(ssh-keygen -L -f "$CERT_FILE" 2>/dev/null | grep "Valid:" | sed 's/.*to //')
146
+ if [[ -n "$valid_to" ]]; then
147
+ local expiry_epoch
148
+ expiry_epoch=$(date -d "$valid_to" +%s 2>/dev/null || date -j -f "%Y-%m-%dT%H:%M:%S" "$valid_to" +%s 2>/dev/null || echo 0)
149
+ local now_epoch
150
+ now_epoch=$(date +%s)
151
+ if ((expiry_epoch > 0 && expiry_epoch < now_epoch)); then
152
+ warn "Certificate has EXPIRED"
153
+ return 1
154
+ else
155
+ local remaining=$(((expiry_epoch - now_epoch) / 3600))
156
+ info "Certificate valid for ~${remaining}h"
157
+ fi
158
+ fi
159
+ }
160
+
161
+ # ---------- revoke --------------------------------------------------------- #
162
+
163
+ cmd_revoke() {
164
+ if [[ ! -f "$CERT_FILE" ]]; then
165
+ info "No certificate to revoke"
166
+ return 0
167
+ fi
168
+
169
+ # Step-ca revocation
170
+ if command -v step >/dev/null 2>&1 && [[ -n "$CA_URL" ]]; then
171
+ info "Revoking certificate via step-ca..."
172
+ step ssh revoke "$CERT_FILE" --ca-url "$CA_URL" || true
173
+ fi
174
+
175
+ # Local removal
176
+ rm -f "$CERT_FILE"
177
+ info "Certificate removed: $CERT_FILE"
178
+ }
179
+
180
+ # ---------- main ----------------------------------------------------------- #
181
+
182
+ subcommand="${1:-}"
183
+ shift 2>/dev/null || true
184
+
185
+ case "$subcommand" in
186
+ issue) cmd_issue "$@" ;;
187
+ status) cmd_status ;;
188
+ revoke) cmd_revoke ;;
189
+ *)
190
+ echo "Usage: dot ssh-cert <command>"
191
+ echo ""
192
+ echo "Commands:"
193
+ echo " issue [--ttl 16h] [--principal user] Request a short-lived certificate"
194
+ echo " status Show current certificate status"
195
+ echo " revoke Revoke and remove certificate"
196
+ echo ""
197
+ echo "Environment:"
198
+ echo " SSH_CERT_CA_URL step-ca server URL (enables Smallstep mode)"
199
+ echo " SSH_CERT_CA_PROVISIONER step-ca provisioner name"
200
+ echo " SSH_CERT_TTL Certificate lifetime (default: 16h)"
201
+ echo " SSH_CERT_PRINCIPAL Certificate principal (default: \$USER)"
202
+ ;;
203
+ esac
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ # shellcheck source=../dot/lib/ui.sh
7
+ # shellcheck disable=SC1091
8
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
+ # shellcheck source=../dot/lib/platform.sh
10
+ # shellcheck disable=SC1091
11
+ source "$SCRIPT_DIR/../dot/lib/platform.sh"
12
+
13
+ DRY_RUN=0
14
+ for arg in "$@"; do
15
+ case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
16
+ done
17
+ _run_cmd() {
18
+ if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
19
+ }
20
+
21
+ ui_init
22
+ ui_header "Telemetry"
23
+
24
+ if [[ "$DRY_RUN" -eq 1 ]]; then
25
+ ui_info "Mode" "dry-run (no changes will be made)"
26
+ elif [ "${DOTFILES_TELEMETRY:-}" != "1" ]; then
27
+ ui_warn "Telemetry" "disabled by default"
28
+ ui_info "Re-run" "DOTFILES_TELEMETRY=1"
29
+ exit 1
30
+ fi
31
+
32
+ case "$(dot_platform_id)" in
33
+ linux | wsl)
34
+ ui_info "Disabling" "Ubuntu crash reporting (whoopsie/apport)"
35
+ _run_cmd sudo systemctl disable --now whoopsie 2>/dev/null || true
36
+ _run_cmd sudo systemctl disable --now apport 2>/dev/null || true
37
+ _run_cmd sudo systemctl mask apport 2>/dev/null || true
38
+ ui_info "Disabling" "popularity-contest"
39
+ _run_cmd sudo systemctl disable --now popularity-contest 2>/dev/null || true
40
+ ;;
41
+ macos)
42
+ ui_info "Disabling" "macOS analytics"
43
+ _run_cmd sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist AutoSubmit -bool false || true
44
+ _run_cmd sudo defaults write /Library/Application\ Support/CrashReporter/DiagnosticMessagesHistory.plist ThirdPartyDataSubmit -bool false || true
45
+ ;;
46
+ *)
47
+ ui_err "Unsupported OS" "telemetry kill"
48
+ exit 1
49
+ ;;
50
+ esac