@sebastienrousseau/dotfiles 0.2.502 → 0.2.504
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 +109 -9
- package/LICENSE +21 -1283
- package/README.md +6 -4
- package/docs/CONFIG_STRATEGY.md +124 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/GOVERNANCE.md +98 -0
- package/docs/MAINTAINERS.md +41 -0
- package/docs/OPENCODE.md +127 -0
- package/docs/README.md +2 -0
- package/docs/STRUCTURE.md +102 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
- package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
- package/docs/architecture/REPO_LAYOUT.md +8 -8
- package/docs/archive/MILESTONE_v0.2.493.md +1 -1
- package/docs/index.md +2 -2
- package/docs/interop/POWERSHELL.md +1 -1
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/01-concepts/02-trust-model.md +1 -1
- package/docs/manual/03-reference/02-config-files.md +2 -2
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +72 -59
- package/docs/operations/CI_COMPOSITES.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +5 -5
- package/docs/operations/HARD_AUDIT_2026.md +11 -11
- package/docs/operations/MAINTENANCE.md +3 -3
- package/docs/operations/MANIFEST.md +127 -0
- package/docs/operations/RELEASE_PIPELINE.md +130 -0
- package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
- package/docs/operations/ROADMAP_2026.md +6 -6
- package/docs/operations/ROADMAP_V0_2_503.md +134 -0
- package/docs/operations/TESTING.md +17 -0
- package/docs/operations/TRACEABILITY.md +6 -3
- package/docs/operations/VERSION_SYNC.md +4 -4
- package/docs/reference/POWERSHELL_PARITY.md +8 -7
- package/docs/schema/dot-env-v1.json +110 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
- package/docs/security/CI_PINNING.md +17 -9
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
- package/docs/security/FUZZING.md +114 -0
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/POLICY_RELEASES.md +2 -2
- package/docs/security/SCORECARD.md +58 -3
- package/docs/security/SHELL_EXEMPTIONS.md +4 -4
- package/docs/security/VERIFY_RELEASE.md +201 -0
- package/install.sh +118 -5
- package/package.json +1 -1
- package/scripts/README.md +123 -0
- package/scripts/ci/check-copyright-headers.sh +4 -93
- package/scripts/ci/check-shell-preamble.sh +4 -103
- package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
- package/scripts/diagnostics/a2a-conformance.sh +4 -4
- package/scripts/diagnostics/alias-governance.sh +1 -1
- package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
- package/scripts/diagnostics/benchmark.sh +5 -5
- package/scripts/diagnostics/conflicts.sh +2 -2
- package/scripts/diagnostics/doctor-unified.sh +3 -3
- package/scripts/diagnostics/doctor.sh +10 -10
- package/scripts/diagnostics/drift-dashboard.sh +2 -2
- package/scripts/diagnostics/health.sh +4 -4
- package/scripts/diagnostics/history-analysis.sh +2 -2
- package/scripts/diagnostics/mcp-doctor.sh +10 -7
- package/scripts/diagnostics/perf.sh +5 -5
- package/scripts/diagnostics/scorecard.sh +4 -4
- package/scripts/diagnostics/security-score.sh +25 -6
- package/scripts/diagnostics/smoke-test.sh +2 -2
- package/scripts/diagnostics/snapshot.sh +2 -2
- package/scripts/diagnostics/verify.sh +4 -4
- package/scripts/diagnostics/version-locks.sh +13 -3
- package/scripts/diagnostics/workstation-attestation.sh +14 -14
- package/scripts/dot/commands/agent.sh +8 -0
- package/scripts/dot/commands/agents.sh +14 -4
- package/scripts/dot/commands/ai.sh +156 -37
- package/scripts/dot/commands/appearance.sh +2 -2
- package/scripts/dot/commands/core.sh +2 -2
- package/scripts/dot/commands/diagnostics.sh +5 -5
- package/scripts/dot/commands/env-emit.sh +202 -0
- package/scripts/dot/commands/fleet.sh +22 -16
- package/scripts/dot/commands/init.sh +4 -4
- package/scripts/dot/commands/lint.sh +9 -4
- package/scripts/dot/commands/manual.sh +3 -3
- package/scripts/dot/commands/meta.sh +12 -6
- package/scripts/dot/commands/patterns.sh +2 -2
- package/scripts/dot/commands/registry.sh +4 -4
- package/scripts/dot/commands/restore.sh +4 -4
- package/scripts/dot/commands/secrets.sh +4 -3
- package/scripts/dot/commands/security.sh +2 -2
- package/scripts/dot/commands/tools.sh +13 -3
- package/scripts/dot/powershell/Dot.psm1 +199 -0
- package/scripts/fonts/install-nerd-fonts.sh +2 -2
- package/scripts/git-hooks/pre-commit-audit.sh +3 -3
- package/scripts/git-hooks/pre-push +13 -0
- package/scripts/ops/ai-setup.sh +1 -1
- package/scripts/ops/bundle.sh +3 -3
- package/scripts/ops/chaos.sh +2 -2
- package/scripts/ops/chezmoi-apply.sh +12 -6
- package/scripts/ops/heal.sh +4 -4
- package/scripts/ops/post-apply-repair.sh +2 -2
- package/scripts/ops/prewarm.sh +2 -2
- package/scripts/ops/release.sh +4 -4
- package/scripts/ops/rollback.sh +4 -4
- package/scripts/ops/setup.sh +2 -2
- package/scripts/qa/check-version-consistency.sh +123 -0
- package/scripts/qa/coverage-baseline.sh +1 -1
- package/scripts/qa/docs-coverage.sh +2 -2
- package/scripts/qa/powershell-contract.ps1 +1 -1
- package/scripts/qa/scorecard-snapshot.sh +127 -0
- package/scripts/security/backup.sh +2 -2
- package/scripts/security/dns-doh.sh +4 -4
- package/scripts/security/encryption-check.sh +4 -4
- package/scripts/security/enforce-policies.sh +2 -2
- package/scripts/security/firewall.sh +4 -4
- package/scripts/security/lock-screen.sh +4 -4
- package/scripts/security/manage-secrets.sh +2 -2
- package/scripts/security/ssh-cert.sh +2 -2
- package/scripts/security/telemetry-kill.sh +4 -4
- package/scripts/security/usb-safety.sh +4 -4
- package/scripts/theme/extract-heic-frames.sh +114 -0
- package/scripts/theme/rebuild-themes.sh +31 -2
- package/scripts/theme/switch.sh +13 -6
- package/scripts/theme/wallpaper-sync.sh +297 -93
- package/scripts/tuning/linux.sh +2 -2
- package/scripts/tuning/macos.sh +2 -2
- package/scripts/version-sync.sh +74 -10
- package/dot_config/.module-manifest.json +0 -69
- package/dot_config/ai/identity.md +0 -23
- package/dot_config/ai/patterns/architect.md +0 -16
- package/dot_config/ai/patterns/hardener.md +0 -15
- package/dot_config/ai/patterns/refactor.md +0 -15
- package/dot_config/aider/aider.conf.yml +0 -32
- package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
- package/dot_config/ansible/ansible.cfg +0 -11
- package/dot_config/atuin/config.toml.tmpl +0 -47
- package/dot_config/bat/config +0 -23
- package/dot_config/brave-flags.conf.tmpl +0 -7
- package/dot_config/btop/btop.conf +0 -16
- package/dot_config/btop/themes/tokyonight.theme +0 -34
- package/dot_config/bun/bunfig.toml.tmpl +0 -33
- package/dot_config/claude/mcp_servers.json +0 -20
- package/dot_config/containers/containers.conf +0 -14
- package/dot_config/curl/dot_curlrc +0 -18
- package/dot_config/dlv/config.yml +0 -39
- package/dot_config/docker/config.json +0 -15
- package/dot_config/dotfiles/agent-card.json +0 -29
- package/dot_config/dotfiles/agent-profiles.json +0 -92
- package/dot_config/dotfiles/boot/README.md +0 -13
- package/dot_config/dotfiles/grub/README.md +0 -13
- package/dot_config/dotfiles/lock/README.md +0 -13
- package/dot_config/dotfiles/mcp-lock.json +0 -33
- package/dot_config/dotfiles/mcp-policy.json +0 -52
- package/dot_config/dotfiles/mcp-registry.json +0 -47
- package/dot_config/dotfiles/model-registry.json +0 -20
- package/dot_config/dotfiles/policy-bundles.json +0 -38
- package/dot_config/dotfiles/prompt-registry.json +0 -16
- package/dot_config/dotfiles/versions.env +0 -18
- package/dot_config/duf/duf.conf +0 -6
- package/dot_config/duti/defaults.duti +0 -5
- package/dot_config/emoji/emoji.txt +0 -34
- package/dot_config/environment.d/50-ssh-agent.conf +0 -2
- package/dot_config/environment.d/90-wayland.conf +0 -19
- package/dot_config/fastfetch/config.jsonc +0 -28
- package/dot_config/firefox/user.js.tmpl +0 -58
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
- package/dot_config/fish/completions/dot.fish.tmpl +0 -115
- package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
- package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
- package/dot_config/fish/conf.d/direnv.fish +0 -4
- package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
- package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
- package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
- package/dot_config/fish/conf.d/mise-activate.fish +0 -5
- package/dot_config/fish/config.fish.tmpl +0 -44
- package/dot_config/fish/fish_plugins +0 -1
- package/dot_config/fish/functions/_.fish +0 -3
- package/dot_config/fish/functions/_cached_eval.fish +0 -131
- package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
- package/dot_config/fish/functions/als.fish +0 -46
- package/dot_config/fish/functions/bg-upgrade.fish +0 -7
- package/dot_config/fish/functions/c.fish +0 -3
- package/dot_config/fish/functions/cat.fish +0 -9
- package/dot_config/fish/functions/d.fish +0 -7
- package/dot_config/fish/functions/dot.fish +0 -34
- package/dot_config/fish/functions/h.fish +0 -3
- package/dot_config/fish/functions/l.fish +0 -7
- package/dot_config/fish/functions/la.fish +0 -7
- package/dot_config/fish/functions/ll.fish +0 -7
- package/dot_config/fish/functions/log_error.fish +0 -13
- package/dot_config/fish/functions/log_info.fish +0 -13
- package/dot_config/fish/functions/lr.fish +0 -7
- package/dot_config/fish/functions/lra.fish +0 -7
- package/dot_config/fish/functions/ls.fish +0 -7
- package/dot_config/fish/functions/lt.fish +0 -7
- package/dot_config/fish/functions/lta.fish +0 -7
- package/dot_config/fish/functions/notify-run.fish +0 -11
- package/dot_config/fish/functions/q.fish +0 -3
- package/dot_config/fish/functions/silent-run.fish +0 -7
- package/dot_config/fish/functions/yy.fish +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
- package/dot_config/foot/foot.ini.tmpl +0 -33
- package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
- package/dot_config/fzf/fzf.zsh +0 -48
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -165
- package/dot_config/git/allowed_signers.tmpl +0 -18
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/commit-template +0 -10
- package/dot_config/git/hooks/executable_commit-msg +0 -146
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf +0 -11
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py +0 -19
- package/dot_config/just/justfile +0 -122
- package/dot_config/k9s/config.yaml +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/kanshi/config.tmpl +0 -22
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -53
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -35
- package/dot_config/mako/config +0 -47
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/micro/settings.json +0 -3
- package/dot_config/mimeapps.list +0 -77
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -99
- package/dot_config/mongosh/mongoshrc.js +0 -68
- package/dot_config/mpv/input.conf +0 -47
- package/dot_config/mpv/mpv.conf +0 -47
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/niri/config.kdl.tmpl +0 -327
- package/dot_config/nushell/aliases.nu +0 -18
- package/dot_config/nushell/cached_eval.nu +0 -80
- package/dot_config/nushell/completions.nu.tmpl +0 -52
- package/dot_config/nushell/config.nu.tmpl +0 -86
- package/dot_config/nushell/env.nu.tmpl +0 -102
- package/dot_config/nushell/functions.nu.tmpl +0 -17
- package/dot_config/nvim/init.lua +0 -18
- package/dot_config/nvim/lazy-lock.json +0 -58
- package/dot_config/nvim/lua/config/autocmds.lua +0 -107
- package/dot_config/nvim/lua/config/keymaps.lua +0 -92
- package/dot_config/nvim/lua/config/lazy.lua +0 -44
- package/dot_config/nvim/lua/config/options.lua +0 -49
- package/dot_config/nvim/lua/plugins/ai.lua +0 -75
- package/dot_config/nvim/lua/plugins/coding.lua +0 -216
- package/dot_config/nvim/lua/plugins/completion.lua +0 -60
- package/dot_config/nvim/lua/plugins/dap.lua +0 -412
- package/dot_config/nvim/lua/plugins/editor.lua +0 -55
- package/dot_config/nvim/lua/plugins/git.lua +0 -10
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
- package/dot_config/nvim/lua/plugins/rust.lua +0 -34
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
- package/dot_config/nvim/lua/plugins/ui.lua +0 -509
- package/dot_config/paru/paru.conf +0 -10
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
- package/dot_config/pueue/pueue.yml +0 -34
- package/dot_config/pypoetry/config.toml +0 -6
- package/dot_config/pyrightconfig.json +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/ripgrep/ripgreprc +0 -21
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
- package/dot_config/shell/05-core-safety.sh +0 -48
- package/dot_config/shell/10-secrets.sh +0 -41
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
- package/dot_config/shell/40-ls-colors.sh +0 -49
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -127
- package/dot_config/shell/README.md +0 -284
- package/dot_config/shell/als_data.txt.tmpl +0 -65
- package/dot_config/shell/custom/auto_ls.zsh +0 -20
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -202
- package/dot_config/swaylock/config +0 -43
- package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
- package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
- package/dot_config/systemd/user/pueued.service +0 -12
- package/dot_config/systemd/user/ssh-agent.service +0 -12
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -223
- package/dot_config/topgrade.toml.tmpl +0 -54
- package/dot_config/user-dirs.dirs +0 -10
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -82
- package/dot_config/waybar/config.jsonc.tmpl +0 -90
- package/dot_config/waybar/style.css.tmpl +0 -211
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
- package/dot_config/yarn/yarnrc.yml +0 -36
- package/dot_config/yazi/keymap.toml +0 -67
- package/dot_config/yazi/theme.toml +0 -102
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zathura/zathurarc +0 -52
- package/dot_config/zellij/config.kdl.tmpl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -7
- package/dot_config/zsh/dot_zshenv +0 -5
- package/dot_config/zsh/dot_zshrc.tmpl +0 -688
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
- package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
- package/dot_local/bin/executable_ai-update +0 -195
- package/dot_local/bin/executable_ai_core +0 -152
- package/dot_local/bin/executable_antigravity +0 -11
- package/dot_local/bin/executable_b64 +0 -84
- package/dot_local/bin/executable_bm +0 -79
- package/dot_local/bin/executable_cb +0 -39
- package/dot_local/bin/executable_dot +0 -636
- package/dot_local/bin/executable_dot-ai +0 -36
- package/dot_local/bin/executable_dot-bootstrap +0 -76
- package/dot_local/bin/executable_dot-launch-or-focus +0 -52
- package/dot_local/bin/executable_dot-load-benchmark +0 -31
- package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
- package/dot_local/bin/executable_dot-theme-sync +0 -952
- package/dot_local/bin/executable_dot_completion +0 -57
- package/dot_local/bin/executable_dtags +0 -28
- package/dot_local/bin/executable_epoch +0 -67
- package/dot_local/bin/executable_extract +0 -41
- package/dot_local/bin/executable_gbd +0 -52
- package/dot_local/bin/executable_gd +0 -42
- package/dot_local/bin/executable_git-ai-commit +0 -175
- package/dot_local/bin/executable_git-ai-diff +0 -169
- package/dot_local/bin/executable_gl +0 -101
- package/dot_local/bin/executable_hash +0 -161
- package/dot_local/bin/executable_hashsum +0 -160
- package/dot_local/bin/executable_hex +0 -115
- package/dot_local/bin/executable_jsonv +0 -78
- package/dot_local/bin/executable_jwt +0 -94
- package/dot_local/bin/executable_kill-port +0 -75
- package/dot_local/bin/executable_lorem +0 -118
- package/dot_local/bin/executable_mkscript +0 -35
- package/dot_local/bin/executable_monitor +0 -56
- package/dot_local/bin/executable_myip +0 -51
- package/dot_local/bin/executable_notify +0 -24
- package/dot_local/bin/executable_open +0 -38
- package/dot_local/bin/executable_pw +0 -27
- package/dot_local/bin/executable_rec-start +0 -46
- package/dot_local/bin/executable_rec-stop +0 -35
- package/dot_local/bin/executable_regex +0 -132
- package/dot_local/bin/executable_start-niri +0 -8
- package/dot_local/bin/executable_tmux-sessionizer +0 -314
- package/dot_local/bin/executable_tour +0 -177
- package/dot_local/bin/executable_up +0 -23
- package/dot_local/bin/executable_update +0 -142
- package/dot_local/bin/executable_uuid +0 -87
- package/dot_local/bin/executable_win +0 -32
- package/dot_local/bin/executable_yamlv +0 -57
- package/dot_local/share/bash-completion/completions/dot +0 -72
- 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 +0 -149
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +0 -287
- package/scripts/ci/check-dangerous-chmod.sh +0 -19
- package/scripts/ci/check-deps-dev.sh +0 -236
- package/scripts/ci/check-insecure-tls.sh +0 -61
- package/scripts/ci/check-regression-traceability.sh +0 -67
- package/scripts/ci/dot-cli-startup-bench.sh +0 -126
- package/scripts/ci/install-chezmoi-verified.sh +0 -67
- package/scripts/ci/lint-reusable-pins.sh +0 -78
- package/scripts/ci/run-coverage.sh +0 -451
- package/scripts/ci/validate-chezmoidata.sh +0 -25
- package/scripts/ci/validate-ci-config.sh +0 -224
- package/scripts/ci/windows-smoke-test.ps1 +0 -136
- package/scripts/docs/build-manual.sh +0 -883
- package/scripts/docs/check-manual.sh +0 -213
- package/scripts/dot/lib/bento.sh +0 -50
- package/scripts/dot/lib/log.sh +0 -200
- package/scripts/dot/lib/platform.sh +0 -112
- package/scripts/dot/lib/ui.sh +0 -650
- package/scripts/dot/lib/utils.sh +0 -377
- package/scripts/maintenance/check-updates.sh +0 -131
- package/scripts/release/package-policy-bundles.sh +0 -125
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# run-coverage.sh — Bash code-coverage runner using pure xtrace
|
|
5
|
-
# instrumentation. Emits lcov.info at $COVERAGE_OUT.
|
|
6
|
-
#
|
|
7
|
-
# Why pure xtrace (not kcov):
|
|
8
|
-
# kcov v43 on Ubuntu 24.04 + bash 5.2 won't emit bash-script
|
|
9
|
-
# coverage in either mode: without bash-dbgsym it captures nothing,
|
|
10
|
-
# and with bash-dbgsym it captures bash's *C-binary* internals
|
|
11
|
-
# (ctype.h, stdio.h) instead of the .sh file lines we care about.
|
|
12
|
-
# We bypass kcov entirely by using bash's own xtrace mechanism:
|
|
13
|
-
#
|
|
14
|
-
# PS4='+:${LINENO}:${BASH_SOURCE}:' # encode line + file in trace
|
|
15
|
-
# BASH_ENV=/setup-that-runs-set-x # turn on xtrace in every
|
|
16
|
-
# # non-interactive bash, so
|
|
17
|
-
# # children inherit tracing
|
|
18
|
-
# bash test.sh 2>traces/test.trace # capture lines per test
|
|
19
|
-
#
|
|
20
|
-
# Then we parse all traces with regex and write lcov.info. This is
|
|
21
|
-
# the same mechanism bashcov uses, minus the Ruby runtime.
|
|
22
|
-
#
|
|
23
|
-
# Linux + macOS both work (macOS bash 3.2 supports BASH_XTRACEFD as
|
|
24
|
-
# well — verified locally on bash 5.3 via Homebrew). The pre-commit
|
|
25
|
-
# hook in this repo can invoke this on any platform.
|
|
26
|
-
#
|
|
27
|
-
# Closes the runner half of #856 / Slice 1 of #883.
|
|
28
|
-
# =============================================================================
|
|
29
|
-
|
|
30
|
-
set -uo pipefail
|
|
31
|
-
|
|
32
|
-
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
|
|
33
|
-
TESTS_DIR="${TESTS_DIR:-$REPO_ROOT/tests}"
|
|
34
|
-
COVERAGE_DIR="${COVERAGE_DIR:-$REPO_ROOT/coverage}"
|
|
35
|
-
COVERAGE_OUT="${COVERAGE_OUT:-$COVERAGE_DIR/lcov.info}"
|
|
36
|
-
MIN_COVERAGE_PCT="${MIN_COVERAGE_PCT:-0}" # initial floor; tighten per slice
|
|
37
|
-
COV_INCLUDE_DIRS="${COV_INCLUDE_DIRS:-$REPO_ROOT/scripts:$REPO_ROOT/dot_local/bin:$REPO_ROOT/.chezmoitemplates/functions}"
|
|
38
|
-
JOBS="${JOBS:-$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)}"
|
|
39
|
-
COV_TEST_TIMEOUT="${COV_TEST_TIMEOUT:-60}"
|
|
40
|
-
|
|
41
|
-
mkdir -p "$COVERAGE_DIR"
|
|
42
|
-
trace_dir="$COVERAGE_DIR/traces"
|
|
43
|
-
rm -rf "$trace_dir"
|
|
44
|
-
mkdir -p "$trace_dir"
|
|
45
|
-
|
|
46
|
-
# -----------------------------------------------------------------------------
|
|
47
|
-
# BASH_ENV setup file: enables xtrace in every non-interactive bash that
|
|
48
|
-
# inherits it. Child processes spawned via `bash $SCRIPT` get their own
|
|
49
|
-
# tracing turned on automatically.
|
|
50
|
-
# -----------------------------------------------------------------------------
|
|
51
|
-
bash_env="$COVERAGE_DIR/_cov_bashenv.sh"
|
|
52
|
-
cat >"$bash_env" <<'SETUP'
|
|
53
|
-
# coverage runtime — enable xtrace, define PS4 with file+line markers.
|
|
54
|
-
# `${BASH_SOURCE:-}` (not `${BASH_SOURCE}`) prevents PS4 evaluation
|
|
55
|
-
# from failing under `set -u`: at the top level of a `bash -c`
|
|
56
|
-
# script, BASH_SOURCE[0] is unbound; an unguarded expansion under
|
|
57
|
-
# `set -u` aborts the shell, taking out any test that sources a
|
|
58
|
-
# `set -euo pipefail` library file.
|
|
59
|
-
set -x
|
|
60
|
-
PS4='+@COV@:${LINENO}:${BASH_SOURCE:-}:@ '
|
|
61
|
-
SETUP
|
|
62
|
-
|
|
63
|
-
# Sanity-probe: run one trivial script through the pipeline so a
|
|
64
|
-
# subsequent failure of the real sweep can be diagnosed quickly.
|
|
65
|
-
probe_target="$COVERAGE_DIR/_probe_target.sh"
|
|
66
|
-
cat >"$probe_target" <<'PROBE'
|
|
67
|
-
#!/usr/bin/env bash
|
|
68
|
-
set -uo pipefail
|
|
69
|
-
echo "probe-line-a"
|
|
70
|
-
x=1; y=2
|
|
71
|
-
echo "probe-sum=$((x + y))"
|
|
72
|
-
PROBE
|
|
73
|
-
chmod +x "$probe_target"
|
|
74
|
-
|
|
75
|
-
PS4='+@COV@:${LINENO}:${BASH_SOURCE}:@ ' \
|
|
76
|
-
BASH_ENV="$bash_env" \
|
|
77
|
-
bash "$probe_target" 2>"$trace_dir/_probe.trace" >/dev/null || true
|
|
78
|
-
probe_lines=$(grep -cE "^\+@COV@:[0-9]+:.*${probe_target}:@" "$trace_dir/_probe.trace" 2>/dev/null || echo 0)
|
|
79
|
-
echo "probe: ${probe_lines} traced lines from ${probe_target}" >&2
|
|
80
|
-
if [[ "$probe_lines" -eq 0 ]]; then
|
|
81
|
-
echo "::error::xtrace probe captured no lines — coverage mechanism broken" >&2
|
|
82
|
-
exit 2
|
|
83
|
-
fi
|
|
84
|
-
|
|
85
|
-
# -----------------------------------------------------------------------------
|
|
86
|
-
# Collect test files (mirror tests/framework/test_runner.sh discovery).
|
|
87
|
-
# -----------------------------------------------------------------------------
|
|
88
|
-
mapfile -t test_files < <(find "$TESTS_DIR/unit" -name 'test_*.sh' -type f | sort)
|
|
89
|
-
|
|
90
|
-
if [[ "${#test_files[@]}" -eq 0 ]]; then
|
|
91
|
-
echo "::error::no unit test files discovered under $TESTS_DIR/unit" >&2
|
|
92
|
-
exit 1
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
echo "Tracing ${#test_files[@]} test files (parallel × $JOBS, timeout ${COV_TEST_TIMEOUT}s/test)..." >&2
|
|
96
|
-
|
|
97
|
-
# -----------------------------------------------------------------------------
|
|
98
|
-
# Worker function — runs one test under xtrace, captures stderr.
|
|
99
|
-
# -----------------------------------------------------------------------------
|
|
100
|
-
# shellcheck disable=SC2329 # called indirectly via xargs subshell
|
|
101
|
-
run_one() {
|
|
102
|
-
local f="$1"
|
|
103
|
-
local trace
|
|
104
|
-
trace="$COV_TRACE_DIR/$(basename "$f" .sh).trace"
|
|
105
|
-
PS4='+@COV@:${LINENO}:${BASH_SOURCE}:@ ' \
|
|
106
|
-
BASH_ENV="$COV_BASH_ENV" \
|
|
107
|
-
timeout --kill-after=5 "$COV_TEST_TIMEOUT" \
|
|
108
|
-
bash "$f" 2>"$trace" >/dev/null || true
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export COV_TRACE_DIR="$trace_dir"
|
|
112
|
-
export COV_BASH_ENV="$bash_env"
|
|
113
|
-
export COV_TEST_TIMEOUT
|
|
114
|
-
export -f run_one
|
|
115
|
-
|
|
116
|
-
start_ts=$(date +%s)
|
|
117
|
-
printf '%s\n' "${test_files[@]}" |
|
|
118
|
-
xargs -I{} -n1 -P"$JOBS" bash -c 'run_one "$@"' _ {} ||
|
|
119
|
-
true
|
|
120
|
-
elapsed=$(($(date +%s) - start_ts))
|
|
121
|
-
echo "trace phase done in ${elapsed}s" >&2
|
|
122
|
-
|
|
123
|
-
# -----------------------------------------------------------------------------
|
|
124
|
-
# Aggregate trace files → lcov.info.
|
|
125
|
-
# -----------------------------------------------------------------------------
|
|
126
|
-
python3 - "$COVERAGE_OUT" "$trace_dir" "$REPO_ROOT" "$COV_INCLUDE_DIRS" <<'PY'
|
|
127
|
-
"""Aggregate bash xtrace output into lcov.info."""
|
|
128
|
-
import os
|
|
129
|
-
import re
|
|
130
|
-
import sys
|
|
131
|
-
from collections import defaultdict
|
|
132
|
-
from pathlib import Path
|
|
133
|
-
|
|
134
|
-
out_path, trace_dir, repo_root, include_dirs_spec = sys.argv[1:5]
|
|
135
|
-
include_dirs = [Path(p).resolve() for p in include_dirs_spec.split(":") if p]
|
|
136
|
-
trace_dir = Path(trace_dir)
|
|
137
|
-
repo_root = Path(repo_root).resolve()
|
|
138
|
-
|
|
139
|
-
# -----------------------------------------------------------------------------
|
|
140
|
-
# Skip-list — paths (relative to repo_root) that the xtrace mechanism
|
|
141
|
-
# cannot measure meaningfully in our sandbox. Listed once at the
|
|
142
|
-
# aggregator level so individual scripts don't need to be peppered with
|
|
143
|
-
# LCOV_EXCL_START/STOP markers. Categories:
|
|
144
|
-
# 1. Interactive / animation scripts (matrix, pipes, banner, cmatrix,
|
|
145
|
-
# stopwatch, rainbow, ql) — require a TTY + user input; the
|
|
146
|
-
# function body never returns to xtrace within a test budget.
|
|
147
|
-
# 2. Self-reference — run-coverage.sh is the runner itself; the
|
|
148
|
-
# runner traces other scripts but not itself.
|
|
149
|
-
# 3. CI-only entry points that mutate real environments (pre-push,
|
|
150
|
-
# release, install, bump, lint, check-deps-dev, validate-ci-config,
|
|
151
|
-
# reliability-audit, coverage-baseline, lint-reusable-pins).
|
|
152
|
-
# 4. Top-level system-mutation scripts that need real OS state
|
|
153
|
-
# (rebuild-themes scans wallpapers; apply-gnome-theme drives
|
|
154
|
-
# gsettings; wallpaper-sync pulls from a remote; build-manual
|
|
155
|
-
# shells out to pandoc; chaos.sh and record.sh produce side
|
|
156
|
-
# effects we can't fake under bash xtrace).
|
|
157
|
-
# Files here are entirely removed from the lcov denominator (no SF:
|
|
158
|
-
# entry emitted). The covered code in the *rest* of the repo is the
|
|
159
|
-
# meaningful denominator.
|
|
160
|
-
# -----------------------------------------------------------------------------
|
|
161
|
-
SKIP_PATHS = {
|
|
162
|
-
# Interactive / animation — require a TTY + user input.
|
|
163
|
-
".chezmoitemplates/functions/interactive/matrix.sh",
|
|
164
|
-
".chezmoitemplates/functions/interactive/cmatrix.sh",
|
|
165
|
-
".chezmoitemplates/functions/interactive/stopwatch.sh",
|
|
166
|
-
".chezmoitemplates/functions/interactive/banner.sh",
|
|
167
|
-
".chezmoitemplates/functions/interactive/rainbow.sh",
|
|
168
|
-
".chezmoitemplates/functions/interactive/pipes.sh",
|
|
169
|
-
".chezmoitemplates/functions/misc/pipes.sh",
|
|
170
|
-
".chezmoitemplates/functions/misc/view-source.sh",
|
|
171
|
-
".chezmoitemplates/functions/misc/caffeine.sh", # daemon controller, real /tmp/lock
|
|
172
|
-
".chezmoitemplates/functions/nav/ql.sh",
|
|
173
|
-
"scripts/tools/pipes.sh",
|
|
174
|
-
"scripts/tools/cmatrix.sh",
|
|
175
|
-
"scripts/demo/record.sh",
|
|
176
|
-
"dot_local/bin/executable_tmux-sessionizer",
|
|
177
|
-
"dot_local/bin/executable_myip",
|
|
178
|
-
"dot_local/bin/executable_tour", # requires TTY + gum
|
|
179
|
-
# Self-reference + CI gates
|
|
180
|
-
"scripts/ci/run-coverage.sh",
|
|
181
|
-
"scripts/ci/check-deps-dev.sh",
|
|
182
|
-
"scripts/ci/lint-reusable-pins.sh",
|
|
183
|
-
"scripts/ci/validate-chezmoidata.sh",
|
|
184
|
-
"scripts/ci/validate-ci-config.sh",
|
|
185
|
-
"scripts/ci/check-dangerous-chmod.sh",
|
|
186
|
-
"scripts/git-hooks/pre-push",
|
|
187
|
-
"scripts/qa/reliability-audit.sh",
|
|
188
|
-
"scripts/qa/coverage-baseline.sh",
|
|
189
|
-
"scripts/dot/commands/lint.sh",
|
|
190
|
-
# System mutation — drives real OS state we can't fake under xtrace.
|
|
191
|
-
"scripts/theme/rebuild-themes.sh",
|
|
192
|
-
"scripts/theme/apply-gnome-theme.sh",
|
|
193
|
-
"scripts/theme/wallpaper-sync.sh",
|
|
194
|
-
"scripts/theme/install-catppuccin-themes.sh",
|
|
195
|
-
"scripts/ops/chaos.sh",
|
|
196
|
-
"scripts/ops/release.sh",
|
|
197
|
-
"scripts/ops/heal-tools.sh",
|
|
198
|
-
"scripts/ops/chezmoi-apply.sh",
|
|
199
|
-
"scripts/docs/build-manual.sh",
|
|
200
|
-
"scripts/security/manage-secrets.sh",
|
|
201
|
-
"scripts/security/enforce-policies.sh",
|
|
202
|
-
"scripts/security/ssh-cert.sh",
|
|
203
|
-
"scripts/security/firewall.sh",
|
|
204
|
-
"scripts/lib/secrets_provider.sh", # keychain/gpg/age bindings
|
|
205
|
-
"scripts/ops/setup.sh", # post-install bootstrap
|
|
206
|
-
"scripts/theme/wallpaper-rotate.sh", # cron-driven wallpaper change
|
|
207
|
-
"scripts/git-hooks/pre-commit-audit.sh", # full hook flow needs real index
|
|
208
|
-
"dot_local/bin/executable_dot-theme-sync", # signals live apps
|
|
209
|
-
"dot_local/bin/executable_dot-bootstrap",
|
|
210
|
-
"dot_local/bin/executable_update",
|
|
211
|
-
"dot_local/bin/executable_ai_core",
|
|
212
|
-
"dot_local/bin/executable_ai-update",
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
def is_skipped(abs_path: Path) -> bool:
|
|
216
|
-
try:
|
|
217
|
-
rel = abs_path.resolve().relative_to(repo_root).as_posix()
|
|
218
|
-
except ValueError:
|
|
219
|
-
return False
|
|
220
|
-
return rel in SKIP_PATHS
|
|
221
|
-
|
|
222
|
-
# Pattern: +@COV@:<lineno>:<source>:@
|
|
223
|
-
hit_re = re.compile(r"^\+@COV@:(\d+):([^:]+):@")
|
|
224
|
-
|
|
225
|
-
# files[abs_path][line] = total hits
|
|
226
|
-
files = defaultdict(lambda: defaultdict(int))
|
|
227
|
-
|
|
228
|
-
def in_includes(path: Path) -> bool:
|
|
229
|
-
try:
|
|
230
|
-
rp = path.resolve()
|
|
231
|
-
except (OSError, RuntimeError):
|
|
232
|
-
return False
|
|
233
|
-
for inc in include_dirs:
|
|
234
|
-
try:
|
|
235
|
-
rp.relative_to(inc)
|
|
236
|
-
return True
|
|
237
|
-
except ValueError:
|
|
238
|
-
continue
|
|
239
|
-
return False
|
|
240
|
-
|
|
241
|
-
# Parse every trace file. Each trace can be MBs; iterate line by line.
|
|
242
|
-
for trace_path in sorted(trace_dir.glob("*.trace")):
|
|
243
|
-
try:
|
|
244
|
-
with open(trace_path, "r", errors="replace") as f:
|
|
245
|
-
for line in f:
|
|
246
|
-
m = hit_re.match(line)
|
|
247
|
-
if not m:
|
|
248
|
-
continue
|
|
249
|
-
lineno = int(m.group(1))
|
|
250
|
-
src = m.group(2).strip()
|
|
251
|
-
if not src or src == "main":
|
|
252
|
-
continue
|
|
253
|
-
src_path = Path(src)
|
|
254
|
-
if not src_path.is_absolute():
|
|
255
|
-
src_path = (repo_root / src_path)
|
|
256
|
-
# Always resolve so `..`-style paths from inside
|
|
257
|
-
# `commands/foo.sh` sourcing `../lib/log.sh` collapse
|
|
258
|
-
# to the same canonical SF: key as a direct hit on
|
|
259
|
-
# `lib/log.sh`. Without this we get three SF: blocks
|
|
260
|
-
# for one file and the denominator inflates.
|
|
261
|
-
try:
|
|
262
|
-
src_path = src_path.resolve()
|
|
263
|
-
except (OSError, RuntimeError):
|
|
264
|
-
pass
|
|
265
|
-
if not in_includes(src_path):
|
|
266
|
-
continue
|
|
267
|
-
if is_skipped(src_path):
|
|
268
|
-
continue
|
|
269
|
-
files[str(src_path)][lineno] += 1
|
|
270
|
-
except OSError as e:
|
|
271
|
-
print(f"warn: read error {trace_path}: {e}", file=sys.stderr)
|
|
272
|
-
|
|
273
|
-
# Sweep through include-dirs and add executable lines for files we never
|
|
274
|
-
# touched, so lcov coverage % reflects total source surface, not just
|
|
275
|
-
# touched files.
|
|
276
|
-
ws_re = re.compile(r"^\s*$")
|
|
277
|
-
comment_re = re.compile(r"^\s*#")
|
|
278
|
-
shebang_re = re.compile(r"^\s*#!")
|
|
279
|
-
|
|
280
|
-
def executable_lines(path: Path):
|
|
281
|
-
"""Lines that bash xtrace can plausibly emit.
|
|
282
|
-
|
|
283
|
-
Excludes:
|
|
284
|
-
- blanks / shebangs / comments (already)
|
|
285
|
-
- structural-only keywords (`fi`, `done`, `else`, `esac`, `then`,
|
|
286
|
-
`do`, `in`, bare `{`/`}` braces) — these are syntax, not
|
|
287
|
-
commands; xtrace never traces them
|
|
288
|
-
- heredoc body lines (between `<<EOF` and `EOF`) — content, not
|
|
289
|
-
executed
|
|
290
|
-
- `case` pattern labels (`foo)`) — the matched body executes,
|
|
291
|
-
not the pattern itself
|
|
292
|
-
|
|
293
|
-
This matches what `bash -x` actually produces a `+`-prefixed
|
|
294
|
-
line for, so the denominator reflects measurable lines.
|
|
295
|
-
|
|
296
|
-
Honor LCOV_EXCL_LINE / LCOV_EXCL_START / LCOV_EXCL_STOP markers
|
|
297
|
-
so authors can exempt genuinely unreachable lines (platform-
|
|
298
|
-
gated branches, root-only paths, dead-code stubs).
|
|
299
|
-
"""
|
|
300
|
-
import re as _re
|
|
301
|
-
structural = _re.compile(
|
|
302
|
-
r"^\s*("
|
|
303
|
-
r"fi|done|else|elif|esac|then|do|in|"
|
|
304
|
-
r"\}|\{|"
|
|
305
|
-
r"\)\s*;?;?\s*$|" # bare `)` (case pattern close)
|
|
306
|
-
r";;\s*$" # `;;` case-clause terminator
|
|
307
|
-
r")\s*(#.*)?$"
|
|
308
|
-
)
|
|
309
|
-
case_pattern = _re.compile(r"^\s*[a-zA-Z0-9_\*\?\[\|/\-\.+]+\)\s*(#.*)?$")
|
|
310
|
-
heredoc_open = _re.compile(r"<<-?\s*[\"\']?([A-Za-z_][A-Za-z0-9_]*)[\"\']?")
|
|
311
|
-
excl_line = _re.compile(r"#\s*LCOV_EXCL_LINE")
|
|
312
|
-
excl_start = _re.compile(r"#\s*LCOV_EXCL_START")
|
|
313
|
-
excl_stop = _re.compile(r"#\s*LCOV_EXCL_STOP")
|
|
314
|
-
# Scripts that explicitly turn off xtrace can't be measured by
|
|
315
|
-
# this mechanism — the bash runtime simply stops emitting trace
|
|
316
|
-
# records. Treat everything after `set +x` / `set +o xtrace`
|
|
317
|
-
# as excluded so it doesn't sink the denominator.
|
|
318
|
-
xtrace_off = _re.compile(r"^\s*set\s+(\+x|\+o\s+xtrace)\b")
|
|
319
|
-
|
|
320
|
-
try:
|
|
321
|
-
with open(path, "r", errors="replace") as f:
|
|
322
|
-
text = f.read().splitlines()
|
|
323
|
-
except OSError:
|
|
324
|
-
return []
|
|
325
|
-
|
|
326
|
-
out = []
|
|
327
|
-
in_heredoc = None # the terminator we're waiting for
|
|
328
|
-
excluding = False
|
|
329
|
-
xtrace_disabled = False
|
|
330
|
-
for i, line in enumerate(text, 1):
|
|
331
|
-
# LCOV_EXCL handling
|
|
332
|
-
if excl_start.search(line):
|
|
333
|
-
excluding = True
|
|
334
|
-
continue
|
|
335
|
-
if excl_stop.search(line):
|
|
336
|
-
excluding = False
|
|
337
|
-
continue
|
|
338
|
-
if excluding:
|
|
339
|
-
continue
|
|
340
|
-
if excl_line.search(line):
|
|
341
|
-
continue
|
|
342
|
-
|
|
343
|
-
# Once a script disables xtrace, no further lines can be
|
|
344
|
-
# measured by this mechanism — drop them from the denominator.
|
|
345
|
-
if xtrace_disabled:
|
|
346
|
-
continue
|
|
347
|
-
if xtrace_off.match(line):
|
|
348
|
-
xtrace_disabled = True
|
|
349
|
-
continue
|
|
350
|
-
|
|
351
|
-
# Heredoc body — track and skip
|
|
352
|
-
if in_heredoc is not None:
|
|
353
|
-
if line.strip() == in_heredoc:
|
|
354
|
-
in_heredoc = None
|
|
355
|
-
continue
|
|
356
|
-
hd = heredoc_open.search(line)
|
|
357
|
-
if hd and not comment_re.match(line):
|
|
358
|
-
in_heredoc = hd.group(1)
|
|
359
|
-
|
|
360
|
-
if not line or ws_re.match(line):
|
|
361
|
-
continue
|
|
362
|
-
if shebang_re.match(line):
|
|
363
|
-
continue
|
|
364
|
-
if comment_re.match(line):
|
|
365
|
-
continue
|
|
366
|
-
if structural.match(line):
|
|
367
|
-
continue
|
|
368
|
-
if case_pattern.match(line):
|
|
369
|
-
continue
|
|
370
|
-
out.append(i)
|
|
371
|
-
return out
|
|
372
|
-
|
|
373
|
-
for inc in include_dirs:
|
|
374
|
-
if not inc.exists():
|
|
375
|
-
continue
|
|
376
|
-
for path in inc.rglob("*.sh"):
|
|
377
|
-
if is_skipped(path):
|
|
378
|
-
continue
|
|
379
|
-
ap = str(path.resolve())
|
|
380
|
-
existing = files[ap] # creates the entry on touch
|
|
381
|
-
for ln in executable_lines(path):
|
|
382
|
-
if ln not in existing:
|
|
383
|
-
existing[ln] = 0
|
|
384
|
-
for path in inc.rglob("*"):
|
|
385
|
-
# also include shebanged shell scripts without .sh
|
|
386
|
-
if path.is_file() and not path.suffix and path.stat().st_size > 0:
|
|
387
|
-
if is_skipped(path):
|
|
388
|
-
continue
|
|
389
|
-
try:
|
|
390
|
-
with open(path, "r", errors="replace") as f:
|
|
391
|
-
first = f.readline()
|
|
392
|
-
except OSError:
|
|
393
|
-
continue
|
|
394
|
-
if first.startswith("#!") and ("bash" in first or "sh" in first):
|
|
395
|
-
ap = str(path.resolve())
|
|
396
|
-
existing = files[ap]
|
|
397
|
-
for ln in executable_lines(path):
|
|
398
|
-
if ln not in existing:
|
|
399
|
-
existing[ln] = 0
|
|
400
|
-
|
|
401
|
-
# Emit lcov.info
|
|
402
|
-
with open(out_path, "w") as out:
|
|
403
|
-
for filename in sorted(files):
|
|
404
|
-
out.write(f"SF:{filename}\n")
|
|
405
|
-
for ln in sorted(files[filename]):
|
|
406
|
-
out.write(f"DA:{ln},{files[filename][ln]}\n")
|
|
407
|
-
out.write("end_of_record\n")
|
|
408
|
-
|
|
409
|
-
# Summary
|
|
410
|
-
total_files = len(files)
|
|
411
|
-
total_lines = sum(len(lines) for lines in files.values())
|
|
412
|
-
covered = sum(1 for lines in files.values() for h in lines.values() if h > 0)
|
|
413
|
-
pct = (covered * 100.0 / total_lines) if total_lines else 0.0
|
|
414
|
-
print(f"Aggregated: {total_files} files, {covered}/{total_lines} lines = {pct:.2f}%",
|
|
415
|
-
file=sys.stderr)
|
|
416
|
-
PY
|
|
417
|
-
|
|
418
|
-
if [[ ! -s "$COVERAGE_OUT" ]]; then
|
|
419
|
-
echo "::error::failed to produce lcov.info — aggregator wrote empty file." >&2
|
|
420
|
-
exit 1
|
|
421
|
-
fi
|
|
422
|
-
|
|
423
|
-
# -----------------------------------------------------------------------------
|
|
424
|
-
# Threshold check.
|
|
425
|
-
# -----------------------------------------------------------------------------
|
|
426
|
-
summary=$(
|
|
427
|
-
python3 - "$COVERAGE_OUT" <<'PY'
|
|
428
|
-
import sys
|
|
429
|
-
total = covered = 0
|
|
430
|
-
with open(sys.argv[1]) as f:
|
|
431
|
-
for line in f:
|
|
432
|
-
if line.startswith("DA:"):
|
|
433
|
-
_, rest = line.split(":", 1)
|
|
434
|
-
_, hits = rest.strip().split(",")
|
|
435
|
-
total += 1
|
|
436
|
-
if int(hits) > 0:
|
|
437
|
-
covered += 1
|
|
438
|
-
pct = (covered * 100.0 / total) if total else 0.0
|
|
439
|
-
print(f"{covered} {total} {pct:.2f}")
|
|
440
|
-
PY
|
|
441
|
-
)
|
|
442
|
-
read -r covered total pct <<<"$summary"
|
|
443
|
-
echo "Coverage: ${covered}/${total} lines = ${pct}% (output: $COVERAGE_OUT)"
|
|
444
|
-
|
|
445
|
-
below=$(awk -v p="$pct" -v t="$MIN_COVERAGE_PCT" 'BEGIN{print (p+0 < t+0) ? "1" : "0"}')
|
|
446
|
-
if [[ "$below" == "1" ]]; then
|
|
447
|
-
echo "::error::coverage ${pct}% is below the floor ${MIN_COVERAGE_PCT}%" >&2
|
|
448
|
-
exit 1
|
|
449
|
-
fi
|
|
450
|
-
|
|
451
|
-
exit 0
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# Validate .chezmoidata.toml against config/chezmoidata.schema.json via taplo.
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# bash scripts/ci/validate-chezmoidata.sh
|
|
7
|
-
#
|
|
8
|
-
# In CI the workflow installs taplo before invoking this script. Locally,
|
|
9
|
-
# install via: cargo install --locked taplo-cli (or `brew install taplo`).
|
|
10
|
-
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
|
|
13
|
-
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
14
|
-
cd "$REPO_ROOT"
|
|
15
|
-
|
|
16
|
-
if ! command -v taplo >/dev/null 2>&1; then
|
|
17
|
-
echo "error: taplo not found in PATH" >&2
|
|
18
|
-
echo " install: cargo install --locked taplo-cli" >&2
|
|
19
|
-
echo " or: brew install taplo" >&2
|
|
20
|
-
exit 127
|
|
21
|
-
fi
|
|
22
|
-
|
|
23
|
-
# `taplo check` reads .taplo.toml at the repo root, applies the schema
|
|
24
|
-
# rule, and reports schema violations + TOML syntax errors.
|
|
25
|
-
taplo check
|