@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
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Pre-warm shell initialization caches for ultra-fast startup.
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
8
|
+
# shellcheck disable=SC1091
|
|
9
|
+
source "$SCRIPT_DIR/dot/lib/ui.sh"
|
|
10
|
+
# shellcheck disable=SC1091
|
|
11
|
+
source "$SCRIPT_DIR/dot/lib/log.sh"
|
|
12
|
+
export DOT_COMMAND="prewarm"
|
|
13
|
+
|
|
14
|
+
# Prevent concurrent execution
|
|
15
|
+
# Prefer XDG runtime dir when it exists and is writable; fallback to /tmp.
|
|
16
|
+
LOCK_BASE="/tmp"
|
|
17
|
+
if [[ -n "${XDG_RUNTIME_DIR:-}" ]] && [[ -d "${XDG_RUNTIME_DIR}" ]] && [[ -w "${XDG_RUNTIME_DIR}" ]]; then
|
|
18
|
+
LOCK_BASE="${XDG_RUNTIME_DIR}"
|
|
19
|
+
fi
|
|
20
|
+
LOCK_FILE="${LOCK_BASE}/dotfiles-prewarm.lock"
|
|
21
|
+
LOCK_DIR="${LOCK_FILE}.d"
|
|
22
|
+
if command -v flock >/dev/null 2>&1; then
|
|
23
|
+
exec 9>"$LOCK_FILE"
|
|
24
|
+
if ! flock -n 9; then
|
|
25
|
+
ui_warn "Already running" "Another instance is active"
|
|
26
|
+
exit 0
|
|
27
|
+
fi
|
|
28
|
+
else
|
|
29
|
+
# Portable fallback when flock is unavailable (e.g. minimal macOS envs).
|
|
30
|
+
if ! mkdir "$LOCK_DIR" 2>/dev/null; then
|
|
31
|
+
ui_warn "Already running" "Another instance is active"
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
trap 'rmdir "$LOCK_DIR" 2>/dev/null || true' EXIT
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}"
|
|
38
|
+
mkdir -p "$CACHE_DIR/"{zsh,bash,fish,nushell}
|
|
39
|
+
|
|
40
|
+
ui_header "Pre-warming Shell Caches"
|
|
41
|
+
|
|
42
|
+
warm_tool() {
|
|
43
|
+
local tool="$1"
|
|
44
|
+
local cmd="$2"
|
|
45
|
+
local shell="$3"
|
|
46
|
+
local ext="$4"
|
|
47
|
+
|
|
48
|
+
local cache_file="$CACHE_DIR/$shell/$tool-init.$ext"
|
|
49
|
+
local tmp_file="${cache_file}.tmp.$$"
|
|
50
|
+
|
|
51
|
+
if command -v "$tool" >/dev/null 2>&1; then
|
|
52
|
+
if eval "$cmd" >"$tmp_file" 2>/dev/null && [ -s "$tmp_file" ]; then
|
|
53
|
+
mv "$tmp_file" "$cache_file"
|
|
54
|
+
ui_ok "$tool" "Cached for $shell"
|
|
55
|
+
else
|
|
56
|
+
rm -f "$tmp_file"
|
|
57
|
+
ui_warn "$tool" "Failed to cache for $shell"
|
|
58
|
+
fi
|
|
59
|
+
fi
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
ui_section "Zsh"
|
|
63
|
+
warm_tool "mise" "mise activate zsh" "zsh" "zsh"
|
|
64
|
+
warm_tool "starship" "starship init zsh" "zsh" "zsh"
|
|
65
|
+
warm_tool "zoxide" "zoxide init zsh" "zsh" "zsh"
|
|
66
|
+
warm_tool "atuin" "atuin init zsh --disable-up-arrow" "zsh" "zsh"
|
|
67
|
+
warm_tool "fzf" "fzf --zsh" "zsh" "zsh"
|
|
68
|
+
warm_tool "direnv" "direnv hook zsh" "zsh" "zsh"
|
|
69
|
+
|
|
70
|
+
ui_section "Bash"
|
|
71
|
+
warm_tool "mise" "mise activate bash" "bash" "bash"
|
|
72
|
+
warm_tool "starship" "starship init bash" "bash" "bash"
|
|
73
|
+
warm_tool "zoxide" "zoxide init bash" "bash" "bash"
|
|
74
|
+
warm_tool "atuin" "atuin init bash --disable-up-arrow" "bash" "bash"
|
|
75
|
+
warm_tool "fzf" "fzf --bash" "bash" "bash"
|
|
76
|
+
warm_tool "direnv" "direnv hook bash" "bash" "bash"
|
|
77
|
+
|
|
78
|
+
ui_section "Fish"
|
|
79
|
+
warm_tool "mise" "mise activate fish" "fish" "fish"
|
|
80
|
+
warm_tool "starship" "starship init fish" "fish" "fish"
|
|
81
|
+
warm_tool "zoxide" "zoxide init fish" "fish" "fish"
|
|
82
|
+
warm_tool "atuin" "atuin init fish" "fish" "fish"
|
|
83
|
+
warm_tool "fzf" "fzf --fish" "fish" "fish"
|
|
84
|
+
warm_tool "direnv" "direnv hook fish" "fish" "fish"
|
|
85
|
+
|
|
86
|
+
ui_section "Nushell"
|
|
87
|
+
for _nu_entry in "starship:starship init nu:starship.nu" "zoxide:zoxide init nushell:zoxide.nu" "atuin:atuin init nu:atuin.nu"; do
|
|
88
|
+
_nu_tool="${_nu_entry%%:*}"
|
|
89
|
+
_nu_rest="${_nu_entry#*:}"
|
|
90
|
+
_nu_cmd="${_nu_rest%%:*}"
|
|
91
|
+
_nu_file="${_nu_rest#*:}"
|
|
92
|
+
if command -v "$_nu_tool" >/dev/null 2>&1; then
|
|
93
|
+
_nu_tmp="$CACHE_DIR/nushell/${_nu_file}.tmp.$$"
|
|
94
|
+
if eval "$_nu_cmd" >"$_nu_tmp" 2>/dev/null && [ -s "$_nu_tmp" ]; then
|
|
95
|
+
mv "$_nu_tmp" "$CACHE_DIR/nushell/$_nu_file"
|
|
96
|
+
ui_ok "$_nu_tool" "Cached for nushell"
|
|
97
|
+
else
|
|
98
|
+
rm -f "$_nu_tmp"
|
|
99
|
+
ui_warn "$_nu_tool" "Failed to cache for nushell"
|
|
100
|
+
fi
|
|
101
|
+
fi
|
|
102
|
+
done
|
|
103
|
+
|
|
104
|
+
# --- Completions ---
|
|
105
|
+
ui_section "Shell completions"
|
|
106
|
+
ZSH_COMP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/completions"
|
|
107
|
+
mkdir -p "$ZSH_COMP_DIR"
|
|
108
|
+
|
|
109
|
+
_prewarm_completion() {
|
|
110
|
+
local name="$1" cmd="$2"
|
|
111
|
+
shift 2
|
|
112
|
+
if command -v "$cmd" >/dev/null 2>&1; then
|
|
113
|
+
if "$cmd" "$@" >"${ZSH_COMP_DIR}/_${name}" 2>/dev/null; then
|
|
114
|
+
ui_ok "$name" "completion generated"
|
|
115
|
+
fi
|
|
116
|
+
fi
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
_prewarm_completion "gh" "gh" completion -s zsh
|
|
120
|
+
_prewarm_completion "just" "just" --completions zsh
|
|
121
|
+
_prewarm_completion "chezmoi" "chezmoi" completion zsh
|
|
122
|
+
_prewarm_completion "kubectl" "kubectl" completion zsh
|
|
123
|
+
_prewarm_completion "mise" "mise" completion zsh
|
|
124
|
+
_prewarm_completion "atuin" "atuin" gen-completions --shell zsh
|
|
125
|
+
|
|
126
|
+
ui_header "Cache Pre-warming Complete"
|
|
127
|
+
dot_log info "prewarm_complete"
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Dotfiles Release Script
|
|
5
|
+
# Orchestrates a new release: version bump, changelog, tag, and push
|
|
6
|
+
# Usage: ./scripts/ops/release.sh [patch|minor] [--dry-run]
|
|
7
|
+
# =============================================================================
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
13
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
14
|
+
# shellcheck disable=SC1091
|
|
15
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
16
|
+
# shellcheck source=../dot/lib/log.sh
|
|
17
|
+
# shellcheck disable=SC1091
|
|
18
|
+
source "$SCRIPT_DIR/../dot/lib/log.sh"
|
|
19
|
+
export DOT_COMMAND="release"
|
|
20
|
+
ui_init
|
|
21
|
+
|
|
22
|
+
log_info() { ui_info "$@"; }
|
|
23
|
+
log_success() { ui_ok "$@"; }
|
|
24
|
+
log_warn() { ui_warn "$@"; }
|
|
25
|
+
log_error() { ui_err "$@"; }
|
|
26
|
+
log_step() {
|
|
27
|
+
echo ""
|
|
28
|
+
ui_section "$*"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Cross-platform sed in-place (BSD vs GNU)
|
|
32
|
+
sed_in_place() {
|
|
33
|
+
if sed --version >/dev/null 2>&1; then
|
|
34
|
+
sed -i "$@" # GNU
|
|
35
|
+
else
|
|
36
|
+
sed -i '' "$@" # BSD (macOS)
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
usage() {
|
|
41
|
+
local current
|
|
42
|
+
current=$(get_version)
|
|
43
|
+
local next_patch
|
|
44
|
+
next_patch=$(bump_version "$current" "patch")
|
|
45
|
+
local next_minor
|
|
46
|
+
next_minor=$(bump_version "$current" "minor")
|
|
47
|
+
|
|
48
|
+
cat <<EOF
|
|
49
|
+
Dotfiles Release Tool
|
|
50
|
+
|
|
51
|
+
Usage: $(basename "$0") [BUMP_TYPE] [OPTIONS]
|
|
52
|
+
|
|
53
|
+
Bump Types:
|
|
54
|
+
patch Increment patch version ($current → $next_patch) [default]
|
|
55
|
+
minor Increment minor version ($current → $next_minor)
|
|
56
|
+
|
|
57
|
+
Options:
|
|
58
|
+
-n, --dry-run Show what would be done without making changes
|
|
59
|
+
-h, --help Show this help message
|
|
60
|
+
|
|
61
|
+
Steps performed:
|
|
62
|
+
1. Verify clean working tree and up-to-date branch
|
|
63
|
+
2. Bump version in package.json
|
|
64
|
+
3. Run version-sync to update docs
|
|
65
|
+
4. Update CHANGELOG.md with new version header
|
|
66
|
+
5. Create signed commit and tag
|
|
67
|
+
6. Push commit and tag to origin
|
|
68
|
+
|
|
69
|
+
Examples:
|
|
70
|
+
$(basename "$0") # Patch release
|
|
71
|
+
$(basename "$0") minor # Minor release
|
|
72
|
+
$(basename "$0") --dry-run # Preview patch release
|
|
73
|
+
|
|
74
|
+
EOF
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# Get current version from package.json
|
|
78
|
+
get_version() {
|
|
79
|
+
grep -o '"version": "[^"]*"' "$PROJECT_ROOT/package.json" | grep -o '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# Bump version string
|
|
83
|
+
bump_version() {
|
|
84
|
+
local current="$1" bump_type="$2"
|
|
85
|
+
local major minor patch
|
|
86
|
+
IFS='.' read -r major minor patch <<<"$current"
|
|
87
|
+
|
|
88
|
+
case "$bump_type" in
|
|
89
|
+
patch) patch=$((patch + 1)) ;;
|
|
90
|
+
minor)
|
|
91
|
+
minor=$((minor + 1))
|
|
92
|
+
patch=0
|
|
93
|
+
;;
|
|
94
|
+
*)
|
|
95
|
+
log_error "Unknown bump type: $bump_type"
|
|
96
|
+
exit 1
|
|
97
|
+
;;
|
|
98
|
+
esac
|
|
99
|
+
|
|
100
|
+
echo "${major}.${minor}.${patch}"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
main() {
|
|
104
|
+
local bump_type="patch"
|
|
105
|
+
local dry_run=0
|
|
106
|
+
|
|
107
|
+
# Parse arguments
|
|
108
|
+
while [[ $# -gt 0 ]]; do
|
|
109
|
+
case "$1" in
|
|
110
|
+
patch | minor)
|
|
111
|
+
bump_type="$1"
|
|
112
|
+
shift
|
|
113
|
+
;;
|
|
114
|
+
-n | --dry-run)
|
|
115
|
+
dry_run=1
|
|
116
|
+
shift
|
|
117
|
+
;;
|
|
118
|
+
-h | --help)
|
|
119
|
+
usage
|
|
120
|
+
exit 0
|
|
121
|
+
;;
|
|
122
|
+
*)
|
|
123
|
+
log_error "Unknown argument: $1"
|
|
124
|
+
usage
|
|
125
|
+
exit 1
|
|
126
|
+
;;
|
|
127
|
+
esac
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
# Concurrency guard
|
|
131
|
+
LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/dotfiles-release.lock"
|
|
132
|
+
exec 9>"$LOCK_FILE"
|
|
133
|
+
if ! flock -n 9; then
|
|
134
|
+
ui_warn "Already running" "Another release is in progress"
|
|
135
|
+
exit 0
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
cd "$PROJECT_ROOT"
|
|
139
|
+
dot_log info "release_start" "bump_type=$bump_type"
|
|
140
|
+
|
|
141
|
+
local current_version new_version
|
|
142
|
+
current_version=$(get_version)
|
|
143
|
+
new_version=$(bump_version "$current_version" "$bump_type")
|
|
144
|
+
|
|
145
|
+
printf '%b\n' "${BOLD}Dotfiles Release${NC}"
|
|
146
|
+
echo " Current: v${current_version}"
|
|
147
|
+
echo " Next: v${new_version} (${bump_type})"
|
|
148
|
+
echo ""
|
|
149
|
+
|
|
150
|
+
if [[ "$dry_run" == "1" ]]; then
|
|
151
|
+
log_warn "DRY-RUN MODE — no changes will be made"
|
|
152
|
+
echo ""
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# ── Step 1: Preflight checks ─────────────────────────────────
|
|
156
|
+
log_step "Preflight checks"
|
|
157
|
+
|
|
158
|
+
if [[ -n "$(git status --porcelain)" ]]; then
|
|
159
|
+
log_error "Working tree is not clean. Commit or stash changes first."
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
log_success "Working tree clean"
|
|
163
|
+
|
|
164
|
+
local branch
|
|
165
|
+
branch=$(git branch --show-current)
|
|
166
|
+
if [[ "$branch" != "master" && "$branch" != "main" ]]; then
|
|
167
|
+
log_warn "On branch '$branch' — releases typically happen from master/main"
|
|
168
|
+
read -rp "Continue anyway? [y/N] " response
|
|
169
|
+
[[ "$response" =~ ^[Yy]$ ]] || exit 0
|
|
170
|
+
fi
|
|
171
|
+
log_success "On branch: $branch"
|
|
172
|
+
|
|
173
|
+
git fetch origin "$branch" --quiet
|
|
174
|
+
local behind
|
|
175
|
+
behind=$(git rev-list --count "HEAD..origin/$branch" 2>/dev/null || echo "0")
|
|
176
|
+
if [[ "$behind" -gt 0 ]]; then
|
|
177
|
+
log_error "Branch is $behind commit(s) behind origin. Pull first."
|
|
178
|
+
exit 1
|
|
179
|
+
fi
|
|
180
|
+
log_success "Branch is up to date with origin"
|
|
181
|
+
|
|
182
|
+
if [[ "$dry_run" == "1" ]]; then
|
|
183
|
+
log_step "Would perform the following"
|
|
184
|
+
log_info "1. Bump package.json: $current_version → $new_version"
|
|
185
|
+
log_info "2. Run version-sync.sh"
|
|
186
|
+
log_info "3. Add v${new_version} header to CHANGELOG.md"
|
|
187
|
+
log_info "4. Commit: 'chore(release): v${new_version}'"
|
|
188
|
+
log_info "5. Tag: v${new_version} (signed)"
|
|
189
|
+
log_info "6. Push commit and tag to origin"
|
|
190
|
+
echo ""
|
|
191
|
+
log_success "Dry run complete"
|
|
192
|
+
exit 0
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
# ── Step 2: Bump version ──────────────────────────────────────
|
|
196
|
+
log_step "Bump version in package.json"
|
|
197
|
+
sed_in_place "s/\"version\": \"${current_version}\"/\"version\": \"${new_version}\"/" "$PROJECT_ROOT/package.json"
|
|
198
|
+
log_success "package.json: $current_version → $new_version"
|
|
199
|
+
|
|
200
|
+
# ── Step 3: Sync versions across docs ─────────────────────────
|
|
201
|
+
log_step "Sync version across docs"
|
|
202
|
+
if [[ -x "$SCRIPT_DIR/../version-sync.sh" ]]; then
|
|
203
|
+
bash "$SCRIPT_DIR/../version-sync.sh" --force 2>&1 | tail -3
|
|
204
|
+
log_success "Version sync complete"
|
|
205
|
+
else
|
|
206
|
+
log_warn "version-sync.sh not found, skipping"
|
|
207
|
+
fi
|
|
208
|
+
|
|
209
|
+
# ── Step 4: Update CHANGELOG ──────────────────────────────────
|
|
210
|
+
log_step "Update CHANGELOG.md"
|
|
211
|
+
local today
|
|
212
|
+
today=$(date +%Y-%m-%d)
|
|
213
|
+
local changelog="$PROJECT_ROOT/CHANGELOG.md"
|
|
214
|
+
|
|
215
|
+
if [[ -f "$changelog" ]]; then
|
|
216
|
+
# Insert new version header after the first "# Changelog" line
|
|
217
|
+
sed_in_place "/^## v${current_version}/i\\
|
|
218
|
+
## v${new_version} (${today})\\
|
|
219
|
+
\\
|
|
220
|
+
### Changed\\
|
|
221
|
+
\\
|
|
222
|
+
- Version bump to v${new_version}.\\
|
|
223
|
+
" "$changelog"
|
|
224
|
+
log_success "Added v${new_version} section to CHANGELOG.md"
|
|
225
|
+
else
|
|
226
|
+
log_warn "CHANGELOG.md not found, skipping"
|
|
227
|
+
fi
|
|
228
|
+
|
|
229
|
+
# ── Step 5: Commit and tag ────────────────────────────────────
|
|
230
|
+
log_step "Create signed commit and tag"
|
|
231
|
+
git add -A
|
|
232
|
+
git commit -S -m "chore(release): v${new_version}"
|
|
233
|
+
git tag -s "v${new_version}" -m "Release v${new_version}"
|
|
234
|
+
log_success "Committed and tagged v${new_version}"
|
|
235
|
+
|
|
236
|
+
# ── Step 6: Push ──────────────────────────────────────────────
|
|
237
|
+
log_step "Push to origin"
|
|
238
|
+
read -rp "Push v${new_version} to origin/$branch? [y/N] " response
|
|
239
|
+
if [[ "$response" =~ ^[Yy]$ ]]; then
|
|
240
|
+
git push origin "$branch" --follow-tags
|
|
241
|
+
log_success "Pushed v${new_version} to origin"
|
|
242
|
+
else
|
|
243
|
+
log_warn "Skipped push. Run manually:"
|
|
244
|
+
echo " git push origin $branch --follow-tags"
|
|
245
|
+
fi
|
|
246
|
+
|
|
247
|
+
echo ""
|
|
248
|
+
dot_log info "release_end" "version=$new_version"
|
|
249
|
+
log_success "Release v${new_version} complete"
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
main "$@"
|
package/scripts/ops/rollback.sh
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
2
3
|
# shellcheck disable=SC2034
|
|
3
4
|
# =============================================================================
|
|
4
5
|
# Dotfiles Rollback Script - Self-Healing Configuration Recovery
|
|
@@ -8,34 +9,43 @@
|
|
|
8
9
|
|
|
9
10
|
set -euo pipefail
|
|
10
11
|
|
|
12
|
+
_cleanup_files=()
|
|
13
|
+
trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
|
|
14
|
+
|
|
11
15
|
# Configuration
|
|
12
16
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
18
|
+
# shellcheck disable=SC1091
|
|
19
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
20
|
+
# shellcheck source=../dot/lib/log.sh
|
|
21
|
+
# shellcheck disable=SC1091
|
|
22
|
+
source "$SCRIPT_DIR/../dot/lib/log.sh"
|
|
23
|
+
export DOT_COMMAND="rollback"
|
|
13
24
|
REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
14
|
-
|
|
25
|
+
# Resolve symlinks for consistent path handling
|
|
26
|
+
if command -v realpath >/dev/null 2>&1; then
|
|
27
|
+
DOTFILES_SOURCE="$(realpath "${HOME}/.dotfiles" 2>/dev/null || echo "${HOME}/.dotfiles")"
|
|
28
|
+
elif command -v readlink >/dev/null 2>&1; then
|
|
29
|
+
DOTFILES_SOURCE="$(readlink -f "${HOME}/.dotfiles" 2>/dev/null || echo "${HOME}/.dotfiles")"
|
|
30
|
+
else
|
|
31
|
+
DOTFILES_SOURCE="${HOME}/.dotfiles"
|
|
32
|
+
fi
|
|
15
33
|
BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
|
|
16
34
|
STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles"
|
|
17
35
|
ROLLBACK_LOG="$STATE_DIR/rollback.log"
|
|
18
36
|
MAX_BACKUPS=10
|
|
19
37
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# Logging
|
|
33
|
-
log() { echo -e "$*"; }
|
|
34
|
-
log_info() { log "${BLUE}[INFO]${NC} $*"; }
|
|
35
|
-
log_success() { log "${GREEN}[OK]${NC} $*"; }
|
|
36
|
-
log_warn() { log "${YELLOW}[WARN]${NC} $*"; }
|
|
37
|
-
log_error() { log "${RED}[ERROR]${NC} $*"; }
|
|
38
|
-
log_step() { log "\n${BOLD}==> $*${NC}"; }
|
|
38
|
+
# Logging — delegates to shared ui.sh primitives
|
|
39
|
+
ui_init
|
|
40
|
+
log() { printf '%b\n' "$*"; }
|
|
41
|
+
log_info() { ui_info "$@"; }
|
|
42
|
+
log_success() { ui_ok "$@"; }
|
|
43
|
+
log_warn() { ui_warn "$@"; }
|
|
44
|
+
log_error() { ui_err "$@"; }
|
|
45
|
+
log_step() {
|
|
46
|
+
echo ""
|
|
47
|
+
ui_section "$*"
|
|
48
|
+
}
|
|
39
49
|
|
|
40
50
|
# Persistent logging
|
|
41
51
|
persist_log() {
|
|
@@ -100,7 +110,7 @@ list_backups() {
|
|
|
100
110
|
timestamp=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M:%S" "$backup" 2>/dev/null || stat -c "%y" "$backup" 2>/dev/null | cut -d'.' -f1)
|
|
101
111
|
size=$(du -sh "$backup" 2>/dev/null | cut -f1)
|
|
102
112
|
printf " %2d. %-30s %s %s\n" "$i" "$name" "$timestamp" "$size"
|
|
103
|
-
((i++))
|
|
113
|
+
((i++)) || true
|
|
104
114
|
fi
|
|
105
115
|
done < <(find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup_*" | sort -r)
|
|
106
116
|
|
|
@@ -148,17 +158,22 @@ create_backup() {
|
|
|
148
158
|
dest_dir=$(dirname "$backup_path/$rel_path")
|
|
149
159
|
mkdir -p "$dest_dir"
|
|
150
160
|
cp -a "$target" "$backup_path/$rel_path" 2>/dev/null || true
|
|
151
|
-
((backed_up++))
|
|
161
|
+
((backed_up++)) || true
|
|
152
162
|
[[ "$VERBOSE" == "1" ]] && log_info "Backed up: $rel_path"
|
|
153
163
|
fi
|
|
154
164
|
done
|
|
155
165
|
|
|
166
|
+
local git_commit="unknown"
|
|
167
|
+
if cd "$DOTFILES_SOURCE" 2>/dev/null; then
|
|
168
|
+
git_commit=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
|
169
|
+
fi
|
|
170
|
+
|
|
156
171
|
# Record metadata
|
|
157
172
|
cat >"$backup_path/.backup_meta" <<EOF
|
|
158
173
|
timestamp=$timestamp
|
|
159
174
|
reason=$reason
|
|
160
175
|
chezmoi_version=$(chezmoi --version 2>/dev/null || echo "unknown")
|
|
161
|
-
git_commit=$
|
|
176
|
+
git_commit=$git_commit
|
|
162
177
|
files_backed_up=$backed_up
|
|
163
178
|
EOF
|
|
164
179
|
|
|
@@ -229,7 +244,7 @@ perform_rollback() {
|
|
|
229
244
|
dest_dir=$(dirname "$dest")
|
|
230
245
|
mkdir -p "$dest_dir"
|
|
231
246
|
cp -a "$file" "$dest"
|
|
232
|
-
((restored++))
|
|
247
|
+
((restored++)) || true
|
|
233
248
|
[[ "$VERBOSE" == "1" ]] && log_info "Restored: $rel_path"
|
|
234
249
|
fi
|
|
235
250
|
done < <(find "$backup_path" -type f -print0)
|
|
@@ -237,6 +252,30 @@ perform_rollback() {
|
|
|
237
252
|
if [[ "$dry_run" != "1" ]]; then
|
|
238
253
|
log_success "Rollback complete: $restored file(s) restored"
|
|
239
254
|
persist_log "ROLLBACK: from $(basename "$backup_path"), $restored files restored"
|
|
255
|
+
dot_log info "rollback_end" "files=$restored" "backup=$(basename "$backup_path")"
|
|
256
|
+
|
|
257
|
+
# AI-Driven Analysis of the failure
|
|
258
|
+
if command -v dot >/dev/null 2>&1 && [[ "${DOTFILES_AI:-0}" == "1" ]]; then
|
|
259
|
+
log_step "AI Root-Cause Analysis"
|
|
260
|
+
local drift
|
|
261
|
+
drift=$(chezmoi status 2>/dev/null || true)
|
|
262
|
+
local last_log=""
|
|
263
|
+
if cd "$DOTFILES_SOURCE" 2>/dev/null; then
|
|
264
|
+
last_log=$(git log -n 5 --oneline 2>/dev/null || true)
|
|
265
|
+
fi
|
|
266
|
+
|
|
267
|
+
local ai_prompt
|
|
268
|
+
ai_prompt="System rollback was triggered from $(basename "$backup_path").
|
|
269
|
+
Recent Git History:
|
|
270
|
+
$last_log
|
|
271
|
+
|
|
272
|
+
Current Drift after rollback:
|
|
273
|
+
$drift
|
|
274
|
+
|
|
275
|
+
Analyze why the environment may have reached a state requiring rollback and suggest architectural hardening steps."
|
|
276
|
+
|
|
277
|
+
dot cl --pattern hardener "$ai_prompt" || true
|
|
278
|
+
fi
|
|
240
279
|
fi
|
|
241
280
|
}
|
|
242
281
|
|
|
@@ -265,7 +304,7 @@ git_reset() {
|
|
|
265
304
|
git stash push -m "Auto-stash before rollback $(date +%Y%m%d_%H%M%S)"
|
|
266
305
|
log_success "Changes auto-stashed (use 'git stash pop' to recover)"
|
|
267
306
|
else
|
|
268
|
-
read -rp "Stash changes? [y/N] " response
|
|
307
|
+
read -t 30 -rp "Stash changes? [y/N] " response || response="N"
|
|
269
308
|
if [[ "$response" =~ ^[Yy]$ ]]; then
|
|
270
309
|
git stash push -m "Auto-stash before rollback $(date +%Y%m%d_%H%M%S)"
|
|
271
310
|
log_success "Changes stashed"
|
|
@@ -327,9 +366,11 @@ restore_file() {
|
|
|
327
366
|
|
|
328
367
|
local source_file="$backup/$file_path"
|
|
329
368
|
|
|
369
|
+
# shellcheck disable=SC1091
|
|
330
370
|
# Verify resolved source path stays within the backup directory
|
|
331
371
|
local resolved_source
|
|
332
372
|
resolved_source="$(cd "$(dirname "$source_file")" 2>/dev/null && pwd)/$(basename "$source_file")" || {
|
|
373
|
+
# shellcheck disable=SC1091
|
|
333
374
|
log_error "Cannot resolve source path: $source_file"
|
|
334
375
|
return 1
|
|
335
376
|
}
|
|
@@ -434,6 +475,11 @@ main() {
|
|
|
434
475
|
local command="${1:-status}"
|
|
435
476
|
shift || true
|
|
436
477
|
|
|
478
|
+
if [[ "$command" == "help" ]]; then
|
|
479
|
+
usage
|
|
480
|
+
exit 0
|
|
481
|
+
fi
|
|
482
|
+
|
|
437
483
|
# Parse global options
|
|
438
484
|
while [[ $# -gt 0 ]]; do
|
|
439
485
|
case "$1" in
|
|
@@ -459,6 +505,18 @@ main() {
|
|
|
459
505
|
|
|
460
506
|
ensure_dirs
|
|
461
507
|
|
|
508
|
+
# Concurrency guard
|
|
509
|
+
LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/dotfiles-rollback.lock"
|
|
510
|
+
if command -v flock >/dev/null 2>&1; then
|
|
511
|
+
exec 9>"$LOCK_FILE"
|
|
512
|
+
if ! flock -n 9; then
|
|
513
|
+
ui_warn "Already running" "Another rollback instance is active"
|
|
514
|
+
exit 0
|
|
515
|
+
fi
|
|
516
|
+
fi
|
|
517
|
+
|
|
518
|
+
dot_log info "rollback_start" "command=$command"
|
|
519
|
+
|
|
462
520
|
case "$command" in
|
|
463
521
|
status)
|
|
464
522
|
show_status
|
|
@@ -474,7 +532,7 @@ main() {
|
|
|
474
532
|
exit 1
|
|
475
533
|
fi
|
|
476
534
|
if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
|
|
477
|
-
read -rp "Rollback to $(basename "$latest")? [y/N] " response
|
|
535
|
+
read -t 30 -rp "Rollback to $(basename "$latest")? [y/N] " response || response="N"
|
|
478
536
|
[[ ! "$response" =~ ^[Yy]$ ]] && exit 0
|
|
479
537
|
fi
|
|
480
538
|
perform_rollback "$latest" "$DRY_RUN"
|
|
@@ -492,14 +550,14 @@ main() {
|
|
|
492
550
|
exit 1
|
|
493
551
|
fi
|
|
494
552
|
if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
|
|
495
|
-
read -rp "Rollback to $(basename "$backup")? [y/N] " response
|
|
553
|
+
read -t 30 -rp "Rollback to $(basename "$backup")? [y/N] " response || response="N"
|
|
496
554
|
[[ ! "$response" =~ ^[Yy]$ ]] && exit 0
|
|
497
555
|
fi
|
|
498
556
|
perform_rollback "$backup" "$DRY_RUN"
|
|
499
557
|
;;
|
|
500
558
|
git-reset)
|
|
501
559
|
if [[ "$FORCE" != "1" ]] && [[ "$DRY_RUN" != "1" ]]; then
|
|
502
|
-
read -rp "Reset to last known good commit? [y/N] " response
|
|
560
|
+
read -t 30 -rp "Reset to last known good commit? [y/N] " response || response="N"
|
|
503
561
|
[[ ! "$response" =~ ^[Yy]$ ]] && exit 0
|
|
504
562
|
fi
|
|
505
563
|
git_reset "$DRY_RUN"
|