@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
package/scripts/tests/README.md
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
# Dotfiles Test Suite
|
|
2
|
-
|
|
3
|
-
A comprehensive shell testing framework for validating dotfiles functionality.
|
|
4
|
-
|
|
5
|
-
## Directory Structure
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
scripts/tests/
|
|
9
|
-
├── framework/
|
|
10
|
-
│ ├── test_runner.sh # Main test runner
|
|
11
|
-
│ ├── assertions.sh # Assert functions
|
|
12
|
-
│ └── mocks.sh # Mock utilities
|
|
13
|
-
├── unit/
|
|
14
|
-
│ ├── test_extract.sh # Tests for extract function
|
|
15
|
-
│ ├── test_backup.sh # Tests for backup function
|
|
16
|
-
│ ├── test_genpass.sh # Tests for genpass function
|
|
17
|
-
│ ├── test_rd.sh # Tests for rd function
|
|
18
|
-
│ └── test_cd_aliases.sh # Tests for cd aliases
|
|
19
|
-
├── integration/
|
|
20
|
-
│ └── test_install.sh # Tests for install.sh
|
|
21
|
-
└── README.md # This file
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Quick Start
|
|
25
|
-
|
|
26
|
-
### Run All Unit Tests
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
./scripts/tests/framework/test_runner.sh
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Run Specific Test
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# Run only extract tests
|
|
36
|
-
./scripts/tests/framework/test_runner.sh extract
|
|
37
|
-
|
|
38
|
-
# Run only backup tests
|
|
39
|
-
./scripts/tests/framework/test_runner.sh backup
|
|
40
|
-
|
|
41
|
-
# Run only genpass tests
|
|
42
|
-
./scripts/tests/framework/test_runner.sh genpass
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Run with Integration Tests
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# Using environment variable
|
|
49
|
-
RUN_INTEGRATION=1 ./scripts/tests/framework/test_runner.sh
|
|
50
|
-
|
|
51
|
-
# Using flag
|
|
52
|
-
./scripts/tests/framework/test_runner.sh -i
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Run Individual Test File
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# Source assertions and run directly
|
|
59
|
-
source ./scripts/tests/framework/assertions.sh
|
|
60
|
-
source ./scripts/tests/unit/test_extract.sh
|
|
61
|
-
print_summary
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Test Framework
|
|
65
|
-
|
|
66
|
-
### Assertions
|
|
67
|
-
|
|
68
|
-
The framework provides these assertion functions:
|
|
69
|
-
|
|
70
|
-
| Function | Description |
|
|
71
|
-
|----------|-------------|
|
|
72
|
-
| `assert_equals expected actual [msg]` | Assert two values are equal |
|
|
73
|
-
| `assert_not_equals unexpected actual [msg]` | Assert two values differ |
|
|
74
|
-
| `assert_exit_code code command` | Assert command exits with code |
|
|
75
|
-
| `assert_output_contains needle command` | Assert output contains string |
|
|
76
|
-
| `assert_output_not_contains needle command` | Assert output lacks string |
|
|
77
|
-
| `assert_output_matches pattern command` | Assert output matches regex |
|
|
78
|
-
| `assert_file_exists path [msg]` | Assert file exists |
|
|
79
|
-
| `assert_file_not_exists path [msg]` | Assert file doesn't exist |
|
|
80
|
-
| `assert_dir_exists path [msg]` | Assert directory exists |
|
|
81
|
-
| `assert_dir_not_exists path [msg]` | Assert directory doesn't exist |
|
|
82
|
-
| `assert_true condition [msg]` | Assert condition is true |
|
|
83
|
-
| `assert_false condition [msg]` | Assert condition is false |
|
|
84
|
-
| `assert_empty value [msg]` | Assert string is empty |
|
|
85
|
-
| `assert_not_empty value [msg]` | Assert string is not empty |
|
|
86
|
-
| `assert_file_contains file needle [msg]` | Assert file contains text |
|
|
87
|
-
|
|
88
|
-
### Mocks
|
|
89
|
-
|
|
90
|
-
The mock library provides utilities for test isolation:
|
|
91
|
-
|
|
92
|
-
| Function | Description |
|
|
93
|
-
|----------|-------------|
|
|
94
|
-
| `mock_init` | Initialize mock environment |
|
|
95
|
-
| `mock_command name output [exit_code]` | Create mock command |
|
|
96
|
-
| `mock_command_spy name [output] [exit_code]` | Create mock that records calls |
|
|
97
|
-
| `mock_get_calls name` | Get spy call history |
|
|
98
|
-
| `mock_call_count name` | Get number of spy calls |
|
|
99
|
-
| `mock_file content [filename]` | Create temp file with content |
|
|
100
|
-
| `mock_dir [prefix]` | Create temp directory |
|
|
101
|
-
| `mock_archive type [content]` | Create mock archive file |
|
|
102
|
-
| `mock_env var_name value` | Set environment variable |
|
|
103
|
-
| `mock_cleanup` | Clean up all mocks |
|
|
104
|
-
|
|
105
|
-
## Writing Tests
|
|
106
|
-
|
|
107
|
-
### Basic Test Structure
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
#!/usr/bin/env bash
|
|
111
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
112
|
-
source "$SCRIPT_DIR/../framework/assertions.sh"
|
|
113
|
-
source "$SCRIPT_DIR/../framework/mocks.sh"
|
|
114
|
-
|
|
115
|
-
# Source function being tested
|
|
116
|
-
source "$REPO_ROOT/.chezmoitemplates/functions/myfunction.sh"
|
|
117
|
-
|
|
118
|
-
# Test case
|
|
119
|
-
test_start "my_function_basic"
|
|
120
|
-
output=$(myfunction "arg" 2>&1)
|
|
121
|
-
assert_equals "expected" "$output" "should return expected"
|
|
122
|
-
|
|
123
|
-
# Another test
|
|
124
|
-
test_start "my_function_error"
|
|
125
|
-
output=$(myfunction 2>&1)
|
|
126
|
-
exit_code=$?
|
|
127
|
-
assert_equals "1" "$exit_code" "should fail without args"
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Using Mocks
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
test_start "function_with_mock"
|
|
134
|
-
# Create temp directory
|
|
135
|
-
test_dir=$(mock_dir "test")
|
|
136
|
-
test_file="$test_dir/file.txt"
|
|
137
|
-
echo "content" > "$test_file"
|
|
138
|
-
|
|
139
|
-
# Run test
|
|
140
|
-
result=$(myfunction "$test_file")
|
|
141
|
-
|
|
142
|
-
# Verify
|
|
143
|
-
assert_equals "expected" "$result"
|
|
144
|
-
|
|
145
|
-
# Cleanup is automatic via trap
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Test Naming Convention
|
|
149
|
-
|
|
150
|
-
- Test files: `test_<functionality>.sh`
|
|
151
|
-
- Test functions: Descriptive names with `test_start`
|
|
152
|
-
- Example: `test_start "extract_handles_missing_file"`
|
|
153
|
-
|
|
154
|
-
## Environment Variables
|
|
155
|
-
|
|
156
|
-
| Variable | Default | Description |
|
|
157
|
-
|----------|---------|-------------|
|
|
158
|
-
| `RUN_INTEGRATION` | `0` | Set to `1` to run integration tests |
|
|
159
|
-
| `VERBOSE` | `0` | Set to `1` for verbose output |
|
|
160
|
-
| `REPO_ROOT` | Auto-detected | Repository root directory |
|
|
161
|
-
| `TESTS_DIR` | Auto-detected | Tests directory |
|
|
162
|
-
|
|
163
|
-
## Test Categories
|
|
164
|
-
|
|
165
|
-
### Unit Tests
|
|
166
|
-
|
|
167
|
-
Located in `scripts/tests/unit/`. These test individual functions in isolation:
|
|
168
|
-
|
|
169
|
-
- **test_extract.sh** - Archive extraction function
|
|
170
|
-
- **test_backup.sh** - Backup creation function
|
|
171
|
-
- **test_genpass.sh** - Password generation function
|
|
172
|
-
- **test_rd.sh** - Directory removal function (with security tests)
|
|
173
|
-
- **test_cd_aliases.sh** - Directory navigation aliases
|
|
174
|
-
|
|
175
|
-
### Integration Tests
|
|
176
|
-
|
|
177
|
-
Located in `scripts/tests/integration/`. These test complete workflows:
|
|
178
|
-
|
|
179
|
-
- **test_install.sh** - Installation script validation
|
|
180
|
-
|
|
181
|
-
## CI/CD Integration
|
|
182
|
-
|
|
183
|
-
Add to your CI pipeline:
|
|
184
|
-
|
|
185
|
-
```yaml
|
|
186
|
-
# GitHub Actions example
|
|
187
|
-
- name: Run Tests
|
|
188
|
-
run: |
|
|
189
|
-
chmod +x ./scripts/tests/framework/test_runner.sh
|
|
190
|
-
./scripts/tests/framework/test_runner.sh
|
|
191
|
-
|
|
192
|
-
- name: Run Integration Tests
|
|
193
|
-
run: |
|
|
194
|
-
RUN_INTEGRATION=1 ./scripts/tests/framework/test_runner.sh
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## Best Practices
|
|
198
|
-
|
|
199
|
-
1. **Isolation**: Each test should be independent
|
|
200
|
-
2. **Cleanup**: Use mocks that auto-cleanup via traps
|
|
201
|
-
3. **No Sleep**: Avoid `sleep` or hardcoded delays
|
|
202
|
-
4. **Descriptive Names**: Test names should describe what's being tested
|
|
203
|
-
5. **Edge Cases**: Test error conditions, not just happy paths
|
|
204
|
-
6. **Security**: Include tests for dangerous input rejection
|
|
205
|
-
|
|
206
|
-
## Troubleshooting
|
|
207
|
-
|
|
208
|
-
### Tests Not Found
|
|
209
|
-
|
|
210
|
-
Ensure test files match the pattern `test_*.sh` and are executable:
|
|
211
|
-
|
|
212
|
-
```bash
|
|
213
|
-
chmod +x scripts/tests/unit/test_*.sh
|
|
214
|
-
chmod +x scripts/tests/integration/test_*.sh
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### Function Not Available
|
|
218
|
-
|
|
219
|
-
If a test shows "function not available", the source file may not exist:
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
# Check if function file exists
|
|
223
|
-
ls -la .chezmoitemplates/functions/
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Mock Cleanup Issues
|
|
227
|
-
|
|
228
|
-
If mocks aren't cleaning up, ensure you're not running with `set -e` before mock operations that might fail.
|
|
229
|
-
|
|
230
|
-
## Contributing
|
|
231
|
-
|
|
232
|
-
When adding new functions to the dotfiles:
|
|
233
|
-
|
|
234
|
-
1. Create corresponding test file in `unit/`
|
|
235
|
-
2. Test happy path and error conditions
|
|
236
|
-
3. Include security-relevant test cases
|
|
237
|
-
4. Run full test suite before committing
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
Made with ❤️ by [Sebastien Rousseau](https://github.com/sebastienrousseau)
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
# standard-benchmarks.sh
|
|
4
|
-
# Measures shell startup time (total and per-component).
|
|
5
|
-
# Optional threshold enforcement via DOTFILES_BENCH_MAX_MS.
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
log_info() { echo -e "\n[INFO] $*"; }
|
|
10
|
-
|
|
11
|
-
MAX_MS="${DOTFILES_BENCH_MAX_MS:-}"
|
|
12
|
-
|
|
13
|
-
# ── Section 1: Total startup benchmark ──────────────────────────
|
|
14
|
-
log_info "=== Total Startup Benchmark ==="
|
|
15
|
-
|
|
16
|
-
if command -v hyperfine >/dev/null; then
|
|
17
|
-
log_info "Running benchmark with hyperfine..."
|
|
18
|
-
tmp_json="$(mktemp)"
|
|
19
|
-
hyperfine --warmup 3 --min-runs 10 --export-json "$tmp_json" "zsh -i -c exit"
|
|
20
|
-
|
|
21
|
-
if [[ -n "$MAX_MS" ]] && command -v python3 >/dev/null; then
|
|
22
|
-
python3 - "$tmp_json" "$MAX_MS" <<'PY'
|
|
23
|
-
import json, sys
|
|
24
|
-
path, max_ms = sys.argv[1], float(sys.argv[2])
|
|
25
|
-
with open(path, "r", encoding="utf-8") as f:
|
|
26
|
-
data = json.load(f)
|
|
27
|
-
mean_s = data["results"][0]["mean"]
|
|
28
|
-
mean_ms = mean_s * 1000.0
|
|
29
|
-
print(f"[INFO] Mean startup: {mean_ms:.1f} ms (limit: {max_ms:.1f} ms)")
|
|
30
|
-
if mean_ms > max_ms:
|
|
31
|
-
print(f"[FAIL] Startup time exceeded limit: {mean_ms:.1f} ms > {max_ms:.1f} ms")
|
|
32
|
-
sys.exit(1)
|
|
33
|
-
PY
|
|
34
|
-
fi
|
|
35
|
-
rm -f "$tmp_json"
|
|
36
|
-
else
|
|
37
|
-
log_info "Hyperfine not found. Using simple loop..."
|
|
38
|
-
echo "Running 10 iterations of 'zsh -i -c exit'..."
|
|
39
|
-
for _ in {1..10}; do
|
|
40
|
-
time zsh -i -c exit
|
|
41
|
-
done
|
|
42
|
-
fi
|
|
43
|
-
|
|
44
|
-
# ── Section 2: Component-level profiling ────────────────────────
|
|
45
|
-
log_info "=== Component-Level Profile ==="
|
|
46
|
-
log_info "Profiling individual zshrc components via zsh/zprof..."
|
|
47
|
-
|
|
48
|
-
# Use zsh's built-in zprof module if available
|
|
49
|
-
if command -v zsh >/dev/null; then
|
|
50
|
-
zsh -c '
|
|
51
|
-
zmodload zsh/zprof 2>/dev/null
|
|
52
|
-
# Source the real zshrc (DOTFILES_SOURCED guard is reset in a fresh shell)
|
|
53
|
-
[[ -f "$HOME/.zshrc" ]] && source "$HOME/.zshrc"
|
|
54
|
-
zprof
|
|
55
|
-
' 2>/dev/null | head -40
|
|
56
|
-
|
|
57
|
-
echo ""
|
|
58
|
-
log_info "Component timing (manual measurement):"
|
|
59
|
-
|
|
60
|
-
# Measure key init commands individually
|
|
61
|
-
_bench_component() {
|
|
62
|
-
local label="$1"
|
|
63
|
-
shift
|
|
64
|
-
local start end elapsed
|
|
65
|
-
if command -v perl >/dev/null 2>&1; then
|
|
66
|
-
start=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
|
|
67
|
-
zsh -c "$*" >/dev/null 2>&1 || true
|
|
68
|
-
end=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
|
|
69
|
-
else
|
|
70
|
-
start=$(($(date +%s) * 1000))
|
|
71
|
-
zsh -c "$*" >/dev/null 2>&1 || true
|
|
72
|
-
end=$(($(date +%s) * 1000))
|
|
73
|
-
fi
|
|
74
|
-
elapsed=$((end - start))
|
|
75
|
-
printf " %-30s %4d ms\n" "$label" "$elapsed"
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
_bench_component "bare zsh (baseline)" "exit"
|
|
79
|
-
_bench_component "zinit + plugins" "source \"\${XDG_DATA_HOME:-\$HOME/.local/share}/zinit/zinit.git/zinit.zsh\" 2>/dev/null; exit"
|
|
80
|
-
_bench_component "compinit" "autoload -Uz compinit && compinit -C; exit"
|
|
81
|
-
_bench_component "starship init" "command -v starship >/dev/null && eval \"\$(starship init zsh)\"; exit"
|
|
82
|
-
_bench_component "atuin init" "command -v atuin >/dev/null && eval \"\$(atuin init zsh)\"; exit"
|
|
83
|
-
_bench_component "zoxide init" "command -v zoxide >/dev/null && eval \"\$(zoxide init zsh)\"; exit"
|
|
84
|
-
_bench_component "fnm env" "command -v fnm >/dev/null && eval \"\$(fnm env --use-on-cd)\"; exit"
|
|
85
|
-
_bench_component "fzf completions" "[[ -f /opt/homebrew/opt/fzf/shell/completion.zsh ]] && source /opt/homebrew/opt/fzf/shell/completion.zsh; exit"
|
|
86
|
-
|
|
87
|
-
echo ""
|
|
88
|
-
log_info "Component profiling complete."
|
|
89
|
-
else
|
|
90
|
-
echo "[WARN] zsh not found, skipping component profiling."
|
|
91
|
-
fi
|
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC2034
|
|
3
|
-
# Assertion library for shell tests
|
|
4
|
-
# Provides a comprehensive set of assertion functions for testing shell scripts
|
|
5
|
-
#
|
|
6
|
-
# Security note: This file uses eval to execute test commands and conditions.
|
|
7
|
-
# This is intentional and necessary for the test assertion framework to work.
|
|
8
|
-
# These functions are only used in test code and should never be called with
|
|
9
|
-
# untrusted input. All eval calls carry a shellcheck disable directive.
|
|
10
|
-
|
|
11
|
-
TESTS_RUN=0
|
|
12
|
-
TESTS_PASSED=0
|
|
13
|
-
TESTS_FAILED=0
|
|
14
|
-
CURRENT_TEST=""
|
|
15
|
-
|
|
16
|
-
# Colors
|
|
17
|
-
RED='\033[0;31m'
|
|
18
|
-
GREEN='\033[0;32m'
|
|
19
|
-
YELLOW='\033[0;33m'
|
|
20
|
-
NC='\033[0m'
|
|
21
|
-
|
|
22
|
-
# Start a new test case
|
|
23
|
-
test_start() {
|
|
24
|
-
CURRENT_TEST="$1"
|
|
25
|
-
((TESTS_RUN++)) || true
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
# Assert two values are equal
|
|
29
|
-
assert_equals() {
|
|
30
|
-
local expected="$1" actual="$2" msg="${3:-values should be equal}"
|
|
31
|
-
if [[ "$expected" == "$actual" ]]; then
|
|
32
|
-
((TESTS_PASSED++)) || true
|
|
33
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
34
|
-
return 0
|
|
35
|
-
else
|
|
36
|
-
((TESTS_FAILED++)) || true
|
|
37
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
38
|
-
echo -e " Expected: '$expected'"
|
|
39
|
-
echo -e " Actual: '$actual'"
|
|
40
|
-
return 1
|
|
41
|
-
fi
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
# Assert two values are not equal
|
|
45
|
-
assert_not_equals() {
|
|
46
|
-
local unexpected="$1" actual="$2" msg="${3:-values should differ}"
|
|
47
|
-
if [[ "$unexpected" != "$actual" ]]; then
|
|
48
|
-
((TESTS_PASSED++)) || true
|
|
49
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
50
|
-
return 0
|
|
51
|
-
else
|
|
52
|
-
((TESTS_FAILED++)) || true
|
|
53
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
54
|
-
echo -e " Unexpected: '$unexpected'"
|
|
55
|
-
echo -e " Actual: '$actual'"
|
|
56
|
-
return 1
|
|
57
|
-
fi
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
# Assert a command exits with expected code
|
|
61
|
-
assert_exit_code() {
|
|
62
|
-
local expected="$1"
|
|
63
|
-
shift
|
|
64
|
-
local cmd="$*"
|
|
65
|
-
local actual
|
|
66
|
-
set +e
|
|
67
|
-
# shellcheck disable=SC2086
|
|
68
|
-
eval "$cmd" </dev/null >/dev/null 2>&1
|
|
69
|
-
actual=$?
|
|
70
|
-
set -e
|
|
71
|
-
assert_equals "$expected" "$actual" "exit code for: $cmd"
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
# Assert command output contains expected string
|
|
75
|
-
assert_output_contains() {
|
|
76
|
-
local needle="$1"
|
|
77
|
-
shift
|
|
78
|
-
local cmd="$*"
|
|
79
|
-
local output
|
|
80
|
-
# shellcheck disable=SC2086
|
|
81
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
82
|
-
if [[ "$output" == *"$needle"* ]]; then
|
|
83
|
-
((TESTS_PASSED++)) || true
|
|
84
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains '$needle'"
|
|
85
|
-
return 0
|
|
86
|
-
else
|
|
87
|
-
((TESTS_FAILED++)) || true
|
|
88
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain '$needle'"
|
|
89
|
-
echo -e " Actual output: $output"
|
|
90
|
-
return 1
|
|
91
|
-
fi
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
# Assert command output does NOT contain a string
|
|
95
|
-
assert_output_not_contains() {
|
|
96
|
-
local needle="$1"
|
|
97
|
-
shift
|
|
98
|
-
local cmd="$*"
|
|
99
|
-
local output
|
|
100
|
-
# shellcheck disable=SC2086
|
|
101
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
102
|
-
if [[ "$output" != *"$needle"* ]]; then
|
|
103
|
-
((TESTS_PASSED++)) || true
|
|
104
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output does not contain '$needle'"
|
|
105
|
-
return 0
|
|
106
|
-
else
|
|
107
|
-
((TESTS_FAILED++)) || true
|
|
108
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should not contain '$needle'"
|
|
109
|
-
echo -e " Actual output: $output"
|
|
110
|
-
return 1
|
|
111
|
-
fi
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
# Assert command output matches regex pattern
|
|
115
|
-
assert_output_matches() {
|
|
116
|
-
local pattern="$1"
|
|
117
|
-
shift
|
|
118
|
-
local cmd="$*"
|
|
119
|
-
local output
|
|
120
|
-
# shellcheck disable=SC2086
|
|
121
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
122
|
-
if [[ "$output" =~ $pattern ]]; then
|
|
123
|
-
((TESTS_PASSED++)) || true
|
|
124
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output matches pattern '$pattern'"
|
|
125
|
-
return 0
|
|
126
|
-
else
|
|
127
|
-
((TESTS_FAILED++)) || true
|
|
128
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should match pattern '$pattern'"
|
|
129
|
-
echo -e " Actual output: $output"
|
|
130
|
-
return 1
|
|
131
|
-
fi
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
# Assert file exists
|
|
135
|
-
assert_file_exists() {
|
|
136
|
-
local file="$1" msg="${2:-file should exist}"
|
|
137
|
-
if [[ -f "$file" ]]; then
|
|
138
|
-
((TESTS_PASSED++)) || true
|
|
139
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
140
|
-
return 0
|
|
141
|
-
else
|
|
142
|
-
((TESTS_FAILED++)) || true
|
|
143
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file not found)"
|
|
144
|
-
return 1
|
|
145
|
-
fi
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
# Assert file does not exist
|
|
149
|
-
assert_file_not_exists() {
|
|
150
|
-
local file="$1" msg="${2:-file should not exist}"
|
|
151
|
-
if [[ ! -f "$file" ]]; then
|
|
152
|
-
((TESTS_PASSED++)) || true
|
|
153
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
154
|
-
return 0
|
|
155
|
-
else
|
|
156
|
-
((TESTS_FAILED++)) || true
|
|
157
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file exists)"
|
|
158
|
-
return 1
|
|
159
|
-
fi
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
# Assert directory exists
|
|
163
|
-
assert_dir_exists() {
|
|
164
|
-
local dir="$1" msg="${2:-directory should exist}"
|
|
165
|
-
if [[ -d "$dir" ]]; then
|
|
166
|
-
((TESTS_PASSED++)) || true
|
|
167
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
168
|
-
return 0
|
|
169
|
-
else
|
|
170
|
-
((TESTS_FAILED++)) || true
|
|
171
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir not found)"
|
|
172
|
-
return 1
|
|
173
|
-
fi
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
# Assert directory does not exist
|
|
177
|
-
assert_dir_not_exists() {
|
|
178
|
-
local dir="$1" msg="${2:-directory should not exist}"
|
|
179
|
-
if [[ ! -d "$dir" ]]; then
|
|
180
|
-
((TESTS_PASSED++)) || true
|
|
181
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
182
|
-
return 0
|
|
183
|
-
else
|
|
184
|
-
((TESTS_FAILED++)) || true
|
|
185
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir exists)"
|
|
186
|
-
return 1
|
|
187
|
-
fi
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
# Assert a condition is true
|
|
191
|
-
assert_true() {
|
|
192
|
-
local condition="$1" msg="${2:-condition should be true}"
|
|
193
|
-
# shellcheck disable=SC2086
|
|
194
|
-
if eval "$condition"; then
|
|
195
|
-
((TESTS_PASSED++)) || true
|
|
196
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
197
|
-
return 0
|
|
198
|
-
else
|
|
199
|
-
((TESTS_FAILED++)) || true
|
|
200
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
201
|
-
return 1
|
|
202
|
-
fi
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
# Assert a condition is false
|
|
206
|
-
assert_false() {
|
|
207
|
-
local condition="$1" msg="${2:-condition should be false}"
|
|
208
|
-
# shellcheck disable=SC2086
|
|
209
|
-
if ! eval "$condition"; then
|
|
210
|
-
((TESTS_PASSED++)) || true
|
|
211
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
212
|
-
return 0
|
|
213
|
-
else
|
|
214
|
-
((TESTS_FAILED++)) || true
|
|
215
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
216
|
-
return 1
|
|
217
|
-
fi
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
# Assert string is empty
|
|
221
|
-
assert_empty() {
|
|
222
|
-
local value="$1" msg="${2:-value should be empty}"
|
|
223
|
-
if [[ -z "$value" ]]; then
|
|
224
|
-
((TESTS_PASSED++)) || true
|
|
225
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
226
|
-
return 0
|
|
227
|
-
else
|
|
228
|
-
((TESTS_FAILED++)) || true
|
|
229
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
230
|
-
echo -e " Actual: '$value'"
|
|
231
|
-
return 1
|
|
232
|
-
fi
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
# Assert string is not empty
|
|
236
|
-
assert_not_empty() {
|
|
237
|
-
local value="$1" msg="${2:-value should not be empty}"
|
|
238
|
-
if [[ -n "$value" ]]; then
|
|
239
|
-
((TESTS_PASSED++)) || true
|
|
240
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
241
|
-
return 0
|
|
242
|
-
else
|
|
243
|
-
((TESTS_FAILED++)) || true
|
|
244
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
245
|
-
return 1
|
|
246
|
-
fi
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
# Assert file contains text (uses fixed-string matching for safety)
|
|
250
|
-
assert_file_contains() {
|
|
251
|
-
local file="$1" needle="$2" msg="${3:-file should contain text}"
|
|
252
|
-
if [[ -z "$file" ]]; then
|
|
253
|
-
((TESTS_FAILED++)) || true
|
|
254
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg (no file path provided)"
|
|
255
|
-
return 1
|
|
256
|
-
fi
|
|
257
|
-
if [[ -f "$file" ]] && grep -qF "$needle" "$file"; then
|
|
258
|
-
((TESTS_PASSED++)) || true
|
|
259
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
260
|
-
return 0
|
|
261
|
-
else
|
|
262
|
-
((TESTS_FAILED++)) || true
|
|
263
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
264
|
-
return 1
|
|
265
|
-
fi
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
# Print test summary
|
|
269
|
-
print_summary() {
|
|
270
|
-
echo ""
|
|
271
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
272
|
-
echo -e "Tests run: $TESTS_RUN"
|
|
273
|
-
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
|
|
274
|
-
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
|
|
275
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
276
|
-
# Output machine-readable results for test_runner.sh
|
|
277
|
-
echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
|
|
278
|
-
|
|
279
|
-
if [[ $TESTS_FAILED -gt 0 ]]; then
|
|
280
|
-
return 1
|
|
281
|
-
fi
|
|
282
|
-
return 0
|
|
283
|
-
}
|