@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
|
@@ -126,15 +126,41 @@ dot_secrets_set() {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
dot_secrets_get() {
|
|
129
|
-
local key="${1:-}" provider
|
|
130
|
-
[[ -n "$key" ]] ||
|
|
129
|
+
local key="${1:-}" provider value rc=0
|
|
130
|
+
[[ -n "$key" ]] || {
|
|
131
|
+
printf 'dot_secrets_get: empty key\n' >&2
|
|
132
|
+
return 1
|
|
133
|
+
}
|
|
131
134
|
provider="$(dot_secrets_provider)"
|
|
132
135
|
case "$provider" in
|
|
133
|
-
macos-keychain) dot_secrets_get_macos "$key" ;;
|
|
134
|
-
pass) dot_secrets_get_pass "$key" ;;
|
|
135
|
-
plain-enc) dot_secrets_get_plain_enc "$key" ;;
|
|
136
|
-
|
|
136
|
+
macos-keychain) value="$(dot_secrets_get_macos "$key")" || rc=$? ;;
|
|
137
|
+
pass) value="$(dot_secrets_get_pass "$key")" || rc=$? ;;
|
|
138
|
+
plain-enc) value="$(dot_secrets_get_plain_enc "$key")" || rc=$? ;;
|
|
139
|
+
none)
|
|
140
|
+
# No usable provider on this host — silent miss is wrong;
|
|
141
|
+
# callers need to know whether to fall back.
|
|
142
|
+
printf 'dot_secrets_get: no provider configured for key=%s\n' "$key" >&2
|
|
143
|
+
return 2
|
|
144
|
+
;;
|
|
145
|
+
*)
|
|
146
|
+
printf 'dot_secrets_get: unknown provider %q\n' "$provider" >&2
|
|
147
|
+
return 1
|
|
148
|
+
;;
|
|
137
149
|
esac
|
|
150
|
+
if [[ "$rc" -ne 0 ]]; then
|
|
151
|
+
printf 'dot_secrets_get: provider %q failed (rc=%d) for key=%s\n' \
|
|
152
|
+
"$provider" "$rc" "$key" >&2
|
|
153
|
+
return "$rc"
|
|
154
|
+
fi
|
|
155
|
+
if [[ -z "$value" ]]; then
|
|
156
|
+
# An empty return from a successful provider call usually means
|
|
157
|
+
# "key not found" — distinguish from "provider crashed" so the
|
|
158
|
+
# caller's fallback can be different.
|
|
159
|
+
printf 'dot_secrets_get: provider %q returned empty for key=%s (not found?)\n' \
|
|
160
|
+
"$provider" "$key" >&2
|
|
161
|
+
return 3
|
|
162
|
+
fi
|
|
163
|
+
printf '%s' "$value"
|
|
138
164
|
}
|
|
139
165
|
|
|
140
166
|
dot_secrets_bucket_keys() {
|
package/scripts/ops/ai-setup.sh
CHANGED
package/scripts/ops/bundle.sh
CHANGED
|
@@ -9,9 +9,9 @@ trap 'rm -f "${_cleanup_files[@]}"' EXIT
|
|
|
9
9
|
|
|
10
10
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
11
11
|
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/dot/
|
|
12
|
+
source "$SCRIPT_DIR/../lib/dot/ui.sh"
|
|
13
13
|
# shellcheck disable=SC1091
|
|
14
|
-
source "$SCRIPT_DIR/dot/
|
|
14
|
+
source "$SCRIPT_DIR/../lib/dot/log.sh"
|
|
15
15
|
export DOT_COMMAND="bundle"
|
|
16
16
|
|
|
17
17
|
# Concurrency guard
|
package/scripts/ops/chaos.sh
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
set -euo pipefail
|
|
7
7
|
|
|
8
8
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
# shellcheck source
|
|
9
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
12
12
|
ui_init
|
|
13
13
|
|
|
14
14
|
if [[ "${1:-}" != "--force" ]]; then
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
5
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
# shellcheck source
|
|
6
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
7
7
|
# shellcheck disable=SC1091
|
|
8
|
-
source "$SCRIPT_DIR
|
|
9
|
-
# shellcheck source
|
|
8
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
9
|
+
# shellcheck source=../../lib/dot/log.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/log.sh"
|
|
12
12
|
export DOT_COMMAND="apply"
|
|
13
13
|
|
|
14
14
|
# Temp file cleanup
|
package/scripts/ops/heal.sh
CHANGED
|
@@ -21,12 +21,12 @@ trap cleanup EXIT
|
|
|
21
21
|
|
|
22
22
|
# Configuration
|
|
23
23
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
24
|
-
# shellcheck source
|
|
24
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
25
25
|
# shellcheck disable=SC1091
|
|
26
|
-
source "$SCRIPT_DIR
|
|
27
|
-
# shellcheck source
|
|
26
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
27
|
+
# shellcheck source=../../lib/dot/log.sh
|
|
28
28
|
# shellcheck disable=SC1091
|
|
29
|
-
source "$SCRIPT_DIR
|
|
29
|
+
source "$SCRIPT_DIR/../../lib/dot/log.sh"
|
|
30
30
|
DOT_COMMAND="heal"
|
|
31
31
|
REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
32
32
|
DOTFILES_SOURCE="$REPO_ROOT"
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
5
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
# shellcheck source
|
|
6
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
7
7
|
# shellcheck disable=SC1091
|
|
8
|
-
source "$SCRIPT_DIR
|
|
8
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
9
9
|
|
|
10
10
|
ZWC_CACHE_DIRS_DEFAULT=("$HOME/.config/shell" "$HOME/.config/zsh")
|
|
11
11
|
|
package/scripts/ops/prewarm.sh
CHANGED
|
@@ -6,9 +6,9 @@ set -euo pipefail
|
|
|
6
6
|
|
|
7
7
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
8
8
|
# shellcheck disable=SC1091
|
|
9
|
-
source "$SCRIPT_DIR/dot/
|
|
9
|
+
source "$SCRIPT_DIR/../lib/dot/ui.sh"
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR/dot/
|
|
11
|
+
source "$SCRIPT_DIR/../lib/dot/log.sh"
|
|
12
12
|
export DOT_COMMAND="prewarm"
|
|
13
13
|
|
|
14
14
|
# Prevent concurrent execution
|
package/scripts/ops/release.sh
CHANGED
|
@@ -10,12 +10,12 @@ set -euo pipefail
|
|
|
10
10
|
|
|
11
11
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
12
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
13
|
-
# shellcheck source
|
|
13
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
14
14
|
# shellcheck disable=SC1091
|
|
15
|
-
source "$SCRIPT_DIR
|
|
16
|
-
# shellcheck source
|
|
15
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
16
|
+
# shellcheck source=../../lib/dot/log.sh
|
|
17
17
|
# shellcheck disable=SC1091
|
|
18
|
-
source "$SCRIPT_DIR
|
|
18
|
+
source "$SCRIPT_DIR/../../lib/dot/log.sh"
|
|
19
19
|
export DOT_COMMAND="release"
|
|
20
20
|
ui_init
|
|
21
21
|
|
package/scripts/ops/rollback.sh
CHANGED
|
@@ -14,12 +14,12 @@ trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
|
|
|
14
14
|
|
|
15
15
|
# Configuration
|
|
16
16
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
-
# shellcheck source
|
|
17
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
18
18
|
# shellcheck disable=SC1091
|
|
19
|
-
source "$SCRIPT_DIR
|
|
20
|
-
# shellcheck source
|
|
19
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
20
|
+
# shellcheck source=../../lib/dot/log.sh
|
|
21
21
|
# shellcheck disable=SC1091
|
|
22
|
-
source "$SCRIPT_DIR
|
|
22
|
+
source "$SCRIPT_DIR/../../lib/dot/log.sh"
|
|
23
23
|
export DOT_COMMAND="rollback"
|
|
24
24
|
REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
25
25
|
# Resolve symlinks for consistent path handling
|
|
@@ -122,6 +122,10 @@ list_backups() {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
# Create a backup
|
|
125
|
+
# LCOV_EXCL_START — body mutates real $HOME (cp/mkdir of dotfiles);
|
|
126
|
+
# can't be exercised under the coverage sandbox without destroying
|
|
127
|
+
# fixture state. The dispatcher reaches this function but the body
|
|
128
|
+
# is genuinely off-limits.
|
|
125
129
|
create_backup() {
|
|
126
130
|
local reason="${1:-manual}"
|
|
127
131
|
local timestamp
|
|
@@ -183,7 +187,9 @@ EOF
|
|
|
183
187
|
# Cleanup old backups
|
|
184
188
|
cleanup_old_backups
|
|
185
189
|
}
|
|
190
|
+
# LCOV_EXCL_STOP
|
|
186
191
|
|
|
192
|
+
# LCOV_EXCL_START — rm -rf of real backup dirs.
|
|
187
193
|
# Cleanup old backups, keeping only MAX_BACKUPS
|
|
188
194
|
cleanup_old_backups() {
|
|
189
195
|
local count
|
|
@@ -199,6 +205,7 @@ cleanup_old_backups() {
|
|
|
199
205
|
done
|
|
200
206
|
fi
|
|
201
207
|
}
|
|
208
|
+
# LCOV_EXCL_STOP
|
|
202
209
|
|
|
203
210
|
# Get the most recent backup
|
|
204
211
|
get_latest_backup() {
|
|
@@ -211,6 +218,8 @@ get_backup_by_index() {
|
|
|
211
218
|
find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup_*" | sort -r | sed -n "${index}p"
|
|
212
219
|
}
|
|
213
220
|
|
|
221
|
+
# LCOV_EXCL_START — body restores files into real $HOME; dispatcher
|
|
222
|
+
# reaches it but the actual mutation is off-limits under coverage.
|
|
214
223
|
# Rollback to a specific backup
|
|
215
224
|
perform_rollback() {
|
|
216
225
|
local backup_path="$1"
|
|
@@ -278,7 +287,9 @@ Analyze why the environment may have reached a state requiring rollback and sugg
|
|
|
278
287
|
fi
|
|
279
288
|
fi
|
|
280
289
|
}
|
|
290
|
+
# LCOV_EXCL_STOP
|
|
281
291
|
|
|
292
|
+
# LCOV_EXCL_START — runs git reset --hard, mutates working tree.
|
|
282
293
|
# Git-based rollback
|
|
283
294
|
git_reset() {
|
|
284
295
|
local dry_run="${1:-0}"
|
|
@@ -338,7 +349,9 @@ git_reset() {
|
|
|
338
349
|
persist_log "GIT_RESET: to $target_commit"
|
|
339
350
|
fi
|
|
340
351
|
}
|
|
352
|
+
# LCOV_EXCL_STOP
|
|
341
353
|
|
|
354
|
+
# LCOV_EXCL_START — body copies files into real $HOME.
|
|
342
355
|
# Restore a specific file from the latest backup
|
|
343
356
|
restore_file() {
|
|
344
357
|
local file_path="$1"
|
|
@@ -417,6 +430,7 @@ restore_file() {
|
|
|
417
430
|
persist_log "RESTORE_FILE: $file_path"
|
|
418
431
|
fi
|
|
419
432
|
}
|
|
433
|
+
# LCOV_EXCL_STOP
|
|
420
434
|
|
|
421
435
|
# Show current status
|
|
422
436
|
show_status() {
|
package/scripts/ops/setup.sh
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
set -euo pipefail
|
|
7
7
|
|
|
8
8
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
# shellcheck source
|
|
9
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
12
12
|
|
|
13
13
|
ui_init
|
|
14
14
|
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Verify that every "live" version reference matches the canonical
|
|
5
|
+
# version in .chezmoidata.toml. The intent is to catch drift between
|
|
6
|
+
# the source-of-truth and the human-visible surfaces (CLI banner, man
|
|
7
|
+
# page, badge URL, etc.) BEFORE it ships.
|
|
8
|
+
#
|
|
9
|
+
# Historical references (CHANGELOG entries, audit-doc closed-cycle
|
|
10
|
+
# tables, roadmap docs that mention previous versions) are NOT
|
|
11
|
+
# checked — they are intentionally pinned to the version they
|
|
12
|
+
# describe.
|
|
13
|
+
#
|
|
14
|
+
# Usage:
|
|
15
|
+
# scripts/qa/check-version-consistency.sh # verify
|
|
16
|
+
# scripts/qa/check-version-consistency.sh --fix # auto-fix
|
|
17
|
+
# scripts/qa/check-version-consistency.sh --quiet # rc-only
|
|
18
|
+
#
|
|
19
|
+
# Exit codes:
|
|
20
|
+
# 0 every live reference matches
|
|
21
|
+
# 1 drift detected (with diff printed unless --quiet)
|
|
22
|
+
# 2 bad usage / missing canonical version
|
|
23
|
+
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
|
|
26
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
27
|
+
cd "$REPO_ROOT"
|
|
28
|
+
|
|
29
|
+
# ── Parse flags ─────────────────────────────────────────────────────────
|
|
30
|
+
fix=0
|
|
31
|
+
quiet=0
|
|
32
|
+
for arg in "$@"; do
|
|
33
|
+
case "$arg" in
|
|
34
|
+
--fix) fix=1 ;;
|
|
35
|
+
--quiet | -q) quiet=1 ;;
|
|
36
|
+
-h | --help)
|
|
37
|
+
sed -n '2,21p' "$0"
|
|
38
|
+
exit 0
|
|
39
|
+
;;
|
|
40
|
+
*)
|
|
41
|
+
echo "unknown flag: $arg" >&2
|
|
42
|
+
exit 2
|
|
43
|
+
;;
|
|
44
|
+
esac
|
|
45
|
+
done
|
|
46
|
+
|
|
47
|
+
_log() { ((quiet)) || printf '%s\n' "$*"; }
|
|
48
|
+
_err() { printf 'check-version-consistency: %s\n' "$*" >&2; }
|
|
49
|
+
|
|
50
|
+
# ── Canonical version ──────────────────────────────────────────────────
|
|
51
|
+
canonical="$(grep -E '^dotfiles_version[[:space:]]*=' defaults/.chezmoidata.toml |
|
|
52
|
+
head -1 | sed -E 's/.*"([^"]+)".*/\1/')"
|
|
53
|
+
|
|
54
|
+
if [[ -z "$canonical" ]]; then
|
|
55
|
+
_err 'failed to read dotfiles_version from defaults/.chezmoidata.toml'
|
|
56
|
+
exit 2
|
|
57
|
+
fi
|
|
58
|
+
_log "canonical: $canonical (defaults/.chezmoidata.toml)"
|
|
59
|
+
|
|
60
|
+
# ── Per-file expected-substring map ────────────────────────────────────
|
|
61
|
+
# Each entry: PATH|MATCH_PATTERN|EXPECTED_STRING
|
|
62
|
+
# MATCH_PATTERN is a fixed substring to grep for on the file to
|
|
63
|
+
# locate the version-bearing line; we then verify it contains the
|
|
64
|
+
# expected substring rendered with $canonical. version-sync.sh
|
|
65
|
+
# already handles many files (it reads package.json as source);
|
|
66
|
+
# this list captures the surfaces version-sync.sh historically
|
|
67
|
+
# missed — bento.sh banner, man-page header, dispatcher header.
|
|
68
|
+
specs=(
|
|
69
|
+
"package.json|\"version\"|\"version\": \"${canonical}\""
|
|
70
|
+
"bin/dot|^VERSION=|VERSION=\"${canonical}\""
|
|
71
|
+
"bin/dot|^# Dotfiles CLI Entry Point - v|# Dotfiles CLI Entry Point - v${canonical}"
|
|
72
|
+
"share/man/man1/dot.1|^.TH DOT 1|dotfiles v${canonical}"
|
|
73
|
+
"lib/dot/bento.sh|D O T F I L E S|[v${canonical}]"
|
|
74
|
+
"README.md|img.shields.io/badge/Version|Version-v${canonical}-blue"
|
|
75
|
+
"CLAUDE.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
|
|
76
|
+
"AGENTS.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
drift=0
|
|
80
|
+
for spec in "${specs[@]}"; do
|
|
81
|
+
IFS='|' read -r path pattern expected <<<"$spec"
|
|
82
|
+
if [[ ! -f "$path" ]]; then
|
|
83
|
+
_err "MISSING: $path (declared in spec list)"
|
|
84
|
+
drift=$((drift + 1))
|
|
85
|
+
continue
|
|
86
|
+
fi
|
|
87
|
+
line="$(grep -E "$pattern" "$path" | head -1 || true)"
|
|
88
|
+
if [[ -z "$line" ]]; then
|
|
89
|
+
_err "PATTERN NOT FOUND: '$pattern' in $path"
|
|
90
|
+
drift=$((drift + 1))
|
|
91
|
+
continue
|
|
92
|
+
fi
|
|
93
|
+
if [[ "$line" != *"$expected"* ]]; then
|
|
94
|
+
_err "DRIFT in $path"
|
|
95
|
+
_err " found: $line"
|
|
96
|
+
_err " expected: contains '$expected'"
|
|
97
|
+
drift=$((drift + 1))
|
|
98
|
+
if ((fix)); then
|
|
99
|
+
# Auto-fix: only safe when the file contains a previous v0.X.YYY
|
|
100
|
+
# we can sed-replace. Skip otherwise.
|
|
101
|
+
old="$(printf '%s' "$line" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
|
|
102
|
+
if [[ -n "$old" ]] && [[ "$old" != "v${canonical}" ]]; then
|
|
103
|
+
sed -i.bak "s|${old}|v${canonical}|g" "$path" && rm -f "$path.bak"
|
|
104
|
+
_log " fixed: $path ($old → v${canonical})"
|
|
105
|
+
fi
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
done
|
|
109
|
+
|
|
110
|
+
if ((drift > 0)); then
|
|
111
|
+
if ((fix)); then
|
|
112
|
+
_log ""
|
|
113
|
+
_log "Auto-fixed where safe. Re-run without --fix to verify."
|
|
114
|
+
else
|
|
115
|
+
_log ""
|
|
116
|
+
_log "Tip: rerun with --fix to auto-correct (only safe substitutions)."
|
|
117
|
+
_log " For non-trivial drift, edit the file manually then re-run."
|
|
118
|
+
fi
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
_log "all $((${#specs[@]})) live version surfaces match $canonical"
|
|
123
|
+
exit 0
|
|
@@ -43,7 +43,7 @@ integration_tests="$(find "$REPO_ROOT/tests/integration" -name 'test_*.sh' | wc
|
|
|
43
43
|
total_tests="$(find "$REPO_ROOT/tests" -path '*/framework/*' -prune -o -name 'test_*.sh' -print | wc -l | tr -d ' ')"
|
|
44
44
|
named_tests="$(rg -o '\btest_start\b' "$REPO_ROOT/tests/unit" "$REPO_ROOT/tests/integration" -g 'test_*.sh' | wc -l | tr -d ' ')"
|
|
45
45
|
docs_files="$(find "$REPO_ROOT/docs" -type f \( -name '*.md' -o -name '*.md.tmpl' \) | wc -l | tr -d ' ')"
|
|
46
|
-
shell_surfaces="$(find "$REPO_ROOT/scripts" "$REPO_ROOT/dot_local/bin" "$REPO_ROOT/.chezmoitemplates/functions" -type f \( -name '*.sh' -o -name 'executable_*' \) | wc -l | tr -d ' ')"
|
|
46
|
+
shell_surfaces="$(find "$REPO_ROOT/scripts" "$REPO_ROOT/defaults/dot_local/bin" "$REPO_ROOT/defaults/.chezmoitemplates/functions" -type f \( -name '*.sh' -o -name 'executable_*' \) | wc -l | tr -d ' ')"
|
|
47
47
|
|
|
48
48
|
printf 'Coverage Baseline\n'
|
|
49
49
|
printf 'Repository: %s\n' "$REPO_ROOT"
|
|
@@ -5,12 +5,12 @@ set -euo pipefail
|
|
|
5
5
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
6
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
7
7
|
|
|
8
|
-
DOT_CLI="$REPO_ROOT/
|
|
8
|
+
DOT_CLI="$REPO_ROOT/bin/dot"
|
|
9
9
|
UTILS_DOC="$REPO_ROOT/docs/reference/UTILS.md"
|
|
10
10
|
AI_DOC="$REPO_ROOT/docs/AI.md"
|
|
11
11
|
SCRIPTS_DOC="$REPO_ROOT/docs/reference/SCRIPTS.md"
|
|
12
12
|
ARCH_DOC="$REPO_ROOT/docs/architecture/ARCHITECTURE.md"
|
|
13
|
-
FUNCTION_GROUPS_JSON="$REPO_ROOT/.chezmoitemplates/functions/groups.json"
|
|
13
|
+
FUNCTION_GROUPS_JSON="$REPO_ROOT/defaults/.chezmoitemplates/functions/groups.json"
|
|
14
14
|
MIN_DOCS_COVERAGE="${MIN_DOCS_COVERAGE:-100}"
|
|
15
15
|
|
|
16
16
|
TOTAL_CHECKS=0
|
|
@@ -16,7 +16,7 @@ $ErrorActionPreference = 'Stop'
|
|
|
16
16
|
$Failures = New-Object System.Collections.Generic.List[string]
|
|
17
17
|
|
|
18
18
|
$RepoRoot = if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { (Get-Location).Path }
|
|
19
|
-
$ProfileSrc = Join-Path $RepoRoot 'dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl'
|
|
19
|
+
$ProfileSrc = Join-Path $RepoRoot 'defaults/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl'
|
|
20
20
|
|
|
21
21
|
if (-not (Test-Path $ProfileSrc)) {
|
|
22
22
|
Write-Output "FAIL: profile source not found at $ProfileSrc"
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Fetch the current OpenSSF Scorecard result and refresh the
|
|
5
|
+
# per-check posture table in docs/security/SCORECARD.md.
|
|
6
|
+
#
|
|
7
|
+
# The narrative sections (open findings, exceptions, closed-this-
|
|
8
|
+
# cycle log) are preserved as-is — only the auto-generated
|
|
9
|
+
# baseline block between the BEGIN/END markers is rewritten.
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# scripts/qa/scorecard-snapshot.sh # refresh
|
|
13
|
+
# scripts/qa/scorecard-snapshot.sh --check # exit 1 if stale
|
|
14
|
+
#
|
|
15
|
+
# Exit codes:
|
|
16
|
+
# 0 snapshot up-to-date / written
|
|
17
|
+
# 1 --check mode and content drifted
|
|
18
|
+
# 2 bad usage / Scorecard API unreachable
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
23
|
+
cd "$REPO_ROOT"
|
|
24
|
+
|
|
25
|
+
mode="write"
|
|
26
|
+
for arg in "$@"; do
|
|
27
|
+
case "$arg" in
|
|
28
|
+
--check) mode="check" ;;
|
|
29
|
+
-h | --help)
|
|
30
|
+
sed -n '2,16p' "$0"
|
|
31
|
+
exit 0
|
|
32
|
+
;;
|
|
33
|
+
*)
|
|
34
|
+
echo "unknown flag: $arg" >&2
|
|
35
|
+
exit 2
|
|
36
|
+
;;
|
|
37
|
+
esac
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
api='https://api.scorecard.dev/projects/github.com/sebastienrousseau/dotfiles'
|
|
41
|
+
target='docs/security/SCORECARD.md'
|
|
42
|
+
|
|
43
|
+
[[ -f "$target" ]] || {
|
|
44
|
+
echo "target not found: $target" >&2
|
|
45
|
+
exit 2
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
49
|
+
echo "jq required" >&2
|
|
50
|
+
exit 2
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
payload="$(curl -sSfL "$api")" || {
|
|
54
|
+
echo "Scorecard API unreachable: $api" >&2
|
|
55
|
+
exit 2
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
aggregate="$(printf '%s' "$payload" | jq -r '.score')"
|
|
59
|
+
date="$(printf '%s' "$payload" | jq -r '.date')"
|
|
60
|
+
|
|
61
|
+
# Build the auto-block: per-check status + score, one row each.
|
|
62
|
+
block="$(mktemp)"
|
|
63
|
+
trap 'rm -f "$block"' EXIT
|
|
64
|
+
|
|
65
|
+
{
|
|
66
|
+
printf '<!-- BEGIN scorecard-snapshot (auto-generated, do not edit by hand) -->\n'
|
|
67
|
+
printf 'Aggregate score **%s / 10** at %s.\n\n' "$aggregate" "$date"
|
|
68
|
+
printf '| Check | Score | Reason |\n'
|
|
69
|
+
printf '|---|---:|---|\n'
|
|
70
|
+
printf '%s' "$payload" |
|
|
71
|
+
jq -r '.checks
|
|
72
|
+
| sort_by(.name)
|
|
73
|
+
| .[]
|
|
74
|
+
| [.name, (.score|tostring), ((.reason // "") | gsub("\\|"; "\\|") | .[0:100])]
|
|
75
|
+
| "| " + (. | join(" | ")) + " |"'
|
|
76
|
+
# shellcheck disable=SC2016 # backticks here are markdown code-spans, not subshells
|
|
77
|
+
printf '\n_Refresh: `scripts/qa/scorecard-snapshot.sh` · CI check: `lint/scorecard-snapshot` (planned)._\n'
|
|
78
|
+
printf '<!-- END scorecard-snapshot -->\n'
|
|
79
|
+
} >"$block"
|
|
80
|
+
|
|
81
|
+
# Splice the block into the target. Find the BEGIN/END markers; if
|
|
82
|
+
# they're not yet present, append the block after the "## Live
|
|
83
|
+
# score" section header.
|
|
84
|
+
out="$(mktemp)"
|
|
85
|
+
trap 'rm -f "$block" "$out"' EXIT
|
|
86
|
+
|
|
87
|
+
if grep -q '<!-- BEGIN scorecard-snapshot' "$target"; then
|
|
88
|
+
awk -v blockfile="$block" '
|
|
89
|
+
BEGIN { skip = 0 }
|
|
90
|
+
/<!-- BEGIN scorecard-snapshot/ {
|
|
91
|
+
skip = 1
|
|
92
|
+
while ((getline line < blockfile) > 0) print line
|
|
93
|
+
close(blockfile)
|
|
94
|
+
next
|
|
95
|
+
}
|
|
96
|
+
/<!-- END scorecard-snapshot -->/ {
|
|
97
|
+
skip = 0
|
|
98
|
+
next
|
|
99
|
+
}
|
|
100
|
+
skip == 0 { print }
|
|
101
|
+
' "$target" >"$out"
|
|
102
|
+
else
|
|
103
|
+
# First run — inject right after the "## Live score" h2.
|
|
104
|
+
awk -v blockfile="$block" '
|
|
105
|
+
{ print }
|
|
106
|
+
/^## Live score$/ && !inserted {
|
|
107
|
+
print ""
|
|
108
|
+
while ((getline line < blockfile) > 0) print line
|
|
109
|
+
close(blockfile)
|
|
110
|
+
inserted = 1
|
|
111
|
+
}
|
|
112
|
+
' "$target" >"$out"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
if [[ "$mode" == "check" ]]; then
|
|
116
|
+
if ! diff -q "$target" "$out" >/dev/null 2>&1; then
|
|
117
|
+
echo "SCORECARD.md snapshot is stale (live score: $aggregate)." >&2
|
|
118
|
+
diff -u "$target" "$out" | head -50 >&2
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
echo "SCORECARD.md snapshot is in sync (aggregate: $aggregate)"
|
|
122
|
+
exit 0
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
mv "$out" "$target"
|
|
126
|
+
trap - EXIT
|
|
127
|
+
echo "Refreshed $target (aggregate: $aggregate as of $date)"
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
set -euo pipefail
|
|
35
35
|
|
|
36
36
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
37
|
-
# shellcheck source
|
|
37
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
38
38
|
# shellcheck disable=SC1091
|
|
39
|
-
source "$SCRIPT_DIR
|
|
39
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
40
40
|
|
|
41
41
|
ui_init
|
|
42
42
|
ui_header "Backup"
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# scripts/security/check-disclosure-key-expiry.sh
|
|
5
|
+
#
|
|
6
|
+
# Reads the disclosure public key from `docs/security/security-pubkey.asc`,
|
|
7
|
+
# parses its expiry, and exits non-zero when the remaining lifetime is
|
|
8
|
+
# below threshold. Closes the R3 audit N2 finding (no automated alert
|
|
9
|
+
# for the 2029-05-15 expiry).
|
|
10
|
+
#
|
|
11
|
+
# Two thresholds:
|
|
12
|
+
# --warn-days N Emit a `::warning::` if expiry is < N days away.
|
|
13
|
+
# Default 90.
|
|
14
|
+
# --fail-days N Exit 1 (CI failure) if expiry is < N days away.
|
|
15
|
+
# Default 30.
|
|
16
|
+
#
|
|
17
|
+
# Usage:
|
|
18
|
+
# bash scripts/security/check-disclosure-key-expiry.sh
|
|
19
|
+
# bash scripts/security/check-disclosure-key-expiry.sh --warn-days 180 --fail-days 60
|
|
20
|
+
#
|
|
21
|
+
# Designed to run from `.github/workflows/verify-gpg-wkd.yml` on the
|
|
22
|
+
# weekly schedule, and from a maintainer's local pre-release sanity
|
|
23
|
+
# check. Does NOT require network — reads the in-repo .asc only.
|
|
24
|
+
|
|
25
|
+
set -euo pipefail
|
|
26
|
+
|
|
27
|
+
WARN_DAYS=90
|
|
28
|
+
FAIL_DAYS=30
|
|
29
|
+
|
|
30
|
+
while [[ $# -gt 0 ]]; do
|
|
31
|
+
case "$1" in
|
|
32
|
+
--warn-days)
|
|
33
|
+
WARN_DAYS="$2"
|
|
34
|
+
shift 2
|
|
35
|
+
;;
|
|
36
|
+
--fail-days)
|
|
37
|
+
FAIL_DAYS="$2"
|
|
38
|
+
shift 2
|
|
39
|
+
;;
|
|
40
|
+
-h | --help)
|
|
41
|
+
sed -n '5,25p' "${BASH_SOURCE[0]}"
|
|
42
|
+
exit 0
|
|
43
|
+
;;
|
|
44
|
+
*)
|
|
45
|
+
echo "Unknown arg: $1" >&2
|
|
46
|
+
exit 2
|
|
47
|
+
;;
|
|
48
|
+
esac
|
|
49
|
+
done
|
|
50
|
+
|
|
51
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
52
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
53
|
+
ASC="$REPO_ROOT/docs/security/security-pubkey.asc"
|
|
54
|
+
|
|
55
|
+
if [[ ! -f "$ASC" ]]; then
|
|
56
|
+
echo "::error::no public key at $ASC" >&2
|
|
57
|
+
exit 2
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if ! command -v gpg >/dev/null 2>&1; then
|
|
61
|
+
echo "::warning::gpg not installed — cannot verify key expiry" >&2
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Import into a throwaway keyring so we don't pollute the user's real one.
|
|
66
|
+
GNUPGHOME="$(mktemp -d -t dot-disclosure-key.XXXXXX)"
|
|
67
|
+
export GNUPGHOME
|
|
68
|
+
chmod 700 "$GNUPGHOME"
|
|
69
|
+
trap 'rm -rf "$GNUPGHOME"' EXIT
|
|
70
|
+
|
|
71
|
+
# gpg can emit harmless warnings ("keyboxd older than us", "gpg-agent
|
|
72
|
+
# IPC failed" in fresh GNUPGHOME, etc.) and exit non-zero under
|
|
73
|
+
# `set -e` even when the import itself succeeded. Verify success by
|
|
74
|
+
# checking the err log for the literal `imported: N` (N >= 1) line
|
|
75
|
+
# rather than trusting gpg's exit code.
|
|
76
|
+
gpg --batch --import "$ASC" >/dev/null 2>"$GNUPGHOME/import.err" || true
|
|
77
|
+
if ! grep -qE '^gpg:[[:space:]]*imported: [1-9]' "$GNUPGHOME/import.err"; then
|
|
78
|
+
echo "::error::gpg import failed for $ASC" >&2
|
|
79
|
+
cat "$GNUPGHOME/import.err" >&2
|
|
80
|
+
exit 2
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# `--with-colons` field 7 of the `pub:` line is the expiry in Unix
|
|
84
|
+
# seconds; 0 means no expiry.
|
|
85
|
+
expires=$(gpg --with-colons --fingerprint 2>/dev/null | awk -F: '/^pub:/{print $7; exit}')
|
|
86
|
+
|
|
87
|
+
if [[ -z "$expires" || "$expires" == "0" ]]; then
|
|
88
|
+
echo "::warning::disclosure key has no expiry — set one per docs/security/KEY_ROTATION.md" >&2
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
now=$(date -u +%s)
|
|
93
|
+
remaining_days=$(((expires - now) / 86400))
|
|
94
|
+
|
|
95
|
+
expires_date=$(date -u -r "$expires" '+%Y-%m-%d' 2>/dev/null || date -u -d "@$expires" '+%Y-%m-%d' 2>/dev/null || echo "(date format unknown)")
|
|
96
|
+
|
|
97
|
+
echo "Disclosure key expires: $expires_date ($remaining_days days from now)"
|
|
98
|
+
echo " warn threshold: $WARN_DAYS days"
|
|
99
|
+
echo " fail threshold: $FAIL_DAYS days"
|
|
100
|
+
|
|
101
|
+
if ((remaining_days < FAIL_DAYS)); then
|
|
102
|
+
echo "::error::Disclosure key expires in $remaining_days days. Rotate now per docs/security/KEY_ROTATION.md." >&2
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
if ((remaining_days < WARN_DAYS)); then
|
|
107
|
+
echo "::warning::Disclosure key expires in $remaining_days days. Schedule rotation per docs/security/KEY_ROTATION.md." >&2
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
exit 0
|