@sebastienrousseau/dotfiles 0.2.501 → 0.2.503
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 +155 -4
- package/LICENSE +21 -1283
- package/README.md +40 -8
- 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/01-dot-cli.md +63 -45
- package/docs/manual/03-reference/02-config-files.md +2 -2
- package/docs/manual/03-reference/05-feature-flags.md +62 -3
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +72 -55
- package/docs/manual/index.md +66 -0
- package/docs/operations/CI_COMPOSITES.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +40 -6
- package/docs/operations/HARD_AUDIT_2026.md +631 -0
- package/docs/operations/MAINTENANCE.md +3 -3
- package/docs/operations/MANIFEST.md +127 -0
- package/docs/operations/REGISTRY.md +89 -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 +665 -0
- package/docs/operations/ROADMAP_V0_2_503.md +134 -0
- package/docs/operations/TESTING.md +17 -0
- package/docs/operations/TRACEABILITY.md +9 -3
- package/docs/operations/VERSION_SYNC.md +4 -4
- package/docs/reference/POWERSHELL_PARITY.md +81 -0
- package/docs/registry.json +6 -0
- package/docs/schema/dot-env-v1.json +110 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
- package/docs/security/CI_PINNING.md +121 -0
- package/docs/security/COMMIT_SIGNING.md +138 -0
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
- package/docs/security/DISCLOSURE.md +130 -0
- package/docs/security/FUZZING.md +114 -0
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/KEY_ROTATION.md +81 -1
- package/docs/security/POLICY_RELEASES.md +2 -2
- package/docs/security/SCORECARD.md +130 -15
- package/docs/security/SHELL_EXEMPTIONS.md +4 -4
- package/docs/security/VERIFY_RELEASE.md +201 -0
- package/docs/security/security-pubkey.asc +15 -0
- package/install.sh +67 -38
- 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 +4 -4
- package/scripts/diagnostics/conflicts.sh +2 -2
- package/scripts/diagnostics/doctor-unified.sh +2 -2
- package/scripts/diagnostics/doctor.sh +45 -15
- 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 +4 -4
- package/scripts/diagnostics/scorecard.sh +4 -4
- package/scripts/diagnostics/security-score.sh +2 -2
- 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 +2 -2
- package/scripts/diagnostics/workstation-attestation.sh +14 -14
- package/scripts/dot/commands/agent.sh +27 -22
- package/scripts/dot/commands/agents.sh +335 -0
- package/scripts/dot/commands/ai.sh +144 -25
- package/scripts/dot/commands/aliases.sh +10 -8
- package/scripts/dot/commands/appearance.sh +2 -2
- package/scripts/dot/commands/core.sh +12 -6
- package/scripts/dot/commands/diagnostics.sh +5 -5
- package/scripts/dot/commands/env-emit.sh +202 -0
- package/scripts/dot/commands/fleet.sh +290 -14
- package/scripts/dot/commands/init.sh +184 -0
- package/scripts/dot/commands/lint.sh +9 -4
- package/scripts/dot/commands/manual.sh +3 -3
- package/scripts/dot/commands/meta.sh +19 -10
- package/scripts/dot/commands/patterns.sh +2 -2
- package/scripts/dot/commands/registry.sh +263 -0
- 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 +62 -4
- 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 +2 -2
- package/scripts/git-hooks/pre-push +13 -0
- package/scripts/lib/secrets_provider.sh +32 -6
- package/scripts/ops/ai-setup.sh +1 -1
- package/scripts/ops/bundle.sh +2 -2
- package/scripts/ops/chaos.sh +2 -2
- package/scripts/ops/chezmoi-apply.sh +4 -4
- 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 +18 -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/check-disclosure-key-expiry.sh +110 -0
- 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-configs.sh +11 -2
- 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 +8 -1
- 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 +58 -7
- 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/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/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 -134
- 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 -635
- 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 -596
- package/dot_local/bin/executable_dot-ai +0 -36
- package/dot_local/bin/executable_dot-bootstrap +0 -77
- 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 -283
- 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/install-chezmoi-verified.sh +0 -64
- package/scripts/ci/run-coverage.sh +0 -362
- package/scripts/ci/validate-chezmoidata.sh +0 -25
- package/scripts/ci/validate-ci-config.sh +0 -224
- 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 -99
- package/scripts/dot/lib/ui.sh +0 -518
- 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,64 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# Install a pinned Chezmoi release with checksum verification.
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
|
|
6
|
-
VERSION="${1:-}"
|
|
7
|
-
BIN_DIR="${2:-$HOME/.local/bin}"
|
|
8
|
-
|
|
9
|
-
if [[ -z "$VERSION" ]]; then
|
|
10
|
-
echo "Usage: $0 <chezmoi-version> [bin-dir]" >&2
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
|
15
|
-
ARCH="$(uname -m)"
|
|
16
|
-
|
|
17
|
-
case "$OS" in
|
|
18
|
-
linux | darwin) ;;
|
|
19
|
-
*)
|
|
20
|
-
echo "Unsupported OS: $OS" >&2
|
|
21
|
-
exit 1
|
|
22
|
-
;;
|
|
23
|
-
esac
|
|
24
|
-
|
|
25
|
-
case "$ARCH" in
|
|
26
|
-
x86_64 | amd64) ARCH="amd64" ;;
|
|
27
|
-
arm64 | aarch64) ARCH="arm64" ;;
|
|
28
|
-
*)
|
|
29
|
-
echo "Unsupported architecture: $ARCH" >&2
|
|
30
|
-
exit 1
|
|
31
|
-
;;
|
|
32
|
-
esac
|
|
33
|
-
|
|
34
|
-
ASSET="chezmoi_${VERSION}_${OS}_${ARCH}.tar.gz"
|
|
35
|
-
CHECKSUMS_ASSET="chezmoi_${VERSION}_checksums.txt"
|
|
36
|
-
BASE_URL="https://github.com/twpayne/chezmoi/releases/download/v${VERSION}"
|
|
37
|
-
|
|
38
|
-
TMP_DIR="$(umask 077 && mktemp -d)"
|
|
39
|
-
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
40
|
-
|
|
41
|
-
# Support both old and new checksum filenames.
|
|
42
|
-
if ! curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/$CHECKSUMS_ASSET"; then
|
|
43
|
-
curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/checksums.txt"
|
|
44
|
-
fi
|
|
45
|
-
curl -fsSL -o "$TMP_DIR/$ASSET" "$BASE_URL/$ASSET"
|
|
46
|
-
|
|
47
|
-
CHECKSUM_LINE="$(grep -E "[[:space:]]${ASSET}$" "$TMP_DIR/checksums.txt" | head -n1 || true)"
|
|
48
|
-
if [[ -z "$CHECKSUM_LINE" ]]; then
|
|
49
|
-
echo "Checksum entry not found for $ASSET" >&2
|
|
50
|
-
exit 1
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
(
|
|
54
|
-
cd "$TMP_DIR"
|
|
55
|
-
if command -v sha256sum >/dev/null 2>&1; then
|
|
56
|
-
echo "$CHECKSUM_LINE" | sha256sum -c -
|
|
57
|
-
else
|
|
58
|
-
echo "$CHECKSUM_LINE" | shasum -a 256 -c -
|
|
59
|
-
fi
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
tar -xzf "$TMP_DIR/$ASSET" -C "$TMP_DIR" chezmoi
|
|
63
|
-
mkdir -p "$BIN_DIR"
|
|
64
|
-
install -m 755 "$TMP_DIR/chezmoi" "$BIN_DIR/chezmoi"
|
|
@@ -1,362 +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
|
-
# Pattern: +@COV@:<lineno>:<source>:@
|
|
140
|
-
hit_re = re.compile(r"^\+@COV@:(\d+):([^:]+):@")
|
|
141
|
-
|
|
142
|
-
# files[abs_path][line] = total hits
|
|
143
|
-
files = defaultdict(lambda: defaultdict(int))
|
|
144
|
-
|
|
145
|
-
def in_includes(path: Path) -> bool:
|
|
146
|
-
try:
|
|
147
|
-
rp = path.resolve()
|
|
148
|
-
except (OSError, RuntimeError):
|
|
149
|
-
return False
|
|
150
|
-
for inc in include_dirs:
|
|
151
|
-
try:
|
|
152
|
-
rp.relative_to(inc)
|
|
153
|
-
return True
|
|
154
|
-
except ValueError:
|
|
155
|
-
continue
|
|
156
|
-
return False
|
|
157
|
-
|
|
158
|
-
# Parse every trace file. Each trace can be MBs; iterate line by line.
|
|
159
|
-
for trace_path in sorted(trace_dir.glob("*.trace")):
|
|
160
|
-
try:
|
|
161
|
-
with open(trace_path, "r", errors="replace") as f:
|
|
162
|
-
for line in f:
|
|
163
|
-
m = hit_re.match(line)
|
|
164
|
-
if not m:
|
|
165
|
-
continue
|
|
166
|
-
lineno = int(m.group(1))
|
|
167
|
-
src = m.group(2).strip()
|
|
168
|
-
if not src or src == "main":
|
|
169
|
-
continue
|
|
170
|
-
src_path = Path(src)
|
|
171
|
-
if not src_path.is_absolute():
|
|
172
|
-
src_path = (repo_root / src_path)
|
|
173
|
-
# Always resolve so `..`-style paths from inside
|
|
174
|
-
# `commands/foo.sh` sourcing `../lib/log.sh` collapse
|
|
175
|
-
# to the same canonical SF: key as a direct hit on
|
|
176
|
-
# `lib/log.sh`. Without this we get three SF: blocks
|
|
177
|
-
# for one file and the denominator inflates.
|
|
178
|
-
try:
|
|
179
|
-
src_path = src_path.resolve()
|
|
180
|
-
except (OSError, RuntimeError):
|
|
181
|
-
pass
|
|
182
|
-
if not in_includes(src_path):
|
|
183
|
-
continue
|
|
184
|
-
files[str(src_path)][lineno] += 1
|
|
185
|
-
except OSError as e:
|
|
186
|
-
print(f"warn: read error {trace_path}: {e}", file=sys.stderr)
|
|
187
|
-
|
|
188
|
-
# Sweep through include-dirs and add executable lines for files we never
|
|
189
|
-
# touched, so lcov coverage % reflects total source surface, not just
|
|
190
|
-
# touched files.
|
|
191
|
-
ws_re = re.compile(r"^\s*$")
|
|
192
|
-
comment_re = re.compile(r"^\s*#")
|
|
193
|
-
shebang_re = re.compile(r"^\s*#!")
|
|
194
|
-
|
|
195
|
-
def executable_lines(path: Path):
|
|
196
|
-
"""Lines that bash xtrace can plausibly emit.
|
|
197
|
-
|
|
198
|
-
Excludes:
|
|
199
|
-
- blanks / shebangs / comments (already)
|
|
200
|
-
- structural-only keywords (`fi`, `done`, `else`, `esac`, `then`,
|
|
201
|
-
`do`, `in`, bare `{`/`}` braces) — these are syntax, not
|
|
202
|
-
commands; xtrace never traces them
|
|
203
|
-
- heredoc body lines (between `<<EOF` and `EOF`) — content, not
|
|
204
|
-
executed
|
|
205
|
-
- `case` pattern labels (`foo)`) — the matched body executes,
|
|
206
|
-
not the pattern itself
|
|
207
|
-
|
|
208
|
-
This matches what `bash -x` actually produces a `+`-prefixed
|
|
209
|
-
line for, so the denominator reflects measurable lines.
|
|
210
|
-
|
|
211
|
-
Honor LCOV_EXCL_LINE / LCOV_EXCL_START / LCOV_EXCL_STOP markers
|
|
212
|
-
so authors can exempt genuinely unreachable lines (platform-
|
|
213
|
-
gated branches, root-only paths, dead-code stubs).
|
|
214
|
-
"""
|
|
215
|
-
import re as _re
|
|
216
|
-
structural = _re.compile(
|
|
217
|
-
r"^\s*("
|
|
218
|
-
r"fi|done|else|elif|esac|then|do|in|"
|
|
219
|
-
r"\}|\{|"
|
|
220
|
-
r"\)\s*;?;?\s*$|" # bare `)` (case pattern close)
|
|
221
|
-
r";;\s*$" # `;;` case-clause terminator
|
|
222
|
-
r")\s*(#.*)?$"
|
|
223
|
-
)
|
|
224
|
-
case_pattern = _re.compile(r"^\s*[a-zA-Z0-9_\*\?\[\|/\-\.+]+\)\s*(#.*)?$")
|
|
225
|
-
heredoc_open = _re.compile(r"<<-?\s*[\"\']?([A-Za-z_][A-Za-z0-9_]*)[\"\']?")
|
|
226
|
-
excl_line = _re.compile(r"#\s*LCOV_EXCL_LINE")
|
|
227
|
-
excl_start = _re.compile(r"#\s*LCOV_EXCL_START")
|
|
228
|
-
excl_stop = _re.compile(r"#\s*LCOV_EXCL_STOP")
|
|
229
|
-
# Scripts that explicitly turn off xtrace can't be measured by
|
|
230
|
-
# this mechanism — the bash runtime simply stops emitting trace
|
|
231
|
-
# records. Treat everything after `set +x` / `set +o xtrace`
|
|
232
|
-
# as excluded so it doesn't sink the denominator.
|
|
233
|
-
xtrace_off = _re.compile(r"^\s*set\s+(\+x|\+o\s+xtrace)\b")
|
|
234
|
-
|
|
235
|
-
try:
|
|
236
|
-
with open(path, "r", errors="replace") as f:
|
|
237
|
-
text = f.read().splitlines()
|
|
238
|
-
except OSError:
|
|
239
|
-
return []
|
|
240
|
-
|
|
241
|
-
out = []
|
|
242
|
-
in_heredoc = None # the terminator we're waiting for
|
|
243
|
-
excluding = False
|
|
244
|
-
xtrace_disabled = False
|
|
245
|
-
for i, line in enumerate(text, 1):
|
|
246
|
-
# LCOV_EXCL handling
|
|
247
|
-
if excl_start.search(line):
|
|
248
|
-
excluding = True
|
|
249
|
-
continue
|
|
250
|
-
if excl_stop.search(line):
|
|
251
|
-
excluding = False
|
|
252
|
-
continue
|
|
253
|
-
if excluding:
|
|
254
|
-
continue
|
|
255
|
-
if excl_line.search(line):
|
|
256
|
-
continue
|
|
257
|
-
|
|
258
|
-
# Once a script disables xtrace, no further lines can be
|
|
259
|
-
# measured by this mechanism — drop them from the denominator.
|
|
260
|
-
if xtrace_disabled:
|
|
261
|
-
continue
|
|
262
|
-
if xtrace_off.match(line):
|
|
263
|
-
xtrace_disabled = True
|
|
264
|
-
continue
|
|
265
|
-
|
|
266
|
-
# Heredoc body — track and skip
|
|
267
|
-
if in_heredoc is not None:
|
|
268
|
-
if line.strip() == in_heredoc:
|
|
269
|
-
in_heredoc = None
|
|
270
|
-
continue
|
|
271
|
-
hd = heredoc_open.search(line)
|
|
272
|
-
if hd and not comment_re.match(line):
|
|
273
|
-
in_heredoc = hd.group(1)
|
|
274
|
-
|
|
275
|
-
if not line or ws_re.match(line):
|
|
276
|
-
continue
|
|
277
|
-
if shebang_re.match(line):
|
|
278
|
-
continue
|
|
279
|
-
if comment_re.match(line):
|
|
280
|
-
continue
|
|
281
|
-
if structural.match(line):
|
|
282
|
-
continue
|
|
283
|
-
if case_pattern.match(line):
|
|
284
|
-
continue
|
|
285
|
-
out.append(i)
|
|
286
|
-
return out
|
|
287
|
-
|
|
288
|
-
for inc in include_dirs:
|
|
289
|
-
if not inc.exists():
|
|
290
|
-
continue
|
|
291
|
-
for path in inc.rglob("*.sh"):
|
|
292
|
-
ap = str(path.resolve())
|
|
293
|
-
existing = files[ap] # creates the entry on touch
|
|
294
|
-
for ln in executable_lines(path):
|
|
295
|
-
if ln not in existing:
|
|
296
|
-
existing[ln] = 0
|
|
297
|
-
for path in inc.rglob("*"):
|
|
298
|
-
# also include shebanged shell scripts without .sh
|
|
299
|
-
if path.is_file() and not path.suffix and path.stat().st_size > 0:
|
|
300
|
-
try:
|
|
301
|
-
with open(path, "r", errors="replace") as f:
|
|
302
|
-
first = f.readline()
|
|
303
|
-
except OSError:
|
|
304
|
-
continue
|
|
305
|
-
if first.startswith("#!") and ("bash" in first or "sh" in first):
|
|
306
|
-
ap = str(path.resolve())
|
|
307
|
-
existing = files[ap]
|
|
308
|
-
for ln in executable_lines(path):
|
|
309
|
-
if ln not in existing:
|
|
310
|
-
existing[ln] = 0
|
|
311
|
-
|
|
312
|
-
# Emit lcov.info
|
|
313
|
-
with open(out_path, "w") as out:
|
|
314
|
-
for filename in sorted(files):
|
|
315
|
-
out.write(f"SF:{filename}\n")
|
|
316
|
-
for ln in sorted(files[filename]):
|
|
317
|
-
out.write(f"DA:{ln},{files[filename][ln]}\n")
|
|
318
|
-
out.write("end_of_record\n")
|
|
319
|
-
|
|
320
|
-
# Summary
|
|
321
|
-
total_files = len(files)
|
|
322
|
-
total_lines = sum(len(lines) for lines in files.values())
|
|
323
|
-
covered = sum(1 for lines in files.values() for h in lines.values() if h > 0)
|
|
324
|
-
pct = (covered * 100.0 / total_lines) if total_lines else 0.0
|
|
325
|
-
print(f"Aggregated: {total_files} files, {covered}/{total_lines} lines = {pct:.2f}%",
|
|
326
|
-
file=sys.stderr)
|
|
327
|
-
PY
|
|
328
|
-
|
|
329
|
-
if [[ ! -s "$COVERAGE_OUT" ]]; then
|
|
330
|
-
echo "::error::failed to produce lcov.info — aggregator wrote empty file." >&2
|
|
331
|
-
exit 1
|
|
332
|
-
fi
|
|
333
|
-
|
|
334
|
-
# -----------------------------------------------------------------------------
|
|
335
|
-
# Threshold check.
|
|
336
|
-
# -----------------------------------------------------------------------------
|
|
337
|
-
summary=$(
|
|
338
|
-
python3 - "$COVERAGE_OUT" <<'PY'
|
|
339
|
-
import sys
|
|
340
|
-
total = covered = 0
|
|
341
|
-
with open(sys.argv[1]) as f:
|
|
342
|
-
for line in f:
|
|
343
|
-
if line.startswith("DA:"):
|
|
344
|
-
_, rest = line.split(":", 1)
|
|
345
|
-
_, hits = rest.strip().split(",")
|
|
346
|
-
total += 1
|
|
347
|
-
if int(hits) > 0:
|
|
348
|
-
covered += 1
|
|
349
|
-
pct = (covered * 100.0 / total) if total else 0.0
|
|
350
|
-
print(f"{covered} {total} {pct:.2f}")
|
|
351
|
-
PY
|
|
352
|
-
)
|
|
353
|
-
read -r covered total pct <<<"$summary"
|
|
354
|
-
echo "Coverage: ${covered}/${total} lines = ${pct}% (output: $COVERAGE_OUT)"
|
|
355
|
-
|
|
356
|
-
below=$(awk -v p="$pct" -v t="$MIN_COVERAGE_PCT" 'BEGIN{print (p+0 < t+0) ? "1" : "0"}')
|
|
357
|
-
if [[ "$below" == "1" ]]; then
|
|
358
|
-
echo "::error::coverage ${pct}% is below the floor ${MIN_COVERAGE_PCT}%" >&2
|
|
359
|
-
exit 1
|
|
360
|
-
fi
|
|
361
|
-
|
|
362
|
-
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
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# CI Configuration Validation Script
|
|
4
|
-
# Verifies that all zero-warning policy components are properly configured
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
10
|
-
|
|
11
|
-
# Colors for output (respect NO_COLOR: https://no-color.org)
|
|
12
|
-
if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
|
|
13
|
-
RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m'
|
|
14
|
-
BLUE='\033[0;34m' NC='\033[0m'
|
|
15
|
-
else
|
|
16
|
-
RED='' GREEN='' YELLOW='' BLUE='' NC=''
|
|
17
|
-
fi
|
|
18
|
-
|
|
19
|
-
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
20
|
-
printf '%b\n' "${BLUE} CI CONFIGURATION VALIDATOR ${NC}"
|
|
21
|
-
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
22
|
-
echo ""
|
|
23
|
-
|
|
24
|
-
ERRORS=0
|
|
25
|
-
WARNINGS=0
|
|
26
|
-
|
|
27
|
-
# Helper functions
|
|
28
|
-
check_file_exists() {
|
|
29
|
-
local file="$1"
|
|
30
|
-
local description="$2"
|
|
31
|
-
|
|
32
|
-
if [[ -f "$file" ]]; then
|
|
33
|
-
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
34
|
-
return 0
|
|
35
|
-
else
|
|
36
|
-
printf '%b\n' " ${RED}✗${NC} $description"
|
|
37
|
-
((ERRORS++))
|
|
38
|
-
return 1
|
|
39
|
-
fi
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
check_pattern_in_file() {
|
|
43
|
-
local file="$1"
|
|
44
|
-
local pattern="$2"
|
|
45
|
-
local description="$3"
|
|
46
|
-
|
|
47
|
-
if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
|
|
48
|
-
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
49
|
-
return 0
|
|
50
|
-
else
|
|
51
|
-
printf '%b\n' " ${RED}✗${NC} $description"
|
|
52
|
-
((ERRORS++))
|
|
53
|
-
return 1
|
|
54
|
-
fi
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
warn_if_pattern() {
|
|
58
|
-
local file="$1"
|
|
59
|
-
local pattern="$2"
|
|
60
|
-
local description="$3"
|
|
61
|
-
|
|
62
|
-
if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
|
|
63
|
-
printf '%b\n' " ${YELLOW}⚠${NC} $description"
|
|
64
|
-
((WARNINGS++))
|
|
65
|
-
return 1
|
|
66
|
-
else
|
|
67
|
-
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
68
|
-
return 0
|
|
69
|
-
fi
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
# Check 1: Core CI files exist
|
|
73
|
-
printf '%b\n' "${BLUE}1. Core CI Files${NC}"
|
|
74
|
-
check_file_exists "$REPO_ROOT/.github/workflows/ci.yml" "Main CI workflow exists"
|
|
75
|
-
check_file_exists "$REPO_ROOT/.github/workflows/nightly.yml" "Nightly workflow exists"
|
|
76
|
-
check_file_exists "$REPO_ROOT/.github/workflows/security-enhanced.yml" "Security workflow exists"
|
|
77
|
-
check_file_exists "$REPO_ROOT/config/pre-commit-config.yaml" "Pre-commit configuration exists"
|
|
78
|
-
echo ""
|
|
79
|
-
|
|
80
|
-
# Check 2: Zero-warning enforcement
|
|
81
|
-
printf '%b\n' "${BLUE}2. Zero-Warning Policy Enforcement${NC}"
|
|
82
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "zero-warning" "Zero-warning policy documented"
|
|
83
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail on unformatted code" "Formatter failure enforced"
|
|
84
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "warnings-as-errors" "Warnings treated as errors"
|
|
85
|
-
|
|
86
|
-
# Verify no || true patterns in security steps
|
|
87
|
-
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "gitleaks.*||.*true" "Gitleaks bypass detected"
|
|
88
|
-
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "shellcheck.*||.*true" "Shellcheck bypass detected"
|
|
89
|
-
echo ""
|
|
90
|
-
|
|
91
|
-
# Check 3: Test coverage requirements
|
|
92
|
-
printf '%b\n' "${BLUE}3. Test Coverage Requirements${NC}"
|
|
93
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "100%" "100% coverage requirement"
|
|
94
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail-under" "Coverage threshold enforcement"
|
|
95
|
-
|
|
96
|
-
if [[ -f "$REPO_ROOT/tests/framework/test_runner.sh" ]]; then
|
|
97
|
-
printf '%b\n' " ${GREEN}✓${NC} Test framework exists"
|
|
98
|
-
else
|
|
99
|
-
printf '%b\n' " ${RED}✗${NC} Test framework missing"
|
|
100
|
-
((ERRORS++))
|
|
101
|
-
fi
|
|
102
|
-
echo ""
|
|
103
|
-
|
|
104
|
-
# Check 4: Security scanning
|
|
105
|
-
printf '%b\n' "${BLUE}4. Security Scanning Configuration${NC}"
|
|
106
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-secrets" "Secret scanning enabled"
|
|
107
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-dependencies" "Dependency audit enabled"
|
|
108
|
-
check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "gitleaks" "Pre-commit secret scanning"
|
|
109
|
-
check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "detect-secrets" "Advanced secret detection"
|
|
110
|
-
|
|
111
|
-
# Verify no piped execution patterns
|
|
112
|
-
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "curl.*|.*sh" "Dangerous piped execution"
|
|
113
|
-
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "wget.*|.*bash" "Dangerous piped execution"
|
|
114
|
-
echo ""
|
|
115
|
-
|
|
116
|
-
# Check 5: Performance monitoring
|
|
117
|
-
printf '%b\n' "${BLUE}5. Performance Monitoring${NC}"
|
|
118
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "benchmark" "Performance benchmarking enabled"
|
|
119
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "500ms" "Shell startup threshold defined"
|
|
120
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "performance-tracking" "Nightly performance tracking"
|
|
121
|
-
echo ""
|
|
122
|
-
|
|
123
|
-
# Check 6: Multi-OS support
|
|
124
|
-
printf '%b\n' "${BLUE}6. Multi-OS Testing${NC}"
|
|
125
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "ubuntu-latest" "Linux testing enabled"
|
|
126
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "macos-latest" "macOS testing enabled"
|
|
127
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "matrix:" "OS matrix testing configured"
|
|
128
|
-
echo ""
|
|
129
|
-
|
|
130
|
-
# Check 7: Timeouts and efficiency
|
|
131
|
-
printf '%b\n' "${BLUE}7. Timeout and Efficiency Settings${NC}"
|
|
132
|
-
if grep -q "timeout-minutes: [0-9]" "$REPO_ROOT/.github/workflows/ci.yml"; then
|
|
133
|
-
MAX_TIMEOUT=$(grep "timeout-minutes:" "$REPO_ROOT/.github/workflows/ci.yml" |
|
|
134
|
-
awk '{print $2}' | sort -n | tail -1)
|
|
135
|
-
if [[ $MAX_TIMEOUT -le 15 ]]; then
|
|
136
|
-
printf '%b\n' " ${GREEN}✓${NC} Job timeouts properly configured (max: ${MAX_TIMEOUT}min)"
|
|
137
|
-
else
|
|
138
|
-
printf '%b\n' " ${YELLOW}⚠${NC} Some jobs have long timeouts (max: ${MAX_TIMEOUT}min)"
|
|
139
|
-
((WARNINGS++))
|
|
140
|
-
fi
|
|
141
|
-
else
|
|
142
|
-
printf '%b\n' " ${RED}✗${NC} No timeout configuration found"
|
|
143
|
-
((ERRORS++))
|
|
144
|
-
fi
|
|
145
|
-
|
|
146
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "cache" "Dependency caching enabled"
|
|
147
|
-
echo ""
|
|
148
|
-
|
|
149
|
-
# Check 8: Branch protection readiness
|
|
150
|
-
printf '%b\n' "${BLUE}8. Branch Protection Readiness${NC}"
|
|
151
|
-
check_file_exists "$REPO_ROOT/.github/BRANCH_PROTECTION.md" "Branch protection documentation"
|
|
152
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "quality-gate" "Quality gate job defined"
|
|
153
|
-
|
|
154
|
-
# Check for required status check names
|
|
155
|
-
REQUIRED_CHECKS=(
|
|
156
|
-
"lint-shell"
|
|
157
|
-
"security-secrets"
|
|
158
|
-
"security-dependencies"
|
|
159
|
-
"test-unit"
|
|
160
|
-
"quality-gate"
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
for check in "${REQUIRED_CHECKS[@]}"; do
|
|
164
|
-
if grep -q "name:.*$check" "$REPO_ROOT/.github/workflows/ci.yml"; then
|
|
165
|
-
printf '%b\n' " ${GREEN}✓${NC} Required check '$check' defined"
|
|
166
|
-
else
|
|
167
|
-
printf '%b\n' " ${RED}✗${NC} Required check '$check' missing"
|
|
168
|
-
((ERRORS++))
|
|
169
|
-
fi
|
|
170
|
-
done
|
|
171
|
-
echo ""
|
|
172
|
-
|
|
173
|
-
# Check 9: Nightly extended testing
|
|
174
|
-
printf '%b\n' "${BLUE}9. Nightly Extended Testing${NC}"
|
|
175
|
-
if [[ -f "$REPO_ROOT/.github/workflows/nightly.yml" ]]; then
|
|
176
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "dependency-updates" "Dependency monitoring"
|
|
177
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "beta-tools-test" "Beta tool testing"
|
|
178
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "security-extended" "Extended security scanning"
|
|
179
|
-
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "cron:" "Scheduled execution"
|
|
180
|
-
else
|
|
181
|
-
printf '%b\n' " ${RED}✗${NC} Nightly workflow missing"
|
|
182
|
-
((ERRORS++))
|
|
183
|
-
fi
|
|
184
|
-
echo ""
|
|
185
|
-
|
|
186
|
-
# Final summary
|
|
187
|
-
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
188
|
-
printf '%b\n' "${BLUE} VALIDATION SUMMARY ${NC}"
|
|
189
|
-
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
190
|
-
|
|
191
|
-
if [[ $ERRORS -eq 0 ]] && [[ $WARNINGS -eq 0 ]]; then
|
|
192
|
-
printf '%b\n' "${GREEN}✅ PERFECT: CI configuration fully compliant${NC}"
|
|
193
|
-
echo " - Zero-warning policy properly enforced"
|
|
194
|
-
echo " - All security gates configured"
|
|
195
|
-
echo " - Performance monitoring active"
|
|
196
|
-
echo " - Ready for branch protection"
|
|
197
|
-
elif [[ $ERRORS -eq 0 ]]; then
|
|
198
|
-
printf '%b\n' "${YELLOW}⚠️ GOOD: CI mostly compliant with $WARNINGS warning(s)${NC}"
|
|
199
|
-
echo " - Core functionality working"
|
|
200
|
-
echo " - Minor improvements recommended"
|
|
201
|
-
else
|
|
202
|
-
printf '%b\n' "${RED}❌ ISSUES: CI configuration has $ERRORS error(s) and $WARNINGS warning(s)${NC}"
|
|
203
|
-
echo " - Critical fixes required before deployment"
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
echo ""
|
|
207
|
-
echo "Configuration Details:"
|
|
208
|
-
echo " - Repository: $REPO_ROOT"
|
|
209
|
-
echo " - Main CI: .github/workflows/ci.yml"
|
|
210
|
-
echo " - Nightly: .github/workflows/nightly.yml"
|
|
211
|
-
echo " - Pre-commit: config/pre-commit-config.yaml"
|
|
212
|
-
echo ""
|
|
213
|
-
echo "Next Steps:"
|
|
214
|
-
if [[ $ERRORS -gt 0 ]]; then
|
|
215
|
-
echo " 1. Fix critical errors listed above"
|
|
216
|
-
echo " 2. Re-run validation: $0"
|
|
217
|
-
fi
|
|
218
|
-
if [[ $WARNINGS -gt 0 ]]; then
|
|
219
|
-
echo " 3. Address warnings for optimal configuration"
|
|
220
|
-
fi
|
|
221
|
-
echo " 4. Configure branch protection rules per BRANCH_PROTECTION.md"
|
|
222
|
-
echo " 5. Test CI pipeline with a small PR"
|
|
223
|
-
|
|
224
|
-
exit $ERRORS
|