@sebastienrousseau/dotfiles 0.2.481 → 0.2.500
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +122 -32
- package/LICENSE +1 -1
- package/README.md +211 -242
- package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
- package/docs/AI.md +102 -0
- package/docs/COPYRIGHT +2 -2
- package/docs/NAMING_CONVENTIONS.md +95 -0
- package/docs/README.md +58 -249
- package/docs/adr/ADR-004-cli-architecture.md +2 -2
- package/docs/adr/ADR-006-shell-selection.md +2 -2
- 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 +2 -3
- 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/MILESTONE_v0.2.493.md +43 -0
- package/docs/{PLAN.md → archive/PLAN.md} +1 -1
- package/docs/guides/INSTALL.md +140 -0
- package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
- package/docs/guides/THEMING.md +222 -0
- package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
- package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
- 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} +11 -11
- 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/{ALIASES.md → reference/ALIASES.md} +2 -6
- 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/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
- 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/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 +3 -17
- 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 +1 -1
- package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
- package/dot_config/atuin/config.toml +18 -1
- package/dot_config/bat/config +16 -1
- package/dot_config/claude/mcp_servers.json +3 -32
- 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 +1 -1
- package/dot_config/dotfiles/grub/README.md +1 -1
- package/dot_config/dotfiles/lock/README.md +1 -1
- 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/environment.d/50-ssh-agent.conf +2 -0
- package/dot_config/environment.d/90-wayland.conf +19 -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/fontconfig/fonts.conf.tmpl +13 -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/ghostty/config.tmpl +69 -565
- package/dot_config/git/allowed_signers.tmpl +18 -0
- package/dot_config/git/commit-template +10 -0
- package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
- package/dot_config/goose/config.yaml +2 -2
- package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
- package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
- package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
- package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
- package/dot_config/ipython/profile_default/ipython_config.py +19 -0
- package/dot_config/just/justfile +18 -0
- package/dot_config/kanshi/config.tmpl +22 -0
- package/dot_config/kitty/kitty.conf.tmpl +44 -508
- package/dot_config/lazygit/config.yml +18 -6
- package/dot_config/mako/config +47 -0
- package/dot_config/micro/settings.json +3 -0
- package/dot_config/mimeapps.list +77 -0
- package/dot_config/mise/config.toml +63 -5
- package/dot_config/mongosh/mongoshrc.js +1 -0
- package/dot_config/mpv/input.conf +47 -0
- package/dot_config/mpv/mpv.conf +47 -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 +14 -0
- package/dot_config/nvim/lazy-lock.json +45 -14
- package/dot_config/nvim/lua/config/autocmds.lua +45 -1
- package/dot_config/nvim/lua/config/keymaps.lua +13 -8
- package/dot_config/nvim/lua/config/lazy.lua +22 -12
- package/dot_config/nvim/lua/config/options.lua +1 -0
- package/dot_config/nvim/lua/plugins/ai.lua +75 -0
- package/dot_config/nvim/lua/plugins/coding.lua +11 -29
- package/dot_config/nvim/lua/plugins/completion.lua +60 -0
- package/dot_config/nvim/lua/plugins/dap.lua +215 -4
- package/dot_config/nvim/lua/plugins/editor.lua +6 -10
- package/dot_config/nvim/lua/plugins/git.lua +1 -0
- package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
- package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
- package/dot_config/nvim/lua/plugins/rust.lua +1 -0
- package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
- package/dot_config/nvim/lua/plugins/ui.lua +23 -51
- package/dot_config/paru/paru.conf +10 -0
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
- package/dot_config/pueue/pueue.yml +34 -0
- package/dot_config/raycast/README.md +1 -1
- package/dot_config/ripgrep/ripgreprc +21 -0
- package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
- 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/51-logic-functions-extra.sh.tmpl +64 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
- package/dot_config/shell/Brewfile.cli +8 -0
- package/dot_config/shell/README.md +9 -9
- 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 +50 -50
- package/dot_config/shell/custom/error_analysis.zsh +29 -29
- package/dot_config/starship.toml.tmpl +85 -7
- 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/tmux/tmux.conf.tmpl +80 -38
- package/dot_config/topgrade.toml.tmpl +54 -0
- package/dot_config/user-dirs.dirs +9 -0
- package/dot_config/vscode/settings.json.tmpl +9 -50
- 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 +31 -203
- package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
- package/dot_config/yazi/keymap.toml +67 -0
- package/dot_config/yazi/theme.toml +102 -0
- package/dot_config/zathura/zathurarc +52 -0
- package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
- package/dot_config/zsh/dot_zprofile +1 -7
- package/dot_config/zsh/dot_zshenv +2 -3
- package/dot_config/zsh/dot_zshrc.tmpl +368 -69
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
- package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
- 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 +113 -91
- package/dot_local/bin/executable_antigravity +11 -0
- package/dot_local/bin/executable_b64 +61 -36
- package/dot_local/bin/executable_bm +77 -0
- package/dot_local/bin/executable_cb +39 -0
- package/dot_local/bin/executable_dot +543 -132
- 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 +2 -0
- package/dot_local/bin/executable_dtags +28 -0
- package/dot_local/bin/executable_epoch +43 -38
- package/dot_local/bin/executable_extract +32 -99
- package/dot_local/bin/executable_gbd +52 -0
- package/dot_local/bin/executable_gd +42 -0
- package/dot_local/bin/executable_git-ai-commit +35 -20
- package/dot_local/bin/executable_git-ai-diff +33 -18
- package/dot_local/bin/executable_gl +101 -0
- package/dot_local/bin/executable_hash +56 -18
- package/dot_local/bin/executable_hashsum +160 -0
- package/dot_local/bin/executable_hex +44 -8
- package/dot_local/bin/executable_jsonv +34 -10
- package/dot_local/bin/executable_jwt +22 -6
- package/dot_local/bin/executable_kill-port +18 -2
- package/dot_local/bin/executable_lorem +21 -6
- package/dot_local/bin/executable_mkscript +35 -0
- package/dot_local/bin/executable_monitor +56 -0
- package/dot_local/bin/{executable_ip → executable_myip} +16 -2
- 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 +49 -13
- package/dot_local/bin/executable_start-niri +8 -0
- package/dot_local/bin/executable_tmux-sessionizer +276 -149
- package/dot_local/bin/executable_tour +112 -74
- package/dot_local/bin/executable_up +21 -0
- package/dot_local/bin/executable_update +45 -11
- package/dot_local/bin/executable_uuid +37 -7
- package/dot_local/bin/executable_win +32 -0
- package/dot_local/bin/executable_yamlv +25 -7
- package/dot_local/share/bash-completion/completions/dot +62 -44
- 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/_dot +283 -0
- package/install.sh +297 -210
- package/package.json +17 -5
- 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 +41 -39
- package/scripts/demo/record.sh +3 -2
- 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 +209 -29
- package/scripts/diagnostics/conflicts.sh +72 -0
- package/scripts/diagnostics/doctor-unified.sh +38 -0
- package/scripts/diagnostics/doctor.sh +491 -65
- package/scripts/diagnostics/drift-dashboard.sh +17 -6
- package/scripts/diagnostics/health.sh +351 -110
- package/scripts/diagnostics/history-analysis.sh +12 -4
- 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 +139 -93
- package/scripts/diagnostics/smoke-test.sh +87 -0
- package/scripts/diagnostics/snapshot.sh +89 -0
- package/scripts/diagnostics/verify.sh +107 -0
- package/scripts/diagnostics/verify_state.sh +2 -2
- 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 +21 -4
- package/scripts/dot/commands/core.sh +59 -4
- package/scripts/dot/commands/diagnostics.sh +132 -3
- 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 +148 -17
- package/scripts/dot/commands/patterns.sh +54 -0
- package/scripts/dot/commands/restore.sh +57 -35
- package/scripts/dot/commands/secrets.sh +151 -9
- package/scripts/dot/commands/security.sh +3 -0
- package/scripts/dot/commands/tools.sh +268 -27
- 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 +318 -18
- package/scripts/fonts/install-nerd-fonts.sh +19 -10
- package/scripts/fonts/patch-fonts.sh +1 -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 +245 -17
- package/scripts/ops/chezmoi-diff.sh +1 -0
- package/scripts/ops/chezmoi-remove.sh +2 -0
- package/scripts/ops/chezmoi-update.sh +34 -2
- 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 +98 -342
- 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 +86 -28
- package/scripts/ops/setup.sh +137 -0
- package/scripts/ops/teleport.sh +2 -1
- 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 +1 -0
- package/scripts/secrets/create-secrets-file.sh +1 -0
- package/scripts/secrets/encrypt-ssh-key.sh +1 -0
- package/scripts/security/backup.sh +44 -4
- package/scripts/security/dns-doh.sh +36 -14
- package/scripts/security/encryption-check.sh +27 -12
- package/scripts/security/enforce-policies.sh +11 -16
- package/scripts/security/firewall.sh +76 -20
- package/scripts/security/lock-configs.sh +2 -2
- package/scripts/security/lock-screen.sh +40 -18
- package/scripts/security/manage-secrets.sh +42 -29
- package/scripts/security/ssh-cert.sh +203 -0
- package/scripts/security/telemetry-kill.sh +40 -18
- package/scripts/security/usb-safety.sh +37 -15
- package/scripts/theme/apply-gnome-theme.sh +87 -56
- package/scripts/theme/extract-theme.py +677 -0
- package/scripts/theme/install-boot-logo.sh +1 -0
- package/scripts/theme/install-catppuccin-themes.sh +57 -33
- package/scripts/theme/install-cursors.sh +1 -0
- package/scripts/theme/install-file-icons.sh +1 -0
- package/scripts/theme/install-grub-theme.sh +11 -1
- package/scripts/theme/install-lock-icon.sh +1 -0
- package/scripts/theme/merge-wallpaper.sh +141 -0
- package/scripts/theme/rebuild-themes.sh +309 -0
- package/scripts/theme/switch.sh +308 -137
- package/scripts/theme/wallpaper-rotate.sh +66 -12
- package/scripts/theme/wallpaper-sync.sh +386 -31
- package/scripts/tools/cmatrix.sh +1 -0
- package/scripts/tools/detect-collisions.py +1 -1
- package/scripts/tools/emoji-picker.sh +4 -1
- package/scripts/tools/figlet-banner.sh +1 -0
- package/scripts/tools/log-rotate.sh +2 -1
- package/scripts/tools/lolcat-wrap.sh +1 -0
- package/scripts/tools/pipes.sh +1 -0
- package/scripts/tuning/linux.sh +23 -13
- package/scripts/tuning/macos.sh +13 -4
- 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 +1 -1
- 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 +1 -1
- package/templates/projects/node/.github/workflows/ci.yml +30 -0
- package/templates/projects/node/README.md +1 -1
- package/templates/projects/node/package-lock.json +12 -0
- package/templates/projects/node/src/index.js +1 -0
- package/templates/projects/packer/README.md +1 -1
- package/templates/projects/python/.github/workflows/ci.yml +34 -0
- package/templates/projects/python/README.md +1 -1
- 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 -229
- package/docs/COMPLIANCE.md +0 -47
- package/docs/FEATURES.md +0 -166
- package/docs/FONTS.md +0 -147
- package/docs/INSTALL.md +0 -119
- package/docs/KEYS.md +0 -40
- package/docs/OPERATIONS.md +0 -130
- package/docs/PR_DESCRIPTION.md +0 -149
- package/docs/SECRETS.md +0 -76
- package/docs/SECURITY.md +0 -30
- package/docs/SECURITY_CHECKLIST.md +0 -25
- package/docs/TASK.md +0 -99
- package/docs/TESTING.md +0 -190
- package/docs/TOOLS.md +0 -146
- package/docs/UTILS.md +0 -105
- package/docs/WALKTHROUGH.md +0 -165
- package/dot_config/clippy.toml +0 -55
- package/dot_config/dotfiles/versions.env.tmpl +0 -19
- package/dot_config/firefox/user.js +0 -8
- package/dot_config/git/config.tmpl +0 -77
- package/dot_config/go/aliases.sh +0 -61
- package/dot_config/go/env.sh +0 -24
- package/dot_config/ice/README.md +0 -13
- package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
- package/dot_config/lsd/config.yaml +0 -19
- package/dot_config/nvim/snippets/all.lua +0 -9
- package/dot_config/nvim/snippets/python.lua +0 -16
- package/dot_config/shell/00-container-detect.sh +0 -53
- package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
- package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
- package/dot_config/shell/90-theme-switch.sh +0 -70
- package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
- package/dot_config/waybar/style.css +0 -8
- package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
- package/dot_local/bin/executable_zig-install +0 -89
- package/dot_local/bin/voice_ops +0 -7
- package/scripts/ops/health-check.sh +0 -380
- package/scripts/tests/README.md +0 -241
- package/scripts/tests/benchmark.sh +0 -91
- package/scripts/tests/framework/assertions.sh +0 -283
- package/scripts/tests/framework/mocks.sh +0 -201
- package/scripts/tests/framework/test_runner.sh +0 -189
- package/scripts/tests/integration/test_install.sh +0 -237
- package/scripts/tests/performance/benchmark_runner.sh +0 -156
- package/scripts/tests/performance/regression_check.sh +0 -73
- package/scripts/tests/performance/stress_test.sh +0 -65
- package/scripts/tests/test-aliases.sh +0 -25
- package/scripts/tests/test-docker.sh +0 -48
- package/scripts/tests/unit/test_ai_aliases.sh +0 -158
- package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
- package/scripts/tests/unit/test_backup.sh +0 -227
- package/scripts/tests/unit/test_case_functions.sh +0 -238
- package/scripts/tests/unit/test_cd_aliases.sh +0 -367
- package/scripts/tests/unit/test_dot_cli.sh +0 -217
- package/scripts/tests/unit/test_encode64.sh +0 -67
- package/scripts/tests/unit/test_environment.sh +0 -78
- package/scripts/tests/unit/test_extract.sh +0 -163
- package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
- package/scripts/tests/unit/test_genpass.sh +0 -298
- package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
- package/scripts/tests/unit/test_installers.sh +0 -172
- package/scripts/tests/unit/test_keygen.sh +0 -68
- package/scripts/tests/unit/test_logging.sh +0 -96
- package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
- package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
- package/scripts/tests/unit/test_prependpath.sh +0 -66
- package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
- package/scripts/tests/unit/test_rd.sh +0 -230
- package/scripts/tests/unit/test_security_fixes.sh +0 -130
- package/scripts/tests/unit/test_security_scripts.sh +0 -87
- package/scripts/tests/unit/test_template_validation.sh +0 -238
- package/scripts/tests/unit/test_utility_functions.sh +0 -144
- package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
- package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
- package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
- package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
- package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
- package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
- package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
- package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
- package/scripts/tests/unit/test_zipf.sh +0 -76
- /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
- /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
- /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
- /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
- /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
- /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
- /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
- /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
- /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
- /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
- /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
- /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
|
@@ -1,19 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
## Security Score Assessment.
|
|
4
|
+
##
|
|
5
|
+
## Evaluates system security posture across encryption, SSH, Git, system
|
|
6
|
+
## hardening, and secrets management. Returns a letter grade (A+ to F) with
|
|
7
|
+
## actionable recommendations.
|
|
8
|
+
##
|
|
9
|
+
## # Usage
|
|
10
|
+
## dot security-score [--verbose|-v] [--json|-j] [--quiet|-q]
|
|
11
|
+
##
|
|
12
|
+
## # Dependencies
|
|
13
|
+
## - age: Encryption tool check
|
|
14
|
+
## - sops: Secrets manager check
|
|
15
|
+
## - gpg: Key management check
|
|
16
|
+
## - git: Commit signing verification
|
|
17
|
+
##
|
|
18
|
+
## # Platform Notes
|
|
19
|
+
## - macOS: Checks socketfilterfw, FileVault, Little Snitch
|
|
20
|
+
## - Linux: Checks ufw/firewalld, LUKS encryption
|
|
21
|
+
## - WSL: Checks host encryption, virtualization detection
|
|
22
|
+
##
|
|
23
|
+
## # Security
|
|
24
|
+
## Does not modify system state. Read-only checks only.
|
|
25
|
+
##
|
|
26
|
+
## # Idempotency
|
|
27
|
+
## Safe to run repeatedly. No side effects.
|
|
4
28
|
|
|
5
29
|
set -euo pipefail
|
|
30
|
+
set +o xtrace 2>/dev/null || true
|
|
6
31
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
BLUE='\033[0;34m'
|
|
12
|
-
CYAN='\033[0;36m'
|
|
13
|
-
NC='\033[0m'
|
|
32
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
33
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
34
|
+
# shellcheck disable=SC1091
|
|
35
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
14
36
|
|
|
15
37
|
# Parse arguments
|
|
16
|
-
VERBOSE=
|
|
38
|
+
VERBOSE=true
|
|
17
39
|
JSON_OUTPUT=false
|
|
18
40
|
while [[ $# -gt 0 ]]; do
|
|
19
41
|
case "$1" in
|
|
@@ -21,7 +43,11 @@ while [[ $# -gt 0 ]]; do
|
|
|
21
43
|
VERBOSE=true
|
|
22
44
|
shift
|
|
23
45
|
;;
|
|
24
|
-
--
|
|
46
|
+
--quiet | -q)
|
|
47
|
+
VERBOSE=false
|
|
48
|
+
shift
|
|
49
|
+
;;
|
|
50
|
+
--json | -j)
|
|
25
51
|
JSON_OUTPUT=true
|
|
26
52
|
shift
|
|
27
53
|
;;
|
|
@@ -29,6 +55,12 @@ while [[ $# -gt 0 ]]; do
|
|
|
29
55
|
esac
|
|
30
56
|
done
|
|
31
57
|
|
|
58
|
+
ui_init
|
|
59
|
+
NC="${NORMAL}"
|
|
60
|
+
RED="${RED:-}"
|
|
61
|
+
GREEN="${GREEN:-}"
|
|
62
|
+
YELLOW="${YELLOW:-}"
|
|
63
|
+
|
|
32
64
|
# Scoring
|
|
33
65
|
TOTAL_POINTS=0
|
|
34
66
|
MAX_POINTS=0
|
|
@@ -39,7 +71,6 @@ add_points() {
|
|
|
39
71
|
local points="$2"
|
|
40
72
|
local max="$3"
|
|
41
73
|
local description="$4"
|
|
42
|
-
# $5 is status (pass/fail/partial) - used for icon selection below
|
|
43
74
|
|
|
44
75
|
TOTAL_POINTS=$((TOTAL_POINTS + points))
|
|
45
76
|
MAX_POINTS=$((MAX_POINTS + max))
|
|
@@ -47,29 +78,42 @@ add_points() {
|
|
|
47
78
|
|
|
48
79
|
if ! $JSON_OUTPUT && $VERBOSE; then
|
|
49
80
|
local icon
|
|
81
|
+
local color=""
|
|
50
82
|
if [[ $points -eq $max ]]; then
|
|
51
|
-
icon="
|
|
83
|
+
icon="✓"
|
|
84
|
+
color="$GREEN"
|
|
52
85
|
elif [[ $points -gt 0 ]]; then
|
|
53
|
-
icon="
|
|
86
|
+
icon="◐"
|
|
87
|
+
color="$YELLOW"
|
|
88
|
+
else
|
|
89
|
+
icon="✗"
|
|
90
|
+
color="$RED"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
94
|
+
ui_status "$icon" "[OK]" "$description" "$points/$max pts" "$color"
|
|
54
95
|
else
|
|
55
|
-
|
|
96
|
+
ui_bullet "$description ($points/$max pts)"
|
|
56
97
|
fi
|
|
57
|
-
printf " $icon %-40s %d/%d pts\n" "$description" "$points" "$max"
|
|
58
98
|
fi
|
|
59
99
|
}
|
|
60
100
|
|
|
61
101
|
print_header() {
|
|
62
102
|
if ! $JSON_OUTPUT; then
|
|
63
|
-
echo
|
|
64
|
-
|
|
65
|
-
|
|
103
|
+
echo ""
|
|
104
|
+
ui_dot_banner "Diagnostics"
|
|
105
|
+
ui_header "Security Score Assessment"
|
|
106
|
+
echo ""
|
|
66
107
|
fi
|
|
67
108
|
}
|
|
68
109
|
|
|
69
110
|
section() {
|
|
70
111
|
if ! $JSON_OUTPUT; then
|
|
71
|
-
echo
|
|
72
|
-
|
|
112
|
+
echo ""
|
|
113
|
+
ui_section "$1"
|
|
114
|
+
if [[ "$UI_ENABLED" != "1" ]]; then
|
|
115
|
+
echo "───────────────────────────────────────────────"
|
|
116
|
+
fi
|
|
73
117
|
fi
|
|
74
118
|
}
|
|
75
119
|
|
|
@@ -80,41 +124,41 @@ check_encryption() {
|
|
|
80
124
|
|
|
81
125
|
# Age encryption tool
|
|
82
126
|
if command -v age >/dev/null 2>&1; then
|
|
83
|
-
add_points "encryption" 5 5 "Age encryption installed"
|
|
127
|
+
add_points "encryption" 5 5 "Age encryption installed"
|
|
84
128
|
else
|
|
85
|
-
add_points "encryption" 0 5 "Age encryption installed"
|
|
129
|
+
add_points "encryption" 0 5 "Age encryption installed"
|
|
86
130
|
fi
|
|
87
131
|
|
|
88
132
|
# Age key exists
|
|
89
133
|
if [[ -f "${HOME}/.config/chezmoi/key.txt" ]]; then
|
|
90
|
-
add_points "encryption" 5 5 "Age encryption key present"
|
|
134
|
+
add_points "encryption" 5 5 "Age encryption key present"
|
|
91
135
|
|
|
92
136
|
# Check key permissions
|
|
93
137
|
local perms
|
|
94
138
|
perms=$(stat -c "%a" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null || stat -f "%OLp" "${HOME}/.config/chezmoi/key.txt" 2>/dev/null)
|
|
95
139
|
if [[ "$perms" == "600" ]]; then
|
|
96
|
-
add_points "encryption" 5 5 "Key file permissions (600)"
|
|
140
|
+
add_points "encryption" 5 5 "Key file permissions (600)"
|
|
97
141
|
else
|
|
98
|
-
add_points "encryption" 2 5 "Key file permissions (600)"
|
|
142
|
+
add_points "encryption" 2 5 "Key file permissions (600)"
|
|
99
143
|
fi
|
|
100
144
|
else
|
|
101
|
-
add_points "encryption" 0 10 "Age encryption configured"
|
|
145
|
+
add_points "encryption" 0 10 "Age encryption configured"
|
|
102
146
|
fi
|
|
103
147
|
|
|
104
148
|
# SOPS available
|
|
105
149
|
if command -v sops >/dev/null 2>&1; then
|
|
106
|
-
add_points "encryption" 5 5 "SOPS secrets manager"
|
|
150
|
+
add_points "encryption" 5 5 "SOPS secrets manager"
|
|
107
151
|
else
|
|
108
|
-
add_points "encryption" 0 5 "SOPS secrets manager"
|
|
152
|
+
add_points "encryption" 0 5 "SOPS secrets manager"
|
|
109
153
|
fi
|
|
110
154
|
|
|
111
155
|
# GPG available
|
|
112
156
|
if command -v gpg >/dev/null 2>&1 && gpg --list-secret-keys 2>/dev/null | grep -q sec; then
|
|
113
|
-
add_points "encryption" 10 10 "GPG keys configured"
|
|
157
|
+
add_points "encryption" 10 10 "GPG keys configured"
|
|
114
158
|
elif command -v gpg >/dev/null 2>&1; then
|
|
115
|
-
add_points "encryption" 3 10 "GPG keys configured"
|
|
159
|
+
add_points "encryption" 3 10 "GPG keys configured"
|
|
116
160
|
else
|
|
117
|
-
add_points "encryption" 0 10 "GPG keys configured"
|
|
161
|
+
add_points "encryption" 0 10 "GPG keys configured"
|
|
118
162
|
fi
|
|
119
163
|
}
|
|
120
164
|
|
|
@@ -126,35 +170,35 @@ check_ssh() {
|
|
|
126
170
|
local ssh_perms
|
|
127
171
|
ssh_perms=$(stat -c "%a" "${HOME}/.ssh" 2>/dev/null || stat -f "%OLp" "${HOME}/.ssh" 2>/dev/null)
|
|
128
172
|
if [[ "$ssh_perms" == "700" ]]; then
|
|
129
|
-
add_points "ssh" 5 5 "SSH directory permissions (700)"
|
|
173
|
+
add_points "ssh" 5 5 "SSH directory permissions (700)"
|
|
130
174
|
else
|
|
131
|
-
add_points "ssh" 2 5 "SSH directory permissions (700)"
|
|
175
|
+
add_points "ssh" 2 5 "SSH directory permissions (700)"
|
|
132
176
|
fi
|
|
133
177
|
else
|
|
134
|
-
add_points "ssh" 0 5 "SSH directory exists"
|
|
178
|
+
add_points "ssh" 0 5 "SSH directory exists"
|
|
135
179
|
fi
|
|
136
180
|
|
|
137
181
|
# ED25519 key (preferred over RSA)
|
|
138
182
|
if [[ -f "${HOME}/.ssh/id_ed25519" ]]; then
|
|
139
|
-
add_points "ssh" 10 10 "ED25519 SSH key (modern)"
|
|
183
|
+
add_points "ssh" 10 10 "ED25519 SSH key (modern)"
|
|
140
184
|
elif [[ -f "${HOME}/.ssh/id_rsa" ]]; then
|
|
141
|
-
add_points "ssh" 5 10 "SSH key present (RSA)"
|
|
185
|
+
add_points "ssh" 5 10 "SSH key present (RSA)"
|
|
142
186
|
else
|
|
143
|
-
add_points "ssh" 0 10 "SSH key present"
|
|
187
|
+
add_points "ssh" 0 10 "SSH key present"
|
|
144
188
|
fi
|
|
145
189
|
|
|
146
190
|
# SSH agent
|
|
147
191
|
if [[ -n "${SSH_AUTH_SOCK:-}" ]] || pgrep -x ssh-agent >/dev/null 2>&1; then
|
|
148
|
-
add_points "ssh" 5 5 "SSH agent running"
|
|
192
|
+
add_points "ssh" 5 5 "SSH agent running"
|
|
149
193
|
else
|
|
150
|
-
add_points "ssh" 0 5 "SSH agent running"
|
|
194
|
+
add_points "ssh" 0 5 "SSH agent running"
|
|
151
195
|
fi
|
|
152
196
|
|
|
153
197
|
# SSH config exists
|
|
154
198
|
if [[ -f "${HOME}/.ssh/config" ]]; then
|
|
155
|
-
add_points "ssh" 5 5 "SSH config present"
|
|
199
|
+
add_points "ssh" 5 5 "SSH config present"
|
|
156
200
|
else
|
|
157
|
-
add_points "ssh" 2 5 "SSH config present"
|
|
201
|
+
add_points "ssh" 2 5 "SSH config present"
|
|
158
202
|
fi
|
|
159
203
|
}
|
|
160
204
|
|
|
@@ -163,29 +207,29 @@ check_git() {
|
|
|
163
207
|
|
|
164
208
|
# Git installed
|
|
165
209
|
if ! command -v git >/dev/null 2>&1; then
|
|
166
|
-
add_points "git" 0 20 "Git installed"
|
|
210
|
+
add_points "git" 0 20 "Git installed"
|
|
167
211
|
return
|
|
168
212
|
fi
|
|
169
213
|
|
|
170
214
|
# Commit signing
|
|
171
215
|
if git config --global commit.gpgsign 2>/dev/null | grep -q true; then
|
|
172
|
-
add_points "git" 10 10 "Commit signing enabled"
|
|
216
|
+
add_points "git" 10 10 "Commit signing enabled"
|
|
173
217
|
else
|
|
174
|
-
add_points "git" 0 10 "Commit signing enabled"
|
|
218
|
+
add_points "git" 0 10 "Commit signing enabled"
|
|
175
219
|
fi
|
|
176
220
|
|
|
177
221
|
# User identity configured
|
|
178
222
|
if git config --global user.email >/dev/null 2>&1 && git config --global user.name >/dev/null 2>&1; then
|
|
179
|
-
add_points "git" 5 5 "Git identity configured"
|
|
223
|
+
add_points "git" 5 5 "Git identity configured"
|
|
180
224
|
else
|
|
181
|
-
add_points "git" 0 5 "Git identity configured"
|
|
225
|
+
add_points "git" 0 5 "Git identity configured"
|
|
182
226
|
fi
|
|
183
227
|
|
|
184
228
|
# Credential helper
|
|
185
229
|
if git config --global credential.helper >/dev/null 2>&1; then
|
|
186
|
-
add_points "git" 5 5 "Credential helper configured"
|
|
230
|
+
add_points "git" 5 5 "Credential helper configured"
|
|
187
231
|
else
|
|
188
|
-
add_points "git" 0 5 "Credential helper configured"
|
|
232
|
+
add_points "git" 0 5 "Credential helper configured"
|
|
189
233
|
fi
|
|
190
234
|
}
|
|
191
235
|
|
|
@@ -195,9 +239,11 @@ check_system() {
|
|
|
195
239
|
# Firewall (macOS or Linux)
|
|
196
240
|
if [[ "$(uname)" == "Darwin" ]]; then
|
|
197
241
|
if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q enabled; then
|
|
198
|
-
add_points "system" 5 5 "Firewall enabled"
|
|
242
|
+
add_points "system" 5 5 "Firewall enabled"
|
|
243
|
+
elif pgrep -x "Little Snitch" >/dev/null 2>&1 || [[ -d "/Applications/Little Snitch.app" ]]; then
|
|
244
|
+
add_points "system" 5 5 "Firewall enabled (Little Snitch)"
|
|
199
245
|
else
|
|
200
|
-
add_points "system" 0 5 "Firewall enabled"
|
|
246
|
+
add_points "system" 0 5 "Firewall enabled"
|
|
201
247
|
fi
|
|
202
248
|
else
|
|
203
249
|
# Check ufw via systemctl (doesn't need sudo) or sudo ufw status
|
|
@@ -211,41 +257,41 @@ check_system() {
|
|
|
211
257
|
fi
|
|
212
258
|
|
|
213
259
|
if $fw_enabled; then
|
|
214
|
-
add_points "system" 5 5 "Firewall enabled"
|
|
260
|
+
add_points "system" 5 5 "Firewall enabled"
|
|
215
261
|
else
|
|
216
|
-
add_points "system" 0 5 "Firewall enabled"
|
|
262
|
+
add_points "system" 0 5 "Firewall enabled"
|
|
217
263
|
fi
|
|
218
264
|
fi
|
|
219
265
|
|
|
220
266
|
# Disk encryption (LUKS, FileVault, or ecryptfs)
|
|
221
267
|
if [[ "$(uname)" == "Darwin" ]]; then
|
|
222
268
|
if fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
|
|
223
|
-
add_points "system" 10 10 "Disk encryption (FileVault)"
|
|
269
|
+
add_points "system" 10 10 "Disk encryption (FileVault)"
|
|
224
270
|
else
|
|
225
|
-
add_points "system" 0 10 "Disk encryption (FileVault)"
|
|
271
|
+
add_points "system" 0 10 "Disk encryption (FileVault)"
|
|
226
272
|
fi
|
|
227
273
|
else
|
|
228
274
|
local encryption_found=false
|
|
229
275
|
# Check LUKS
|
|
230
276
|
if lsblk 2>/dev/null | grep -q crypt || [[ -d /sys/block/dm-0 ]]; then
|
|
231
277
|
encryption_found=true
|
|
232
|
-
add_points "system" 10 10 "Disk encryption (LUKS)"
|
|
278
|
+
add_points "system" 10 10 "Disk encryption (LUKS)"
|
|
233
279
|
# Check Apple T2 chip (hardware SSD encryption)
|
|
234
280
|
elif lspci 2>/dev/null | grep -qi "T2.*Secure Enclave"; then
|
|
235
281
|
encryption_found=true
|
|
236
|
-
add_points "system" 10 10 "Hardware encryption (Apple T2)"
|
|
282
|
+
add_points "system" 10 10 "Hardware encryption (Apple T2)"
|
|
237
283
|
# Check ecryptfs (encrypted home)
|
|
238
284
|
elif mount 2>/dev/null | grep -q ecryptfs || [[ -d "$HOME/.ecryptfs" ]]; then
|
|
239
285
|
encryption_found=true
|
|
240
|
-
add_points "system" 10 10 "Home encryption (ecryptfs)"
|
|
286
|
+
add_points "system" 10 10 "Home encryption (ecryptfs)"
|
|
241
287
|
# Check if running in encrypted VM/container
|
|
242
288
|
elif [[ -f /sys/class/dmi/id/product_name ]] && grep -qiE "virtual|vmware|kvm|qemu" /sys/class/dmi/id/product_name 2>/dev/null; then
|
|
243
289
|
encryption_found=true
|
|
244
|
-
add_points "system" 10 10 "Virtualized (host encryption)"
|
|
290
|
+
add_points "system" 10 10 "Virtualized (host encryption)"
|
|
245
291
|
fi
|
|
246
292
|
|
|
247
293
|
if ! $encryption_found; then
|
|
248
|
-
add_points "system" 0 10 "Disk encryption"
|
|
294
|
+
add_points "system" 0 10 "Disk encryption"
|
|
249
295
|
fi
|
|
250
296
|
fi
|
|
251
297
|
}
|
|
@@ -256,25 +302,29 @@ check_secrets() {
|
|
|
256
302
|
# No secrets in dotfiles repo
|
|
257
303
|
if [[ -d "${HOME}/.dotfiles" ]]; then
|
|
258
304
|
local secrets_found=false
|
|
259
|
-
|
|
260
|
-
|
|
305
|
+
local match=""
|
|
306
|
+
# Check for common secret patterns, ignore templates/placeholders and variable expansions.
|
|
307
|
+
match=$(grep -rE "(api_key|api_secret|password|token)[[:space:]]*=[[:space:]]*['\"][^'\"]+['\"]" \
|
|
308
|
+
"${HOME}/.dotfiles" --include="*.sh" --include="*.zsh" --include="*.toml" 2>/dev/null |
|
|
309
|
+
grep -v "example\\|template\\|placeholder" | grep -F -v "\${" | head -1 || true)
|
|
310
|
+
if [[ -n "$match" ]]; then
|
|
261
311
|
secrets_found=true
|
|
262
312
|
fi
|
|
263
313
|
|
|
264
314
|
if $secrets_found; then
|
|
265
|
-
add_points "secrets" 0 5 "No hardcoded secrets"
|
|
315
|
+
add_points "secrets" 0 5 "No hardcoded secrets"
|
|
266
316
|
else
|
|
267
|
-
add_points "secrets" 5 5 "No hardcoded secrets"
|
|
317
|
+
add_points "secrets" 5 5 "No hardcoded secrets"
|
|
268
318
|
fi
|
|
269
319
|
else
|
|
270
|
-
add_points "secrets" 5 5 "No hardcoded secrets"
|
|
320
|
+
add_points "secrets" 5 5 "No hardcoded secrets"
|
|
271
321
|
fi
|
|
272
322
|
|
|
273
323
|
# Environment variables for secrets
|
|
274
324
|
if [[ -f "${HOME}/.config/secrets/api-keys.env" ]] || [[ -d "${HOME}/.config/secrets" ]]; then
|
|
275
|
-
add_points "secrets" 5 5 "Secrets in dedicated location"
|
|
325
|
+
add_points "secrets" 5 5 "Secrets in dedicated location"
|
|
276
326
|
else
|
|
277
|
-
add_points "secrets" 2 5 "Secrets management setup"
|
|
327
|
+
add_points "secrets" 2 5 "Secrets management setup"
|
|
278
328
|
fi
|
|
279
329
|
}
|
|
280
330
|
|
|
@@ -300,16 +350,20 @@ print_summary() {
|
|
|
300
350
|
return
|
|
301
351
|
fi
|
|
302
352
|
|
|
303
|
-
echo
|
|
304
|
-
|
|
305
|
-
echo
|
|
353
|
+
echo ""
|
|
354
|
+
ui_header "Security Score"
|
|
355
|
+
echo ""
|
|
306
356
|
|
|
307
|
-
|
|
308
|
-
local bar_width=30
|
|
357
|
+
local bar_width=28
|
|
309
358
|
local filled=$((score * bar_width / 100))
|
|
310
359
|
local empty=$((bar_width - filled))
|
|
360
|
+
local block="#"
|
|
361
|
+
local pad="-"
|
|
311
362
|
|
|
312
|
-
|
|
363
|
+
local grade
|
|
364
|
+
grade=$(get_grade $score)
|
|
365
|
+
|
|
366
|
+
printf " Score: "
|
|
313
367
|
if [[ $score -ge 80 ]]; then
|
|
314
368
|
printf '%s' "${GREEN}"
|
|
315
369
|
elif [[ $score -ge 60 ]]; then
|
|
@@ -317,39 +371,28 @@ print_summary() {
|
|
|
317
371
|
else
|
|
318
372
|
printf '%s' "${RED}"
|
|
319
373
|
fi
|
|
320
|
-
printf "%${filled}s" | tr ' '
|
|
374
|
+
printf "%${filled}s" | tr ' ' "$block"
|
|
321
375
|
printf '%s' "${NC}"
|
|
322
|
-
printf "%${empty}s" | tr ' '
|
|
323
|
-
printf "
|
|
324
|
-
|
|
325
|
-
# Grade
|
|
326
|
-
local grade
|
|
327
|
-
grade=$(get_grade $score)
|
|
328
|
-
case "$grade" in
|
|
329
|
-
A*) echo -e "${GREEN}${score}% Grade: ${grade}${NC}" ;;
|
|
330
|
-
B*) echo -e "${GREEN}${score}% Grade: ${grade}${NC}" ;;
|
|
331
|
-
C*) echo -e "${YELLOW}${score}% Grade: ${grade}${NC}" ;;
|
|
332
|
-
*) echo -e "${RED}${score}% Grade: ${grade}${NC}" ;;
|
|
333
|
-
esac
|
|
376
|
+
printf "%${empty}s" | tr ' ' "$pad"
|
|
377
|
+
printf " %s%% Grade: %s\n" "${score}" "${grade}"
|
|
334
378
|
|
|
335
|
-
|
|
379
|
+
printf '%b\n' "\n Points: ${TOTAL_POINTS}/${MAX_POINTS}"
|
|
336
380
|
echo ""
|
|
337
381
|
|
|
338
382
|
# Recommendations
|
|
339
383
|
if [[ $score -lt 100 ]]; then
|
|
340
|
-
|
|
341
|
-
|
|
384
|
+
ui_header "Recommendations"
|
|
342
385
|
if ! command -v age >/dev/null 2>&1; then
|
|
343
|
-
|
|
386
|
+
ui_bullet "Install age for encryption: brew install age"
|
|
344
387
|
fi
|
|
345
388
|
if ! command -v sops >/dev/null 2>&1; then
|
|
346
|
-
|
|
389
|
+
ui_bullet "Install SOPS for secrets: brew install sops"
|
|
347
390
|
fi
|
|
348
391
|
if ! git config --global commit.gpgsign 2>/dev/null | grep -q true; then
|
|
349
|
-
|
|
392
|
+
ui_bullet "Enable commit signing: git config --global commit.gpgsign true"
|
|
350
393
|
fi
|
|
351
394
|
if [[ ! -f "${HOME}/.ssh/id_ed25519" ]]; then
|
|
352
|
-
|
|
395
|
+
ui_bullet "Generate ED25519 SSH key: ssh-keygen -t ed25519"
|
|
353
396
|
fi
|
|
354
397
|
echo ""
|
|
355
398
|
fi
|
|
@@ -383,6 +426,9 @@ get_grade() {
|
|
|
383
426
|
}
|
|
384
427
|
|
|
385
428
|
# Main
|
|
429
|
+
export LANG="${LANG:-en_US.UTF-8}"
|
|
430
|
+
export LC_ALL="${LC_ALL:-en_US.UTF-8}"
|
|
431
|
+
|
|
386
432
|
print_header
|
|
387
433
|
check_encryption
|
|
388
434
|
check_ssh
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Smoke tests to quickly verify toolchain health after installation/updates.
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
9
|
+
# shellcheck disable=SC1091
|
|
10
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
11
|
+
ui_init
|
|
12
|
+
|
|
13
|
+
ui_header "Dotfiles Smoke Tests"
|
|
14
|
+
|
|
15
|
+
declare -i passed=0
|
|
16
|
+
declare -i failed=0
|
|
17
|
+
|
|
18
|
+
check_cmd() {
|
|
19
|
+
local cmd="$1"
|
|
20
|
+
if command -v "$cmd" >/dev/null 2>&1; then
|
|
21
|
+
return 0
|
|
22
|
+
fi
|
|
23
|
+
if command -v mise >/dev/null 2>&1; then
|
|
24
|
+
if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
|
|
25
|
+
return 0
|
|
26
|
+
fi
|
|
27
|
+
fi
|
|
28
|
+
return 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
verify_cmd() {
|
|
32
|
+
local cmd="$1"
|
|
33
|
+
local expected_output="${2:-}"
|
|
34
|
+
|
|
35
|
+
if ! check_cmd "$cmd"; then
|
|
36
|
+
ui_err "$cmd" "not found"
|
|
37
|
+
failed+=1
|
|
38
|
+
return 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if [[ -n "$expected_output" ]]; then
|
|
42
|
+
local output
|
|
43
|
+
# shellcheck disable=SC2015
|
|
44
|
+
output=$($cmd --version 2>&1 || $cmd version 2>&1 || true)
|
|
45
|
+
if echo "$output" | grep -q "$expected_output"; then
|
|
46
|
+
ui_ok "$cmd"
|
|
47
|
+
passed+=1
|
|
48
|
+
else
|
|
49
|
+
ui_err "$cmd" "output mismatch"
|
|
50
|
+
failed+=1
|
|
51
|
+
fi
|
|
52
|
+
else
|
|
53
|
+
ui_ok "$cmd"
|
|
54
|
+
passed+=1
|
|
55
|
+
fi
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# Core utilities
|
|
59
|
+
verify_cmd "git" "git version"
|
|
60
|
+
verify_cmd "zsh" "zsh"
|
|
61
|
+
verify_cmd "chezmoi" "chezmoi version"
|
|
62
|
+
|
|
63
|
+
# Rust Toolchain / Frontier
|
|
64
|
+
verify_cmd "rg" "ripgrep"
|
|
65
|
+
verify_cmd "bat" "bat"
|
|
66
|
+
verify_cmd "eza" "eza"
|
|
67
|
+
verify_cmd "zoxide" "zoxide"
|
|
68
|
+
verify_cmd "zellij" "zellij"
|
|
69
|
+
verify_cmd "shfmt" "3."
|
|
70
|
+
|
|
71
|
+
# Process management
|
|
72
|
+
verify_cmd "pueue" "pueue"
|
|
73
|
+
|
|
74
|
+
# AI Tools
|
|
75
|
+
# Prevent sgpt from prompting for a key by piping empty string
|
|
76
|
+
export OPENAI_API_KEY="sk-placeholder-for-testing"
|
|
77
|
+
verify_cmd "sgpt" "ShellGPT"
|
|
78
|
+
verify_cmd "copilot" "copilot"
|
|
79
|
+
verify_cmd "kiro-cli" "kiro-cli"
|
|
80
|
+
|
|
81
|
+
echo ""
|
|
82
|
+
if [[ $failed -eq 0 ]]; then
|
|
83
|
+
ui_ok "All $passed tests passed"
|
|
84
|
+
else
|
|
85
|
+
ui_err "$failed failed" "$passed passed"
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Snapshot current system/tooling state
|
|
4
|
+
# Usage: dot snapshot [--baseline|-b] [--force|-f]
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
10
|
+
# shellcheck disable=SC1091
|
|
11
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
12
|
+
|
|
13
|
+
ui_init
|
|
14
|
+
|
|
15
|
+
BASELINE=false
|
|
16
|
+
FORCE=false
|
|
17
|
+
while [[ $# -gt 0 ]]; do
|
|
18
|
+
case "$1" in
|
|
19
|
+
--baseline | -b)
|
|
20
|
+
BASELINE=true
|
|
21
|
+
shift
|
|
22
|
+
;;
|
|
23
|
+
--force | -f)
|
|
24
|
+
FORCE=true
|
|
25
|
+
shift
|
|
26
|
+
;;
|
|
27
|
+
*) shift ;;
|
|
28
|
+
esac
|
|
29
|
+
done
|
|
30
|
+
|
|
31
|
+
STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles/snapshots"
|
|
32
|
+
mkdir -p "$STATE_DIR"
|
|
33
|
+
|
|
34
|
+
if $BASELINE; then
|
|
35
|
+
output="$STATE_DIR/baseline.json"
|
|
36
|
+
else
|
|
37
|
+
output="$STATE_DIR/snapshot_$(date +%Y%m%d_%H%M%S).json"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
if [[ -f "$output" && "$FORCE" != "true" ]]; then
|
|
41
|
+
ui_warn "Snapshot" "${output} already exists (use --force)"
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
safe() { printf '%s' "$1" | sed 's/"/\\"/g'; }
|
|
46
|
+
|
|
47
|
+
get_version() {
|
|
48
|
+
local cmd="$1"
|
|
49
|
+
if command -v "$cmd" >/dev/null 2>&1; then
|
|
50
|
+
"$cmd" --version 2>/dev/null | head -1 | awk '{print $NF}'
|
|
51
|
+
else
|
|
52
|
+
echo ""
|
|
53
|
+
fi
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
os_name=$(uname -s 2>/dev/null || echo "unknown")
|
|
57
|
+
kernel=$(uname -r 2>/dev/null || echo "unknown")
|
|
58
|
+
shell_name=$(basename "${SHELL:-}" 2>/dev/null || echo "")
|
|
59
|
+
|
|
60
|
+
dot_version=""
|
|
61
|
+
if [[ -f "$SCRIPT_DIR/../../package.json" ]]; then
|
|
62
|
+
dot_version=$(sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([0-9.]*\)".*/\1/p' "$SCRIPT_DIR/../../package.json" | head -1)
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
cat >"$output" <<JSON
|
|
66
|
+
{
|
|
67
|
+
"timestamp": "$(date -Iseconds)",
|
|
68
|
+
"os": "$(safe "$os_name")",
|
|
69
|
+
"kernel": "$(safe "$kernel")",
|
|
70
|
+
"shell": "$(safe "$shell_name")",
|
|
71
|
+
"dotfiles_version": "$(safe "$dot_version")",
|
|
72
|
+
"tools": {
|
|
73
|
+
"chezmoi": "$(safe "$(get_version chezmoi)")",
|
|
74
|
+
"git": "$(safe "$(get_version git)")",
|
|
75
|
+
"zsh": "$(safe "$(get_version zsh)")",
|
|
76
|
+
"node": "$(safe "$(get_version node)")",
|
|
77
|
+
"python": "$(safe "$(python3 --version 2>/dev/null | awk '{print $2}')")",
|
|
78
|
+
"rustc": "$(safe "$(rustc --version 2>/dev/null | awk '{print $2}')")",
|
|
79
|
+
"go": "$(safe "$(go version 2>/dev/null | awk '{print $3}')")",
|
|
80
|
+
"nvim": "$(safe "$(nvim --version 2>/dev/null | head -1 | awk '{print $2}')")",
|
|
81
|
+
"tmux": "$(safe "$(tmux -V 2>/dev/null | awk '{print $2}')")",
|
|
82
|
+
"starship": "$(safe "$(get_version starship)")",
|
|
83
|
+
"mise": "$(safe "$(get_version mise)")"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
JSON
|
|
87
|
+
|
|
88
|
+
ui_dot_banner "Diagnostics"
|
|
89
|
+
ui_ok "Snapshot" "$output"
|