@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,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
|