@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.
- package/CHANGELOG.md +375 -0
- package/LICENSE +1283 -0
- package/README.md +284 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
- package/docs/AI.md +102 -0
- package/docs/COPYRIGHT +4 -3
- package/docs/NAMING_CONVENTIONS.md +95 -0
- package/docs/README.md +78 -0
- package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
- package/docs/adr/ADR-002-shell-performance.md +121 -0
- package/docs/adr/ADR-003-security-first.md +140 -0
- package/docs/adr/ADR-004-cli-architecture.md +157 -0
- package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
- package/docs/adr/ADR-006-shell-selection.md +115 -0
- package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
- package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
- package/docs/adr/README.md +32 -0
- package/docs/architecture/ARCHITECTURE.md +113 -0
- package/docs/architecture/INTEROP.md +36 -0
- package/docs/architecture/REPO_LAYOUT.md +237 -0
- package/docs/architecture/WALKTHROUGH.md +82 -0
- package/docs/architecture/fleet-deployment.md +73 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
- package/docs/archive/LEGACY_ROADMAP.md +142 -0
- package/docs/archive/MILESTONE_v0.2.493.md +43 -0
- package/docs/{PLAN.md → archive/PLAN.md} +4 -4
- package/docs/archive/REPO_AUDIT.md +23 -0
- package/docs/guides/INSTALL.md +140 -0
- package/docs/guides/NEOVIM_IDE_GUIDE.md +52 -0
- package/docs/guides/THEMING.md +222 -0
- package/docs/guides/TROUBLESHOOTING.md +148 -0
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +723 -0
- package/docs/index.md +39 -0
- package/docs/interop/A2A.md +32 -0
- package/docs/manual/00-introduction.md +85 -0
- package/docs/manual/01-concepts/01-architecture.md +134 -0
- package/docs/manual/01-concepts/02-trust-model.md +178 -0
- package/docs/manual/01-concepts/03-theme-engine.md +182 -0
- package/docs/manual/01-concepts/04-fleet.md +142 -0
- package/docs/manual/01-concepts/05-self-healing.md +197 -0
- package/docs/manual/02-tutorials/01-first-install.md +192 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
- package/docs/manual/02-tutorials/03-create-profile.md +238 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
- package/docs/manual/03-reference/01-dot-cli.md +413 -0
- package/docs/manual/03-reference/02-config-files.md +259 -0
- package/docs/manual/03-reference/03-environment.md +120 -0
- package/docs/manual/03-reference/04-templates.md +184 -0
- package/docs/manual/03-reference/05-feature-flags.md +118 -0
- package/docs/manual/04-cookbook/01-recipes.md +281 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
- package/docs/manual/04-cookbook/03-faq.md +167 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
- package/docs/manual/05-appendices/B-security-checklist.md +78 -0
- package/docs/manual/05-appendices/C-glossary.md +36 -0
- package/docs/manual/05-appendices/D-bibliography.md +54 -0
- package/docs/manual/05-appendices/E-license.md +34 -0
- package/docs/manual/_toc.yml +58 -0
- package/docs/manual/command-index.md +58 -0
- package/docs/manual/concept-index.md +164 -0
- package/docs/operations/ATTESTATION.md +39 -0
- package/docs/operations/MAINTENANCE.md +59 -0
- package/docs/operations/MIGRATION.md +101 -0
- package/docs/operations/OPERATIONS.md +164 -0
- package/docs/operations/RELIABILITY.md +116 -0
- package/docs/{ROADMAP.md → operations/ROADMAP.md} +22 -22
- package/docs/operations/TESTING.md +195 -0
- package/docs/operations/TRACEABILITY.md +31 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
- package/docs/operations/VERSION_SYNC.md +344 -0
- package/docs/reference/ALIASES.md +124 -0
- package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
- package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
- package/docs/reference/FEATURES.md +62 -0
- package/docs/reference/FONTS.md +108 -0
- package/docs/reference/PROFILES.md +65 -0
- package/docs/reference/SCREENSHOTS.md +117 -0
- package/docs/reference/SCRIPTS.md +67 -0
- package/docs/reference/SUPPORT_MATRIX.md +74 -0
- package/docs/reference/THEMES.md +113 -0
- package/docs/reference/TOOLS.md +105 -0
- package/docs/reference/UTILS.md +151 -0
- package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
- package/docs/security/AUTOMATION_SECRETS.md +22 -0
- package/docs/security/COMPLIANCE.md +453 -0
- package/docs/security/ENCRYPTION.md +52 -0
- package/docs/security/FMEA.md +155 -0
- package/docs/security/INCIDENT_RESPONSE.md +575 -0
- package/docs/security/KEYS.md +45 -0
- package/docs/security/KEY_ROTATION.md +219 -0
- package/docs/security/MCP_POLICY.md +69 -0
- package/docs/security/POLICY_RELEASES.md +33 -0
- package/docs/security/README.md +24 -0
- package/docs/security/SECRETS.md +146 -0
- package/docs/security/SECURITY.md +41 -0
- package/docs/security/SECURITY_CHECKLIST.md +44 -0
- package/docs/security/SOUP_REGISTER.md +32 -0
- package/docs/security/THREAT_MODEL.md +120 -0
- package/docs/security/VERIFICATION_VALIDATION.md +224 -0
- package/docs/themes/README.md +6 -0
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
- package/docs/themes/hero-shot.svg +78 -0
- package/dot_config/.module-manifest.json +69 -0
- package/dot_config/ai/identity.md +20 -0
- package/dot_config/ai/patterns/architect.md +14 -0
- package/dot_config/ai/patterns/hardener.md +13 -0
- package/dot_config/ai/patterns/refactor.md +13 -0
- package/dot_config/aider/aider.conf.yml +32 -0
- package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
- package/dot_config/ansible/ansible.cfg +11 -0
- package/dot_config/atuin/config.toml +40 -0
- package/dot_config/bat/config +23 -0
- package/dot_config/brave-flags.conf.tmpl +7 -0
- package/dot_config/btop/btop.conf +16 -0
- package/dot_config/btop/themes/tokyonight.theme +34 -0
- package/dot_config/bun/bunfig.toml.tmpl +33 -0
- package/dot_config/claude/mcp_servers.json +20 -0
- package/dot_config/containers/containers.conf +14 -0
- package/dot_config/curl/dot_curlrc +18 -0
- package/dot_config/dlv/config.yml +39 -0
- package/dot_config/docker/config.json +15 -0
- package/dot_config/dotfiles/agent-card.json +29 -0
- package/dot_config/dotfiles/agent-profiles.json +92 -0
- package/dot_config/dotfiles/boot/README.md +11 -0
- package/dot_config/dotfiles/grub/README.md +11 -0
- package/dot_config/dotfiles/lock/README.md +11 -0
- package/dot_config/dotfiles/mcp-lock.json +33 -0
- package/dot_config/dotfiles/mcp-policy.json +52 -0
- package/dot_config/dotfiles/mcp-registry.json +47 -0
- package/dot_config/dotfiles/model-registry.json +20 -0
- package/dot_config/dotfiles/policy-bundles.json +38 -0
- package/dot_config/dotfiles/prompt-registry.json +16 -0
- package/dot_config/dotfiles/versions.env +18 -0
- package/dot_config/duf/duf.conf +6 -0
- package/dot_config/duti/defaults.duti +5 -0
- package/dot_config/emoji/emoji.txt +34 -0
- package/dot_config/environment.d/50-ssh-agent.conf +2 -0
- package/dot_config/environment.d/90-wayland.conf +19 -0
- package/dot_config/fastfetch/config.jsonc +28 -0
- package/dot_config/firefox/user.js.tmpl +58 -0
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
- package/dot_config/fish/completions/dot.fish.tmpl +115 -0
- package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
- package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
- package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
- package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
- package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
- package/dot_config/fish/config.fish.tmpl +44 -0
- package/dot_config/fish/fish_plugins +1 -0
- package/dot_config/fish/functions/_.fish +3 -0
- package/dot_config/fish/functions/_cached_eval.fish +58 -0
- package/dot_config/fish/functions/als.fish +46 -0
- package/dot_config/fish/functions/bg-upgrade.fish +7 -0
- package/dot_config/fish/functions/c.fish +3 -0
- package/dot_config/fish/functions/cat.fish +9 -0
- package/dot_config/fish/functions/d.fish +7 -0
- package/dot_config/fish/functions/dot.fish +34 -0
- package/dot_config/fish/functions/h.fish +3 -0
- package/dot_config/fish/functions/l.fish +7 -0
- package/dot_config/fish/functions/la.fish +7 -0
- package/dot_config/fish/functions/ll.fish +7 -0
- package/dot_config/fish/functions/log_error.fish +13 -0
- package/dot_config/fish/functions/log_info.fish +13 -0
- package/dot_config/fish/functions/lr.fish +7 -0
- package/dot_config/fish/functions/lra.fish +7 -0
- package/dot_config/fish/functions/ls.fish +7 -0
- package/dot_config/fish/functions/lt.fish +7 -0
- package/dot_config/fish/functions/lta.fish +7 -0
- package/dot_config/fish/functions/notify-run.fish +11 -0
- package/dot_config/fish/functions/q.fish +3 -0
- package/dot_config/fish/functions/silent-run.fish +7 -0
- package/dot_config/fish/functions/yy.fish +8 -0
- package/dot_config/flatpak/flatpak.list +4 -0
- package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
- package/dot_config/foot/foot.ini.tmpl +33 -0
- package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
- package/dot_config/fzf/fzf.zsh +48 -0
- package/dot_config/gem/gemrc +9 -0
- package/dot_config/gh/config.yml +12 -0
- package/dot_config/ghostty/config.tmpl +165 -0
- package/dot_config/git/allowed_signers.tmpl +18 -0
- package/dot_config/git/attributes +12 -0
- package/dot_config/git/commit-template +10 -0
- package/dot_config/git/ignore +27 -0
- package/dot_config/gnupg/gpg-agent.conf +11 -0
- package/dot_config/go/golangci.yml +118 -0
- package/dot_config/go/gopls.json +30 -0
- package/dot_config/goose/config.yaml +29 -0
- package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
- package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
- package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
- package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
- package/dot_config/htop/htoprc +20 -0
- package/dot_config/inputrc +2 -0
- package/dot_config/ipython/profile_default/ipython_config.py +19 -0
- package/dot_config/just/justfile +122 -0
- package/dot_config/k9s/config.yaml +65 -0
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
- package/dot_config/kanshi/config.tmpl +22 -0
- package/dot_config/karabiner/karabiner.json +14 -0
- package/dot_config/kitty/kitty.conf.tmpl +53 -0
- package/dot_config/lazydocker/config.yml +186 -0
- package/dot_config/lazygit/config.yml +35 -0
- package/dot_config/mako/config +47 -0
- package/dot_config/mas/masapps.txt +5 -0
- package/dot_config/micro/settings.json +3 -0
- package/dot_config/mimeapps.list +77 -0
- package/dot_config/minikube/config.json +13 -0
- package/dot_config/mise/config.toml +99 -0
- package/dot_config/mongosh/mongoshrc.js +68 -0
- package/dot_config/mpv/input.conf +47 -0
- package/dot_config/mpv/mpv.conf +47 -0
- package/dot_config/mycli/myclirc +67 -0
- package/dot_config/nano/nanorc +28 -0
- package/dot_config/ncdu/config +12 -0
- package/dot_config/niri/config.kdl.tmpl +327 -0
- package/dot_config/nushell/aliases.nu +18 -0
- package/dot_config/nushell/completions.nu.tmpl +52 -0
- package/dot_config/nushell/config.nu.tmpl +86 -0
- package/dot_config/nushell/env.nu.tmpl +94 -0
- package/dot_config/nushell/functions.nu.tmpl +17 -0
- package/dot_config/nvim/init.lua +18 -0
- package/dot_config/nvim/lazy-lock.json +58 -0
- package/dot_config/nvim/lua/config/autocmds.lua +107 -0
- package/dot_config/nvim/lua/config/keymaps.lua +92 -0
- package/dot_config/nvim/lua/config/lazy.lua +44 -0
- package/dot_config/nvim/lua/config/options.lua +49 -0
- package/dot_config/nvim/lua/plugins/ai.lua +75 -0
- package/dot_config/nvim/lua/plugins/coding.lua +216 -0
- package/dot_config/nvim/lua/plugins/completion.lua +60 -0
- package/dot_config/nvim/lua/plugins/dap.lua +412 -0
- package/dot_config/nvim/lua/plugins/editor.lua +55 -0
- package/dot_config/nvim/lua/plugins/git.lua +10 -0
- package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
- package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
- package/dot_config/nvim/lua/plugins/rust.lua +34 -0
- package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
- package/dot_config/nvim/lua/plugins/ui.lua +509 -0
- package/dot_config/paru/paru.conf +10 -0
- package/dot_config/pip/pip.conf.tmpl +32 -0
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
- package/dot_config/pueue/pueue.yml +34 -0
- package/dot_config/pypoetry/config.toml +6 -0
- package/dot_config/pyrightconfig.json +5 -0
- package/dot_config/raycast/README.md +13 -0
- package/dot_config/redis/redisclirc +41 -0
- package/dot_config/ripgrep/ripgreprc +21 -0
- package/dot_config/shell/00-core-paths.sh.tmpl +133 -0
- package/dot_config/shell/05-core-safety.sh +47 -0
- package/dot_config/shell/10-secrets.sh +40 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
- package/dot_config/shell/40-ls-colors.sh +48 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
- package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +120 -0
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +54 -0
- package/dot_config/shell/Brewfile +207 -0
- package/dot_config/shell/Brewfile.cask +92 -0
- package/dot_config/shell/Brewfile.cli +127 -0
- package/dot_config/shell/README.md +267 -0
- package/dot_config/shell/als_data.txt.tmpl +65 -0
- package/dot_config/shell/custom/auto_ls.zsh +20 -0
- package/dot_config/shell/custom/context_suggest.zsh +68 -0
- package/dot_config/shell/custom/error_analysis.zsh +45 -0
- package/dot_config/sops/dot_sops.yaml +23 -0
- package/dot_config/starship.toml.tmpl +202 -0
- package/dot_config/swaylock/config +43 -0
- package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
- package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
- package/dot_config/systemd/user/pueued.service +12 -0
- package/dot_config/systemd/user/ssh-agent.service +12 -0
- package/dot_config/task/Taskfile.yml +86 -0
- package/dot_config/tflint/tflint.hcl +9 -0
- package/dot_config/tmux/tmux.conf.tmpl +223 -0
- package/dot_config/topgrade.toml.tmpl +54 -0
- package/dot_config/user-dirs.dirs +9 -0
- package/dot_config/vscode/extensions.txt +11 -0
- package/dot_config/vscode/settings.json.tmpl +82 -0
- package/dot_config/waybar/config.jsonc.tmpl +90 -0
- package/dot_config/waybar/style.css.tmpl +211 -0
- package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
- package/dot_config/wget/wgetrc +12 -0
- package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
- package/dot_config/yarn/yarnrc.yml +36 -0
- package/dot_config/yazi/keymap.toml +67 -0
- package/dot_config/yazi/theme.toml +102 -0
- package/dot_config/yazi/yazi.toml +40 -0
- package/dot_config/zathura/zathurarc +52 -0
- package/dot_config/zellij/config.kdl.tmpl +79 -0
- package/dot_config/zsh/dot_zprofile +7 -0
- package/dot_config/zsh/dot_zshenv +5 -0
- package/dot_config/zsh/dot_zshrc.tmpl +498 -0
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
- package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +194 -0
- package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
- package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
- package/dot_local/bin/executable_ai-update +195 -0
- package/dot_local/bin/executable_ai_core +152 -0
- package/dot_local/bin/executable_antigravity +11 -0
- package/dot_local/bin/executable_b64 +84 -0
- package/dot_local/bin/executable_bm +77 -0
- package/dot_local/bin/executable_cb +39 -0
- package/dot_local/bin/executable_dot +589 -0
- package/dot_local/bin/executable_dot-ai +36 -0
- package/dot_local/bin/executable_dot-bootstrap +77 -0
- package/dot_local/bin/executable_dot-launch-or-focus +52 -0
- package/dot_local/bin/executable_dot-load-benchmark +31 -0
- package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
- package/dot_local/bin/executable_dot-theme-sync +952 -0
- package/dot_local/bin/executable_dot_completion +57 -0
- package/dot_local/bin/executable_dtags +28 -0
- package/dot_local/bin/executable_epoch +67 -0
- package/dot_local/bin/executable_extract +41 -0
- package/dot_local/bin/executable_gbd +52 -0
- package/dot_local/bin/executable_gd +42 -0
- package/dot_local/bin/executable_git-ai-commit +175 -0
- package/dot_local/bin/executable_git-ai-diff +169 -0
- package/dot_local/bin/executable_gl +101 -0
- package/dot_local/bin/executable_hash +161 -0
- package/dot_local/bin/executable_hashsum +160 -0
- package/dot_local/bin/executable_hex +115 -0
- package/dot_local/bin/executable_jsonv +78 -0
- package/dot_local/bin/executable_jwt +94 -0
- package/dot_local/bin/executable_kill-port +75 -0
- package/dot_local/bin/executable_lorem +118 -0
- package/dot_local/bin/executable_mkscript +35 -0
- package/dot_local/bin/executable_monitor +56 -0
- package/dot_local/bin/executable_myip +51 -0
- package/dot_local/bin/executable_notify +22 -0
- package/dot_local/bin/executable_open +36 -0
- package/dot_local/bin/executable_pw +27 -0
- package/dot_local/bin/executable_rec-start +46 -0
- package/dot_local/bin/executable_rec-stop +35 -0
- package/dot_local/bin/executable_regex +132 -0
- package/dot_local/bin/executable_start-niri +8 -0
- package/dot_local/bin/executable_tmux-sessionizer +314 -0
- package/dot_local/bin/executable_tour +175 -0
- package/dot_local/bin/executable_up +21 -0
- package/dot_local/bin/executable_update +142 -0
- package/dot_local/bin/executable_uuid +87 -0
- package/dot_local/bin/executable_win +32 -0
- package/dot_local/bin/executable_yamlv +57 -0
- package/dot_local/share/bash-completion/completions/dot +72 -0
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +149 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +283 -0
- package/install.sh +342 -0
- package/package.json +1 -1
- package/scripts/ci/check-copyright-headers.sh +96 -0
- package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
- package/scripts/ci/install-chezmoi-verified.sh +64 -0
- package/scripts/ci/validate-ci-config.sh +224 -0
- package/scripts/demo/record.sh +42 -0
- package/scripts/diagnostics/a2a-conformance.sh +162 -0
- package/scripts/diagnostics/alias-governance.sh +137 -0
- package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
- package/scripts/diagnostics/aliases-manifest.sh +31 -0
- package/scripts/diagnostics/benchmark.sh +381 -0
- package/scripts/diagnostics/conflicts.sh +72 -0
- package/scripts/diagnostics/doctor-unified.sh +38 -0
- package/scripts/diagnostics/doctor.sh +541 -0
- package/scripts/diagnostics/drift-dashboard.sh +37 -0
- package/scripts/diagnostics/health.sh +597 -0
- package/scripts/diagnostics/history-analysis.sh +85 -0
- package/scripts/diagnostics/mcp-doctor.sh +575 -0
- package/scripts/diagnostics/perf.sh +225 -0
- package/scripts/diagnostics/scorecard.sh +118 -0
- package/scripts/diagnostics/secret-governance.sh +58 -0
- package/scripts/diagnostics/security-score.sh +438 -0
- package/scripts/diagnostics/smoke-test.sh +87 -0
- package/scripts/diagnostics/snapshot.sh +89 -0
- package/scripts/diagnostics/verify.sh +107 -0
- package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
- package/scripts/diagnostics/version-locks.sh +79 -0
- package/scripts/diagnostics/workstation-attestation.sh +181 -0
- package/scripts/docs/build-manual.sh +883 -0
- package/scripts/docs/check-manual.sh +213 -0
- package/scripts/dot/commands/agent.sh +465 -0
- package/scripts/dot/commands/ai.sh +416 -0
- package/scripts/dot/commands/aliases.sh +250 -0
- package/scripts/dot/commands/appearance.sh +80 -0
- package/scripts/dot/commands/core.sh +185 -0
- package/scripts/dot/commands/diagnostics.sh +229 -0
- package/scripts/dot/commands/fleet.sh +399 -0
- package/scripts/dot/commands/lint.sh +177 -0
- package/scripts/dot/commands/manual.sh +168 -0
- package/scripts/dot/commands/meta.sh +248 -0
- package/scripts/dot/commands/patterns.sh +54 -0
- package/scripts/dot/commands/restore.sh +231 -0
- package/scripts/dot/commands/secrets.sh +223 -0
- package/scripts/dot/commands/security.sh +76 -0
- package/scripts/dot/commands/tools.sh +469 -0
- package/scripts/dot/data/alias-deprecations.tsv +2 -0
- package/scripts/dot/lib/bento.sh +49 -0
- package/scripts/dot/lib/log.sh +194 -0
- package/scripts/dot/lib/platform.sh +98 -0
- package/scripts/dot/lib/ui.sh +507 -0
- package/scripts/dot/lib/utils.sh +372 -0
- package/scripts/fonts/install-nerd-fonts.sh +68 -0
- package/scripts/fonts/patch-fonts.sh +35 -0
- package/scripts/git-hooks/install.sh +11 -0
- package/scripts/git-hooks/pre-commit +12 -0
- package/scripts/git-hooks/pre-commit-audit.sh +145 -0
- package/scripts/git-hooks/pre-push +29 -0
- package/scripts/git-hooks/prepare-commit-msg +29 -0
- package/scripts/lib/secrets_provider.sh +158 -0
- package/scripts/maintenance/check-updates.sh +131 -0
- package/scripts/ops/ai-setup.sh +55 -0
- package/scripts/ops/bundle.sh +77 -0
- package/scripts/ops/chaos.sh +49 -0
- package/scripts/ops/chezmoi-apply.sh +270 -0
- package/scripts/ops/chezmoi-diff.sh +15 -0
- package/scripts/ops/chezmoi-remove.sh +45 -0
- package/scripts/ops/chezmoi-update.sh +48 -0
- package/scripts/ops/heal-chezmoi.sh +51 -0
- package/scripts/ops/heal-system.sh +128 -0
- package/scripts/ops/heal-tools.sh +340 -0
- package/scripts/ops/heal.sh +222 -0
- package/scripts/ops/post-apply-repair.sh +106 -0
- package/scripts/ops/prewarm.sh +127 -0
- package/scripts/ops/release.sh +252 -0
- package/scripts/ops/rollback.sh +589 -0
- package/scripts/ops/setup.sh +137 -0
- package/scripts/ops/teleport.sh +33 -0
- package/scripts/qa/coverage-baseline.sh +60 -0
- package/scripts/qa/docs-coverage.sh +111 -0
- package/scripts/qa/reliability-audit.sh +138 -0
- package/scripts/qa/traceability-coverage.sh +116 -0
- package/scripts/qa/validate-examples.sh +26 -0
- package/scripts/qa/wsl-contract.sh +11 -0
- package/scripts/release/package-policy-bundles.sh +125 -0
- package/scripts/secrets/age-init.sh +70 -0
- package/scripts/secrets/create-secrets-file.sh +45 -0
- package/scripts/secrets/encrypt-ssh-key.sh +43 -0
- package/scripts/security/backup.sh +57 -0
- package/scripts/security/dns-doh.sh +51 -0
- package/scripts/security/encryption-check.sh +54 -0
- package/scripts/security/enforce-policies.sh +334 -0
- package/scripts/security/firewall.sh +90 -0
- package/scripts/security/lock-configs.sh +57 -0
- package/scripts/security/lock-screen.sh +55 -0
- package/scripts/security/manage-secrets.sh +428 -0
- package/scripts/security/ssh-cert.sh +203 -0
- package/scripts/security/telemetry-kill.sh +50 -0
- package/scripts/security/usb-safety.sh +51 -0
- package/scripts/theme/apply-gnome-theme.sh +328 -0
- package/scripts/theme/extract-theme.py +677 -0
- package/scripts/theme/install-boot-logo.sh +62 -0
- package/scripts/theme/install-catppuccin-themes.sh +370 -0
- package/scripts/theme/install-cursors.sh +25 -0
- package/scripts/theme/install-file-icons.sh +26 -0
- package/scripts/theme/install-grub-theme.sh +61 -0
- package/scripts/theme/install-lock-icon.sh +30 -0
- package/scripts/theme/merge-wallpaper.sh +141 -0
- package/scripts/theme/rebuild-themes.sh +309 -0
- package/scripts/theme/switch.sh +421 -0
- package/scripts/theme/wallpaper-rotate.sh +136 -0
- package/scripts/theme/wallpaper-sync.sh +397 -0
- package/scripts/tools/cmatrix.sh +21 -0
- package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
- package/scripts/tools/emoji-picker.sh +48 -0
- package/scripts/tools/figlet-banner.sh +18 -0
- package/scripts/tools/log-rotate.sh +30 -0
- package/scripts/tools/lolcat-wrap.sh +19 -0
- package/scripts/tools/pipes.sh +48 -0
- package/scripts/tuning/linux.sh +185 -0
- package/scripts/tuning/macos.sh +55 -0
- package/scripts/uninstall.sh +85 -0
- package/scripts/version-sync.sh +487 -0
- package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
- package/templates/chezmoi-data/mac-m1.toml.example +16 -0
- package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
- package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
- package/templates/projects/go/.github/workflows/ci.yml +31 -0
- package/templates/projects/go/README.md +4 -0
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +7 -0
- package/templates/projects/molecule/converge.yml +7 -0
- package/templates/projects/molecule/molecule.yml +16 -0
- package/templates/projects/node/.github/workflows/ci.yml +30 -0
- package/templates/projects/node/README.md +4 -0
- package/templates/projects/node/package-lock.json +12 -0
- package/templates/projects/node/src/index.js +1 -0
- package/templates/projects/packer/README.md +15 -0
- package/templates/projects/packer/main.pkr.hcl +15 -0
- package/templates/projects/python/.github/workflows/ci.yml +34 -0
- package/templates/projects/python/README.md +4 -0
- package/templates/projects/python/pyproject.toml +15 -0
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
- package/templates/projects/python/tests/test_basic.py +1 -0
- package/docs/ARCHITECTURE.md +0 -62
- package/docs/COMPLIANCE.md +0 -47
- package/docs/OPERATIONS.md +0 -103
- package/docs/PR_DESCRIPTION.md +0 -150
- package/docs/ROADMAP_legacy.md +0 -556
- package/docs/SECURITY_CHECKLIST.md +0 -25
- package/docs/TASK.md +0 -99
- package/docs/WALKTHROUGH.md +0 -46
- package/scripts/backup.sh +0 -142
- package/scripts/banner.sh +0 -20
- package/scripts/benchmark.sh +0 -20
- package/scripts/build.sh +0 -41
- package/scripts/clean.sh +0 -31
- package/scripts/compile.sh +0 -54
- package/scripts/copy.sh +0 -108
- package/scripts/doctor.sh +0 -79
- package/scripts/dotfiles.sh +0 -63
- package/scripts/download.sh +0 -35
- package/scripts/help.sh +0 -57
- package/scripts/lock-configs.sh +0 -57
- package/scripts/package.sh +0 -46
- package/scripts/ssh.sh +0 -55
- package/scripts/teleport.sh +0 -23
- package/scripts/test-aliases.sh +0 -25
- package/scripts/test_smoke.sh +0 -88
- package/scripts/unpack.sh +0 -28
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Tutorial: Add a Wallpaper → Theme
|
|
2
|
+
|
|
3
|
+
Drop an image. Get a fully-WCAG-AAA terminal theme.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Dotfiles installed (see [First Install](01-first-install.md))
|
|
8
|
+
- `magick` (ImageMagick) and `python3` available (installed by default)
|
|
9
|
+
- Optional: `heif-enc` for creating dynamic HEIC (`brew install libheif`)
|
|
10
|
+
|
|
11
|
+
## Option A: Drop a Static Image
|
|
12
|
+
|
|
13
|
+
The simplest path: place a wallpaper in `~/Pictures/Wallpapers/` and rebuild.
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
cp ~/Downloads/my-wallpaper.jpg ~/Pictures/Wallpapers/mytheme-dark.jpg
|
|
17
|
+
cp ~/Downloads/my-wallpaper-light.jpg ~/Pictures/Wallpapers/mytheme-light.jpg
|
|
18
|
+
|
|
19
|
+
dot theme rebuild
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Expected output:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Discovering wallpapers...
|
|
26
|
+
Found: 126 system, 26 custom (152 total)
|
|
27
|
+
|
|
28
|
+
Generating themes...
|
|
29
|
+
Processing 2 wallpapers (4 parallel jobs)...
|
|
30
|
+
mytheme-dark [custom] ✓
|
|
31
|
+
mytheme-light [custom] ✓
|
|
32
|
+
|
|
33
|
+
Results: 2 processed, 150 cached, 0 failed
|
|
34
|
+
|
|
35
|
+
Assembling themes.toml...
|
|
36
|
+
Written: ~/.dotfiles/.chezmoidata/themes.toml (608 theme sections)
|
|
37
|
+
|
|
38
|
+
Done. Run 'dot theme list' to see available themes.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Switch to the new theme:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
dot theme mytheme-dark
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Option B: Dynamic HEIC (Recommended)
|
|
48
|
+
|
|
49
|
+
Apple's dynamic HEIC format stores both dark and light variants in a single file with metadata that macOS uses to auto-switch appearance. This is the native format for Apple system wallpapers.
|
|
50
|
+
|
|
51
|
+
### Create a Dynamic HEIC From a Pair
|
|
52
|
+
|
|
53
|
+
If you have `mytheme-dark.jpg` + `mytheme-light.jpg`:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
bash scripts/theme/merge-wallpaper.sh mytheme
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This:
|
|
60
|
+
1. Resizes both to 6016×6016 (preserving aspect ratio, center-cropped)
|
|
61
|
+
2. Encodes both into a single `.heic` via `heif-enc`
|
|
62
|
+
3. Injects `apple_desktop:apr` XMP metadata (image 0 = light, image 1 = dark)
|
|
63
|
+
4. Writes to `~/Pictures/Wallpapers/mytheme.heic`
|
|
64
|
+
5. Removes the two source files
|
|
65
|
+
|
|
66
|
+
Verify:
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
heif-info ~/Pictures/Wallpapers/mytheme.heic
|
|
70
|
+
# image: 6016x6016 (id=1), primary ← light
|
|
71
|
+
# image: 6016x6016 (id=4) ← dark
|
|
72
|
+
# metadata:
|
|
73
|
+
# XMP: 2473 bytes ← appearance mapping
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Rebuild Themes
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
dot theme rebuild
|
|
80
|
+
# mytheme-light [custom] ✓
|
|
81
|
+
# mytheme-dark [custom] ✓
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The engine extracts each frame independently and generates paired themes.
|
|
85
|
+
|
|
86
|
+
## Option C: Golden Ratio Brightness (Advanced)
|
|
87
|
+
|
|
88
|
+
For best perceived contrast between your dark and light themes, target a brightness ratio of ~1.6× (the golden ratio, approximately 1.618).
|
|
89
|
+
|
|
90
|
+
Measure:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
magick ~/Pictures/Wallpapers/mytheme-dark.jpg -resize 1x1\! -format '%[fx:mean]' info:
|
|
94
|
+
# 0.30
|
|
95
|
+
|
|
96
|
+
magick ~/Pictures/Wallpapers/mytheme-light.jpg -resize 1x1\! -format '%[fx:mean]' info:
|
|
97
|
+
# 0.48
|
|
98
|
+
# Ratio: 0.48 / 0.30 = 1.6 ← ideal
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Adjust a pair if the ratio is off:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
# Darken light to 0.485 brightness
|
|
105
|
+
mod=$(python3 -c "print(int((0.485 / 0.60) * 100))") # current mean = 0.60
|
|
106
|
+
magick input.jpg -modulate ${mod},100,100 output.jpg
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Option D: Install System Wallpapers (Already-Available)
|
|
110
|
+
|
|
111
|
+
macOS ships dozens of wallpapers you can use directly — no download needed.
|
|
112
|
+
|
|
113
|
+
List what's available:
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
dot theme rebuild --list
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Output:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
NAME SOURCE PATH
|
|
123
|
+
---- ------ ----
|
|
124
|
+
big-sur-graphic-dark system /System/Library/Desktop Pictures/.thumbnails/Big Sur Graphic Dark.heic
|
|
125
|
+
big-sur-graphic-light system /System/Library/Desktop Pictures/.thumbnails/Big Sur Graphic Light.heic
|
|
126
|
+
dome-dark system /System/Library/Desktop Pictures/.thumbnails/Dome Dark.heic
|
|
127
|
+
dome-light system /System/Library/Desktop Pictures/.thumbnails/Dome Light.heic
|
|
128
|
+
sonoma-dark system /System/Library/Desktop Pictures/.thumbnails/Sonoma Dark.heic
|
|
129
|
+
...
|
|
130
|
+
Total: 152 wallpapers
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Switch to any system wallpaper:
|
|
134
|
+
|
|
135
|
+
```sh
|
|
136
|
+
dot theme dome-dark
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
The engine extracts Dome Dark's dominant colors, generates a palette, and applies it to every surface.
|
|
140
|
+
|
|
141
|
+
## Verifying the Result
|
|
142
|
+
|
|
143
|
+
After a switch, check the applied colors:
|
|
144
|
+
|
|
145
|
+
```sh
|
|
146
|
+
# See the current theme's palette
|
|
147
|
+
grep -A30 "^\[themes.mytheme-dark\]" ~/.dotfiles/.chezmoidata/themes.toml
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Check WCAG compliance (always passes for generated themes):
|
|
151
|
+
|
|
152
|
+
```sh
|
|
153
|
+
bash tests/unit/theme/test_themes_toml.sh
|
|
154
|
+
# RESULTS: 11:11:0 (11 tests, 11 passed, 0 failed)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Verify the applied wallpaper:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
# macOS
|
|
161
|
+
osascript -e 'tell application "System Events" to get picture of every desktop'
|
|
162
|
+
|
|
163
|
+
# Linux (GNOME)
|
|
164
|
+
gsettings get org.gnome.desktop.background picture-uri
|
|
165
|
+
gsettings get org.gnome.desktop.background picture-uri-dark
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Troubleshooting
|
|
169
|
+
|
|
170
|
+
### Low Contrast on Both Variants
|
|
171
|
+
|
|
172
|
+
Your wallpaper pair doesn't have enough brightness difference. The theme will still generate but `dot theme list` may filter it from the picker. Adjust the source images to increase separation (brighter light variant, darker dark variant).
|
|
173
|
+
|
|
174
|
+
### K-Means Failed to Converge
|
|
175
|
+
|
|
176
|
+
Rare, but possible with images that are nearly solid color. The engine uses a seeded RNG and 3 runs — if all 3 fail, the output theme is skipped. Fix: use a more chromatic source image.
|
|
177
|
+
|
|
178
|
+
### Wallpaper Doesn't Apply on Linux
|
|
179
|
+
|
|
180
|
+
Check your desktop environment:
|
|
181
|
+
|
|
182
|
+
- **GNOME** — uses `gsettings picture-uri` (HEIC auto-converted to PNG)
|
|
183
|
+
- **KDE** — uses `plasma-apply-wallpaperimage`
|
|
184
|
+
- **Niri** — uses DMS IPC or `swaybg`
|
|
185
|
+
- **i3/sway (no DE)** — falls back to `feh`
|
|
186
|
+
|
|
187
|
+
If none are detected, set `$WALLPAPER_COMMAND` in `~/.config/dotfiles/config`.
|
|
188
|
+
|
|
189
|
+
### The Dark/Light Auto-Switch Isn't Working on macOS
|
|
190
|
+
|
|
191
|
+
The `apple_desktop:apr` metadata may be missing. Verify:
|
|
192
|
+
|
|
193
|
+
```sh
|
|
194
|
+
magick ~/Pictures/Wallpapers/mytheme.heic -format '%[XMP]' info: | grep apple_desktop
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
If empty, re-run `merge-wallpaper.sh` — the XMP injection step may have failed due to missing `exiftool`.
|
|
198
|
+
|
|
199
|
+
## Summary
|
|
200
|
+
|
|
201
|
+
You've added a custom wallpaper, generated a WCAG AAA theme from it, and verified cross-surface application. You can now:
|
|
202
|
+
|
|
203
|
+
- Add more wallpapers to build a library
|
|
204
|
+
- Share your wallpaper directory across fleet hosts (it's gitignored by default)
|
|
205
|
+
- Use `dot theme toggle` to swap dark↔light of your current family
|
|
206
|
+
|
|
207
|
+
## Next
|
|
208
|
+
|
|
209
|
+
- [Concept: The Theme Engine](../01-concepts/03-theme-engine.md) — deep dive
|
|
210
|
+
- [Tutorial: Create a Profile](03-create-profile.md)
|
|
211
|
+
- [Cookbook: Theming Recipes](../04-cookbook/01-recipes.md)
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Tutorial: Create a Machine Profile
|
|
2
|
+
|
|
3
|
+
Machine profiles tell chezmoi how to render templates differently on each host — display scale, keyboard layout, performance preset, available features.
|
|
4
|
+
|
|
5
|
+
## When to Use a Profile
|
|
6
|
+
|
|
7
|
+
- You have more than one host (laptop + desktop, work + personal)
|
|
8
|
+
- Your hardware differs materially (HiDPI laptop vs 1080p external, ARM vs x86)
|
|
9
|
+
- Certain features only apply to specific setups (Niri on Wayland, AeroSpace on macOS)
|
|
10
|
+
|
|
11
|
+
## Step 1: Choose or Create a Preset
|
|
12
|
+
|
|
13
|
+
Presets live in `.chezmoidata/hardware.toml`:
|
|
14
|
+
|
|
15
|
+
```toml
|
|
16
|
+
[hardware.macbook-t2]
|
|
17
|
+
display_scale = 2.0
|
|
18
|
+
kbd_layout = "qwerty"
|
|
19
|
+
modifier_mode = "left-cmd-control"
|
|
20
|
+
perf_profile = "laptop"
|
|
21
|
+
wm = "aerospace"
|
|
22
|
+
[hardware.macbook-t2.features]
|
|
23
|
+
retina = true
|
|
24
|
+
touchid = true
|
|
25
|
+
|
|
26
|
+
[hardware.surface-pro]
|
|
27
|
+
display_scale = 1.5
|
|
28
|
+
kbd_layout = "colemak-dh"
|
|
29
|
+
modifier_mode = "standard"
|
|
30
|
+
perf_profile = "laptop"
|
|
31
|
+
wm = "niri"
|
|
32
|
+
[hardware.surface-pro.features]
|
|
33
|
+
touch = true
|
|
34
|
+
pen = true
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
If an existing preset fits: use its name. Otherwise, add a new one.
|
|
38
|
+
|
|
39
|
+
## Step 2: Select the Preset for This Host
|
|
40
|
+
|
|
41
|
+
Edit `~/.config/chezmoi/chezmoi.toml`:
|
|
42
|
+
|
|
43
|
+
```toml
|
|
44
|
+
[data]
|
|
45
|
+
machine = "surface-pro" # choose from .chezmoidata/hardware.toml
|
|
46
|
+
theme = "dome-dark"
|
|
47
|
+
default_shell = "fish"
|
|
48
|
+
terminal_font_family = "JetBrainsMono Nerd Font"
|
|
49
|
+
terminal_font_size = 11 # larger for HiDPI, smaller for dense screens
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`chezmoi.toml` is **not** in the repository — each host has its own. Generated by `chezmoi init` on first install.
|
|
53
|
+
|
|
54
|
+
## Step 3: Reference the Preset in Templates
|
|
55
|
+
|
|
56
|
+
Inside any `.tmpl` file:
|
|
57
|
+
|
|
58
|
+
```go
|
|
59
|
+
{{- $hw := index .hardware .machine }}
|
|
60
|
+
|
|
61
|
+
# Ghostty config — uses machine-specific font size
|
|
62
|
+
font-family = "{{ .terminal_font_family }}"
|
|
63
|
+
font-size = {{ .terminal_font_size }}
|
|
64
|
+
|
|
65
|
+
# DPI-aware settings
|
|
66
|
+
{{ if eq $hw.display_scale 2.0 }}
|
|
67
|
+
window-decoration = false
|
|
68
|
+
{{ else }}
|
|
69
|
+
window-decoration = true
|
|
70
|
+
{{ end }}
|
|
71
|
+
|
|
72
|
+
# Feature-gated config
|
|
73
|
+
{{ if $hw.features.touch }}
|
|
74
|
+
mouse-scroll-multiplier = 3
|
|
75
|
+
{{ end }}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
After editing the template, run `chezmoi apply` or `dot apply`.
|
|
79
|
+
|
|
80
|
+
## Step 4: Add a New Preset
|
|
81
|
+
|
|
82
|
+
Suppose you have a new mini PC. Add to `.chezmoidata/hardware.toml`:
|
|
83
|
+
|
|
84
|
+
```toml
|
|
85
|
+
[hardware.my-nuc]
|
|
86
|
+
display_scale = 1.0 # external 1440p
|
|
87
|
+
kbd_layout = "qwerty"
|
|
88
|
+
modifier_mode = "standard"
|
|
89
|
+
perf_profile = "desktop"
|
|
90
|
+
wm = "gnome"
|
|
91
|
+
[hardware.my-nuc.features]
|
|
92
|
+
multi-monitor = true
|
|
93
|
+
gaming = true
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Then on that host:
|
|
97
|
+
|
|
98
|
+
```toml
|
|
99
|
+
# ~/.config/chezmoi/chezmoi.toml
|
|
100
|
+
[data]
|
|
101
|
+
machine = "my-nuc"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Apply:
|
|
105
|
+
|
|
106
|
+
```sh
|
|
107
|
+
dot apply
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Templates automatically pick up the new preset data.
|
|
111
|
+
|
|
112
|
+
## Step 5: Per-Preset Feature Flags
|
|
113
|
+
|
|
114
|
+
Feature flags in `.chezmoidata.toml` can be gated by preset:
|
|
115
|
+
|
|
116
|
+
```toml
|
|
117
|
+
# .chezmoidata.toml — defaults for all hosts
|
|
118
|
+
[features]
|
|
119
|
+
dms = false
|
|
120
|
+
linux_desktop = false
|
|
121
|
+
waybar = false
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Override per-preset in `.chezmoidata/hardware.toml`:
|
|
125
|
+
|
|
126
|
+
```toml
|
|
127
|
+
[hardware.surface-pro.features]
|
|
128
|
+
touch = true
|
|
129
|
+
pen = true
|
|
130
|
+
dms = true # override feature default
|
|
131
|
+
waybar = true
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
In templates:
|
|
135
|
+
|
|
136
|
+
```go
|
|
137
|
+
{{- $hw := index .hardware .machine }}
|
|
138
|
+
{{- $features := mergeOverwrite .features $hw.features }}
|
|
139
|
+
|
|
140
|
+
{{ if $features.waybar }}
|
|
141
|
+
# ... waybar-specific config ...
|
|
142
|
+
{{ end }}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Example: Font Size by Preset
|
|
146
|
+
|
|
147
|
+
A single Ghostty config that renders correctly on every host:
|
|
148
|
+
|
|
149
|
+
```go
|
|
150
|
+
# dot_config/ghostty/config.tmpl
|
|
151
|
+
{{- $hw := index .hardware .machine }}
|
|
152
|
+
|
|
153
|
+
theme = {{ .theme }}
|
|
154
|
+
font-family = "{{ .terminal_font_family }}"
|
|
155
|
+
|
|
156
|
+
# DPI-aware font sizing
|
|
157
|
+
{{ if eq $hw.display_scale 2.0 }}
|
|
158
|
+
font-size = 12 # Retina MacBook
|
|
159
|
+
{{ else if eq $hw.display_scale 1.5 }}
|
|
160
|
+
font-size = 11 # Surface Pro
|
|
161
|
+
{{ else }}
|
|
162
|
+
font-size = 14 # External 1440p/4K
|
|
163
|
+
{{ end }}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
On the MacBook: 12pt. On the Surface: 11pt. On the NUC: 14pt. One template.
|
|
167
|
+
|
|
168
|
+
## Example: Platform × Preset
|
|
169
|
+
|
|
170
|
+
Combine `.chezmoi.os` with the preset:
|
|
171
|
+
|
|
172
|
+
```go
|
|
173
|
+
{{- $hw := index .hardware .machine }}
|
|
174
|
+
|
|
175
|
+
{{ if and (eq .chezmoi.os "darwin") (eq $hw.wm "aerospace") }}
|
|
176
|
+
# macOS + AeroSpace specifics
|
|
177
|
+
{{ else if and (eq .chezmoi.os "linux") (eq $hw.wm "niri") }}
|
|
178
|
+
# Linux + Niri specifics
|
|
179
|
+
{{ end }}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Listing Known Presets
|
|
183
|
+
|
|
184
|
+
```sh
|
|
185
|
+
chezmoi execute-template '{{- range $name, $_ := .hardware }}{{ $name }}{{ "\n" }}{{ end }}'
|
|
186
|
+
# macbook-t2
|
|
187
|
+
# surface-pro
|
|
188
|
+
# geekom-a9
|
|
189
|
+
# my-nuc
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Changing Presets on an Existing Host
|
|
193
|
+
|
|
194
|
+
If you reassign a host to a different preset:
|
|
195
|
+
|
|
196
|
+
```sh
|
|
197
|
+
# Edit ~/.config/chezmoi/chezmoi.toml
|
|
198
|
+
# machine = "my-nuc" (was "surface-pro")
|
|
199
|
+
|
|
200
|
+
dot apply --dry-run # preview changes
|
|
201
|
+
dot apply # apply
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Chezmoi re-renders every template with the new preset data. No reboot needed.
|
|
205
|
+
|
|
206
|
+
## Troubleshooting
|
|
207
|
+
|
|
208
|
+
### "Machine preset 'foo' not found"
|
|
209
|
+
|
|
210
|
+
The `machine` value in `~/.config/chezmoi/chezmoi.toml` doesn't match any key under `[hardware.*]` in `.chezmoidata/hardware.toml`. Check spelling.
|
|
211
|
+
|
|
212
|
+
### Templates Silently Use Defaults
|
|
213
|
+
|
|
214
|
+
Make sure you're using `{{- $hw := index .hardware .machine }}` at the top of templates. If `machine` is empty, `index` returns `nil` — reference with `{{- with $hw }}...{{- end }}` guards.
|
|
215
|
+
|
|
216
|
+
### Feature Flag Not Taking Effect
|
|
217
|
+
|
|
218
|
+
Verify the merge order:
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
chezmoi execute-template '{{- $hw := index .hardware .machine -}}{{- $f := mergeOverwrite .features $hw.features -}}{{ $f | toToml }}'
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Per-preset features must override global defaults. If the output doesn't reflect that, check template syntax.
|
|
225
|
+
|
|
226
|
+
## Summary
|
|
227
|
+
|
|
228
|
+
Profiles let one source tree produce correctly-configured output on every host you own. The machinery:
|
|
229
|
+
|
|
230
|
+
1. `.chezmoidata/hardware.toml` defines presets (declarative)
|
|
231
|
+
2. `~/.config/chezmoi/chezmoi.toml` selects a preset per host (per-host override)
|
|
232
|
+
3. `.tmpl` files read `.hardware` + `.machine` (template-time)
|
|
233
|
+
|
|
234
|
+
## Next
|
|
235
|
+
|
|
236
|
+
- [Concept: Fleet Architecture](../01-concepts/04-fleet.md)
|
|
237
|
+
- [Reference: Templates](../03-reference/04-templates.md)
|
|
238
|
+
- [Reference: Feature Flags](../03-reference/05-feature-flags.md)
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# Tutorial: Encrypt a Secret
|
|
2
|
+
|
|
3
|
+
How to store an API key (or any secret) encrypted in the repository using Age and SOPS — decrypted automatically on `dot apply`.
|
|
4
|
+
|
|
5
|
+
## The Threat Model
|
|
6
|
+
|
|
7
|
+
Secrets in plaintext config files are:
|
|
8
|
+
|
|
9
|
+
- Committed to Git history (permanent record)
|
|
10
|
+
- Visible to every process on the machine
|
|
11
|
+
- Included in backup archives
|
|
12
|
+
|
|
13
|
+
Secrets encrypted with Age:
|
|
14
|
+
|
|
15
|
+
- Cipher text committed to Git is useless without the private key
|
|
16
|
+
- Private key (`~/.config/age/keys.txt`) never leaves the user's machine
|
|
17
|
+
- Per-machine policy: only authorized hosts hold keys for their share of secrets
|
|
18
|
+
|
|
19
|
+
## Step 1: Generate an Age Key (First Time Only)
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
age-keygen -o ~/.config/age/keys.txt
|
|
23
|
+
chmod 600 ~/.config/age/keys.txt
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The public key is embedded in the file:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
cat ~/.config/age/keys.txt
|
|
30
|
+
# created: 2026-04-16T09:00:00Z
|
|
31
|
+
# public key: age1qy90l...xyz
|
|
32
|
+
AGE-SECRET-KEY-1A...
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Copy the public key — you'll reference it when encrypting.
|
|
36
|
+
|
|
37
|
+
## Step 2: Choose Encryption Method
|
|
38
|
+
|
|
39
|
+
Two approaches are supported:
|
|
40
|
+
|
|
41
|
+
| Method | Best For | Filename |
|
|
42
|
+
|:---|:---|:---|
|
|
43
|
+
| **Chezmoi encrypt** | Individual files (API tokens, config snippets) | `dot_config/token.age` |
|
|
44
|
+
| **SOPS** | YAML/JSON with multiple secrets, selective field encryption | `dot_config/creds.sops.yaml` |
|
|
45
|
+
|
|
46
|
+
## Step 3A: Chezmoi-Encrypted File
|
|
47
|
+
|
|
48
|
+
Create an unencrypted source file:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
mkdir -p ~/tmp
|
|
52
|
+
echo "sk_live_abc123" > ~/tmp/stripe-key.txt
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Import it as encrypted:
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
chezmoi add --encrypt ~/tmp/stripe-key.txt
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This:
|
|
62
|
+
|
|
63
|
+
1. Reads `~/tmp/stripe-key.txt`
|
|
64
|
+
2. Encrypts with your Age public key
|
|
65
|
+
3. Stores encrypted content at `~/.dotfiles/dot_tmp/stripe-key.txt.age`
|
|
66
|
+
4. Template reads encrypted content at apply time and decrypts to target
|
|
67
|
+
|
|
68
|
+
Delete the plaintext source:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
rm ~/tmp/stripe-key.txt
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
On `dot apply`, chezmoi decrypts and writes to `~/tmp/stripe-key.txt`. If someone lacks the private key, they see only the encrypted `.age` file in Git.
|
|
75
|
+
|
|
76
|
+
## Step 3B: SOPS-Encrypted YAML
|
|
77
|
+
|
|
78
|
+
SOPS encrypts **values** in YAML/JSON while preserving the structure. Useful when you want:
|
|
79
|
+
|
|
80
|
+
- Multiple secrets in one file
|
|
81
|
+
- Encryption of only sensitive fields (leaving metadata readable)
|
|
82
|
+
- Multi-recipient (e.g. the work laptop AND the backup laptop can decrypt)
|
|
83
|
+
|
|
84
|
+
Configure SOPS once:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
# .sops.yaml (at repo root)
|
|
88
|
+
creation_rules:
|
|
89
|
+
- path_regex: \.sops\.yaml$
|
|
90
|
+
age: age1qy90l...xyz
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Create a secrets file:
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
# dot_config/credentials.sops.yaml
|
|
97
|
+
database:
|
|
98
|
+
host: db.prod.example.com
|
|
99
|
+
user: app
|
|
100
|
+
password: supersecret
|
|
101
|
+
api_keys:
|
|
102
|
+
stripe: sk_live_abc
|
|
103
|
+
sendgrid: SG.xyz
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Encrypt it:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
sops --encrypt --in-place dot_config/credentials.sops.yaml
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The file now contains ciphertext blobs where plaintext values were:
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
database:
|
|
116
|
+
host: ENC[AES256_GCM,data:...]
|
|
117
|
+
user: ENC[AES256_GCM,data:...]
|
|
118
|
+
password: ENC[AES256_GCM,data:...]
|
|
119
|
+
api_keys:
|
|
120
|
+
stripe: ENC[AES256_GCM,data:...]
|
|
121
|
+
sendgrid: ENC[AES256_GCM,data:...]
|
|
122
|
+
sops:
|
|
123
|
+
age:
|
|
124
|
+
- recipient: age1qy90l...xyz
|
|
125
|
+
enc: |
|
|
126
|
+
-----BEGIN AGE ENCRYPTED FILE-----
|
|
127
|
+
...
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
To edit the encrypted file:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
sops dot_config/credentials.sops.yaml
|
|
134
|
+
# Opens in $EDITOR with decrypted content; re-encrypts on save
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Step 4: Reference the Secret in a Template
|
|
138
|
+
|
|
139
|
+
Chezmoi has a built-in `decrypt` helper:
|
|
140
|
+
|
|
141
|
+
```go
|
|
142
|
+
# dot_bashrc.tmpl
|
|
143
|
+
export STRIPE_KEY="{{ include "dot_tmp/stripe-key.txt.age" | decrypt | trim }}"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
For SOPS:
|
|
147
|
+
|
|
148
|
+
```go
|
|
149
|
+
# Use the sopsDecrypt template function
|
|
150
|
+
{{- $creds := dict -}}
|
|
151
|
+
{{- $creds = sopsDecrypt "dot_config/credentials.sops.yaml" | fromYaml }}
|
|
152
|
+
export DB_PASSWORD="{{ $creds.database.password }}"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Step 5: Commit and Verify
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
cd ~/.dotfiles
|
|
159
|
+
git add .sops.yaml dot_config/credentials.sops.yaml dot_tmp/stripe-key.txt.age
|
|
160
|
+
git commit -sS -m "feat(secrets): add stripe and database credentials"
|
|
161
|
+
git push
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Verify the commit doesn't leak secrets:
|
|
165
|
+
|
|
166
|
+
```sh
|
|
167
|
+
git log -p HEAD~1..HEAD | grep -v ENC | grep -iE 'password|secret|key' || echo "Clean"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
On the next machine:
|
|
171
|
+
|
|
172
|
+
```sh
|
|
173
|
+
dot update
|
|
174
|
+
# Chezmoi decrypts using that machine's Age key
|
|
175
|
+
# If decryption fails, the template errors with a clear message
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Step 6: Multi-Recipient (Fleet)
|
|
179
|
+
|
|
180
|
+
To allow multiple hosts to decrypt the same secret, add more recipients:
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
# .sops.yaml
|
|
184
|
+
creation_rules:
|
|
185
|
+
- path_regex: \.sops\.yaml$
|
|
186
|
+
age: >-
|
|
187
|
+
age1qy90l...xyz,
|
|
188
|
+
age1z2x33...abc,
|
|
189
|
+
age1mm0kk...def
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Re-encrypt the affected files:
|
|
193
|
+
|
|
194
|
+
```sh
|
|
195
|
+
sops updatekeys dot_config/credentials.sops.yaml
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Now any host with one of those three private keys can decrypt. Hosts without any matching key see the encrypted file but cannot read it.
|
|
199
|
+
|
|
200
|
+
## Step 7: Rotate a Compromised Key
|
|
201
|
+
|
|
202
|
+
```sh
|
|
203
|
+
# 1. Generate a new Age key on the affected host
|
|
204
|
+
age-keygen -o ~/.config/age/keys.txt.new
|
|
205
|
+
mv ~/.config/age/keys.txt.new ~/.config/age/keys.txt
|
|
206
|
+
|
|
207
|
+
# 2. Update .sops.yaml with the new public key
|
|
208
|
+
|
|
209
|
+
# 3. Re-encrypt all SOPS files with the new recipient list
|
|
210
|
+
find . -name '*.sops.yaml' -exec sops updatekeys {} \;
|
|
211
|
+
|
|
212
|
+
# 4. Commit and push
|
|
213
|
+
git add .sops.yaml dot_config/*.sops.yaml
|
|
214
|
+
git commit -sS -m "chore(secrets): rotate Age key"
|
|
215
|
+
|
|
216
|
+
# 5. On other fleet hosts
|
|
217
|
+
dot update
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Old key still works for existing ciphertext, but new secrets use the new key. To force deprecation, delete the old key from `.sops.yaml` and `sops updatekeys` all files.
|
|
221
|
+
|
|
222
|
+
## Verifying No Plaintext Leaks
|
|
223
|
+
|
|
224
|
+
CI runs three secret scanners (`gitleaks`, `detect-secrets`, `trufflehog`) on every commit. You can run them locally:
|
|
225
|
+
|
|
226
|
+
```sh
|
|
227
|
+
gitleaks detect --redact --source .
|
|
228
|
+
detect-secrets scan --update .secrets.baseline
|
|
229
|
+
trufflehog git file://. --only-verified
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
If any scanner finds a potential leak, the commit is blocked.
|
|
233
|
+
|
|
234
|
+
## Operational Rules
|
|
235
|
+
|
|
236
|
+
1. **Never commit plaintext secrets** — use chezmoi encrypt or SOPS
|
|
237
|
+
2. **Never commit `~/.config/age/keys.txt`** — it's gitignored; double-check before pushing
|
|
238
|
+
3. **Age keys are per-host** — don't copy them via Git; use secure channels (1Password, Bitwarden, physical USB)
|
|
239
|
+
4. **Rotate on team membership changes** — when someone leaves, update recipients and rotate all shared secrets
|
|
240
|
+
5. **Audit with `dot verify --security`** — runs gitleaks + signature + policy hash checks
|
|
241
|
+
|
|
242
|
+
## Troubleshooting
|
|
243
|
+
|
|
244
|
+
### "Could not decrypt: no age key found"
|
|
245
|
+
|
|
246
|
+
`~/.config/age/keys.txt` is missing or unreadable:
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
chmod 600 ~/.config/age/keys.txt
|
|
250
|
+
ls -la ~/.config/age/keys.txt
|
|
251
|
+
# -rw------- 1 user user 189 Apr 16 09:00 keys.txt
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### "sops: file encrypted with outdated recipients"
|
|
255
|
+
|
|
256
|
+
A secret file has an old recipient list. Fix:
|
|
257
|
+
|
|
258
|
+
```sh
|
|
259
|
+
sops updatekeys path/to/file.sops.yaml
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Secrets Not Applying After Apply
|
|
263
|
+
|
|
264
|
+
Check that `dot_tmp/stripe-key.txt.age` is committed. Run:
|
|
265
|
+
|
|
266
|
+
```sh
|
|
267
|
+
chezmoi apply --verbose dot_tmp/stripe-key.txt
|
|
268
|
+
# Will show decrypt attempts and errors
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Next
|
|
272
|
+
|
|
273
|
+
- [Concept: Trust Model](../01-concepts/02-trust-model.md) — the security architecture
|
|
274
|
+
- [Reference: Secret operations](../03-reference/01-dot-cli.md#secrets)
|
|
275
|
+
- [Security: Secret management](../../security/SECRETS.md)
|