@sebastienrousseau/dotfiles 0.2.502 → 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 +83 -9
- package/LICENSE +21 -1283
- package/README.md +5 -3
- package/docs/CONFIG_STRATEGY.md +124 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/GOVERNANCE.md +98 -0
- package/docs/MAINTAINERS.md +41 -0
- package/docs/OPENCODE.md +127 -0
- package/docs/README.md +2 -0
- package/docs/STRUCTURE.md +102 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
- package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
- package/docs/architecture/REPO_LAYOUT.md +8 -8
- package/docs/archive/MILESTONE_v0.2.493.md +1 -1
- package/docs/index.md +2 -2
- package/docs/interop/POWERSHELL.md +1 -1
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/01-concepts/02-trust-model.md +1 -1
- package/docs/manual/03-reference/02-config-files.md +2 -2
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +72 -59
- package/docs/operations/CI_COMPOSITES.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +5 -5
- package/docs/operations/HARD_AUDIT_2026.md +11 -11
- package/docs/operations/MAINTENANCE.md +3 -3
- package/docs/operations/MANIFEST.md +127 -0
- package/docs/operations/RELEASE_PIPELINE.md +130 -0
- package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
- package/docs/operations/ROADMAP_2026.md +6 -6
- package/docs/operations/ROADMAP_V0_2_503.md +134 -0
- package/docs/operations/TESTING.md +17 -0
- package/docs/operations/TRACEABILITY.md +6 -3
- package/docs/operations/VERSION_SYNC.md +4 -4
- package/docs/reference/POWERSHELL_PARITY.md +8 -7
- package/docs/schema/dot-env-v1.json +110 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
- package/docs/security/CI_PINNING.md +17 -9
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
- package/docs/security/FUZZING.md +114 -0
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/POLICY_RELEASES.md +2 -2
- package/docs/security/SCORECARD.md +58 -3
- package/docs/security/SHELL_EXEMPTIONS.md +4 -4
- package/docs/security/VERIFY_RELEASE.md +201 -0
- package/install.sh +27 -5
- package/package.json +1 -1
- package/scripts/README.md +123 -0
- package/scripts/ci/check-copyright-headers.sh +4 -93
- package/scripts/ci/check-shell-preamble.sh +4 -103
- package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
- package/scripts/diagnostics/a2a-conformance.sh +4 -4
- package/scripts/diagnostics/alias-governance.sh +1 -1
- package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
- package/scripts/diagnostics/benchmark.sh +4 -4
- package/scripts/diagnostics/conflicts.sh +2 -2
- package/scripts/diagnostics/doctor-unified.sh +2 -2
- package/scripts/diagnostics/doctor.sh +10 -10
- package/scripts/diagnostics/drift-dashboard.sh +2 -2
- package/scripts/diagnostics/health.sh +4 -4
- package/scripts/diagnostics/history-analysis.sh +2 -2
- package/scripts/diagnostics/mcp-doctor.sh +10 -7
- package/scripts/diagnostics/perf.sh +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 +8 -0
- package/scripts/dot/commands/agents.sh +14 -4
- package/scripts/dot/commands/ai.sh +144 -25
- package/scripts/dot/commands/appearance.sh +2 -2
- package/scripts/dot/commands/core.sh +2 -2
- package/scripts/dot/commands/diagnostics.sh +5 -5
- package/scripts/dot/commands/env-emit.sh +202 -0
- package/scripts/dot/commands/fleet.sh +12 -11
- package/scripts/dot/commands/init.sh +4 -4
- package/scripts/dot/commands/lint.sh +9 -4
- package/scripts/dot/commands/manual.sh +3 -3
- package/scripts/dot/commands/meta.sh +12 -6
- package/scripts/dot/commands/patterns.sh +2 -2
- package/scripts/dot/commands/registry.sh +4 -4
- package/scripts/dot/commands/restore.sh +4 -4
- package/scripts/dot/commands/secrets.sh +4 -3
- package/scripts/dot/commands/security.sh +2 -2
- package/scripts/dot/commands/tools.sh +13 -3
- package/scripts/dot/powershell/Dot.psm1 +199 -0
- package/scripts/fonts/install-nerd-fonts.sh +2 -2
- package/scripts/git-hooks/pre-commit-audit.sh +2 -2
- package/scripts/git-hooks/pre-push +13 -0
- 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 +4 -4
- package/scripts/ops/setup.sh +2 -2
- package/scripts/qa/check-version-consistency.sh +123 -0
- package/scripts/qa/coverage-baseline.sh +1 -1
- package/scripts/qa/docs-coverage.sh +2 -2
- package/scripts/qa/powershell-contract.ps1 +1 -1
- package/scripts/qa/scorecard-snapshot.sh +127 -0
- package/scripts/security/backup.sh +2 -2
- package/scripts/security/dns-doh.sh +4 -4
- package/scripts/security/encryption-check.sh +4 -4
- package/scripts/security/enforce-policies.sh +2 -2
- package/scripts/security/firewall.sh +4 -4
- package/scripts/security/lock-screen.sh +4 -4
- package/scripts/security/manage-secrets.sh +2 -2
- package/scripts/security/ssh-cert.sh +2 -2
- package/scripts/security/telemetry-kill.sh +4 -4
- package/scripts/security/usb-safety.sh +4 -4
- package/scripts/theme/extract-heic-frames.sh +114 -0
- package/scripts/theme/rebuild-themes.sh +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 +55 -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/direnv.fish +0 -4
- package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
- package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
- package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
- package/dot_config/fish/conf.d/mise-activate.fish +0 -5
- package/dot_config/fish/config.fish.tmpl +0 -44
- package/dot_config/fish/fish_plugins +0 -1
- package/dot_config/fish/functions/_.fish +0 -3
- package/dot_config/fish/functions/_cached_eval.fish +0 -131
- package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
- package/dot_config/fish/functions/als.fish +0 -46
- package/dot_config/fish/functions/bg-upgrade.fish +0 -7
- package/dot_config/fish/functions/c.fish +0 -3
- package/dot_config/fish/functions/cat.fish +0 -9
- package/dot_config/fish/functions/d.fish +0 -7
- package/dot_config/fish/functions/dot.fish +0 -34
- package/dot_config/fish/functions/h.fish +0 -3
- package/dot_config/fish/functions/l.fish +0 -7
- package/dot_config/fish/functions/la.fish +0 -7
- package/dot_config/fish/functions/ll.fish +0 -7
- package/dot_config/fish/functions/log_error.fish +0 -13
- package/dot_config/fish/functions/log_info.fish +0 -13
- package/dot_config/fish/functions/lr.fish +0 -7
- package/dot_config/fish/functions/lra.fish +0 -7
- package/dot_config/fish/functions/ls.fish +0 -7
- package/dot_config/fish/functions/lt.fish +0 -7
- package/dot_config/fish/functions/lta.fish +0 -7
- package/dot_config/fish/functions/notify-run.fish +0 -11
- package/dot_config/fish/functions/q.fish +0 -3
- package/dot_config/fish/functions/silent-run.fish +0 -7
- package/dot_config/fish/functions/yy.fish +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
- package/dot_config/foot/foot.ini.tmpl +0 -33
- package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
- package/dot_config/fzf/fzf.zsh +0 -48
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -165
- package/dot_config/git/allowed_signers.tmpl +0 -18
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/commit-template +0 -10
- package/dot_config/git/hooks/executable_commit-msg +0 -146
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf +0 -11
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py +0 -19
- package/dot_config/just/justfile +0 -122
- package/dot_config/k9s/config.yaml +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/kanshi/config.tmpl +0 -22
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -53
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -35
- package/dot_config/mako/config +0 -47
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/micro/settings.json +0 -3
- package/dot_config/mimeapps.list +0 -77
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -99
- package/dot_config/mongosh/mongoshrc.js +0 -68
- package/dot_config/mpv/input.conf +0 -47
- package/dot_config/mpv/mpv.conf +0 -47
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/niri/config.kdl.tmpl +0 -327
- package/dot_config/nushell/aliases.nu +0 -18
- package/dot_config/nushell/cached_eval.nu +0 -80
- package/dot_config/nushell/completions.nu.tmpl +0 -52
- package/dot_config/nushell/config.nu.tmpl +0 -86
- package/dot_config/nushell/env.nu.tmpl +0 -102
- package/dot_config/nushell/functions.nu.tmpl +0 -17
- package/dot_config/nvim/init.lua +0 -18
- package/dot_config/nvim/lazy-lock.json +0 -58
- package/dot_config/nvim/lua/config/autocmds.lua +0 -107
- package/dot_config/nvim/lua/config/keymaps.lua +0 -92
- package/dot_config/nvim/lua/config/lazy.lua +0 -44
- package/dot_config/nvim/lua/config/options.lua +0 -49
- package/dot_config/nvim/lua/plugins/ai.lua +0 -75
- package/dot_config/nvim/lua/plugins/coding.lua +0 -216
- package/dot_config/nvim/lua/plugins/completion.lua +0 -60
- package/dot_config/nvim/lua/plugins/dap.lua +0 -412
- package/dot_config/nvim/lua/plugins/editor.lua +0 -55
- package/dot_config/nvim/lua/plugins/git.lua +0 -10
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
- package/dot_config/nvim/lua/plugins/rust.lua +0 -34
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
- package/dot_config/nvim/lua/plugins/ui.lua +0 -509
- package/dot_config/paru/paru.conf +0 -10
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
- package/dot_config/pueue/pueue.yml +0 -34
- package/dot_config/pypoetry/config.toml +0 -6
- package/dot_config/pyrightconfig.json +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/ripgrep/ripgreprc +0 -21
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
- package/dot_config/shell/05-core-safety.sh +0 -48
- package/dot_config/shell/10-secrets.sh +0 -41
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
- package/dot_config/shell/40-ls-colors.sh +0 -49
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -127
- package/dot_config/shell/README.md +0 -284
- package/dot_config/shell/als_data.txt.tmpl +0 -65
- package/dot_config/shell/custom/auto_ls.zsh +0 -20
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -202
- package/dot_config/swaylock/config +0 -43
- package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
- package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
- package/dot_config/systemd/user/pueued.service +0 -12
- package/dot_config/systemd/user/ssh-agent.service +0 -12
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -223
- package/dot_config/topgrade.toml.tmpl +0 -54
- package/dot_config/user-dirs.dirs +0 -10
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -82
- package/dot_config/waybar/config.jsonc.tmpl +0 -90
- package/dot_config/waybar/style.css.tmpl +0 -211
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
- package/dot_config/yarn/yarnrc.yml +0 -36
- package/dot_config/yazi/keymap.toml +0 -67
- package/dot_config/yazi/theme.toml +0 -102
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zathura/zathurarc +0 -52
- package/dot_config/zellij/config.kdl.tmpl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -7
- package/dot_config/zsh/dot_zshenv +0 -5
- package/dot_config/zsh/dot_zshrc.tmpl +0 -688
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
- package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
- package/dot_local/bin/executable_ai-update +0 -195
- package/dot_local/bin/executable_ai_core +0 -152
- package/dot_local/bin/executable_antigravity +0 -11
- package/dot_local/bin/executable_b64 +0 -84
- package/dot_local/bin/executable_bm +0 -79
- package/dot_local/bin/executable_cb +0 -39
- package/dot_local/bin/executable_dot +0 -636
- package/dot_local/bin/executable_dot-ai +0 -36
- package/dot_local/bin/executable_dot-bootstrap +0 -76
- package/dot_local/bin/executable_dot-launch-or-focus +0 -52
- package/dot_local/bin/executable_dot-load-benchmark +0 -31
- package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
- package/dot_local/bin/executable_dot-theme-sync +0 -952
- package/dot_local/bin/executable_dot_completion +0 -57
- package/dot_local/bin/executable_dtags +0 -28
- package/dot_local/bin/executable_epoch +0 -67
- package/dot_local/bin/executable_extract +0 -41
- package/dot_local/bin/executable_gbd +0 -52
- package/dot_local/bin/executable_gd +0 -42
- package/dot_local/bin/executable_git-ai-commit +0 -175
- package/dot_local/bin/executable_git-ai-diff +0 -169
- package/dot_local/bin/executable_gl +0 -101
- package/dot_local/bin/executable_hash +0 -161
- package/dot_local/bin/executable_hashsum +0 -160
- package/dot_local/bin/executable_hex +0 -115
- package/dot_local/bin/executable_jsonv +0 -78
- package/dot_local/bin/executable_jwt +0 -94
- package/dot_local/bin/executable_kill-port +0 -75
- package/dot_local/bin/executable_lorem +0 -118
- package/dot_local/bin/executable_mkscript +0 -35
- package/dot_local/bin/executable_monitor +0 -56
- package/dot_local/bin/executable_myip +0 -51
- package/dot_local/bin/executable_notify +0 -24
- package/dot_local/bin/executable_open +0 -38
- package/dot_local/bin/executable_pw +0 -27
- package/dot_local/bin/executable_rec-start +0 -46
- package/dot_local/bin/executable_rec-stop +0 -35
- package/dot_local/bin/executable_regex +0 -132
- package/dot_local/bin/executable_start-niri +0 -8
- package/dot_local/bin/executable_tmux-sessionizer +0 -314
- package/dot_local/bin/executable_tour +0 -177
- package/dot_local/bin/executable_up +0 -23
- package/dot_local/bin/executable_update +0 -142
- package/dot_local/bin/executable_uuid +0 -87
- package/dot_local/bin/executable_win +0 -32
- package/dot_local/bin/executable_yamlv +0 -57
- package/dot_local/share/bash-completion/completions/dot +0 -72
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +0 -149
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +0 -287
- package/scripts/ci/check-dangerous-chmod.sh +0 -19
- package/scripts/ci/check-deps-dev.sh +0 -236
- package/scripts/ci/check-insecure-tls.sh +0 -61
- package/scripts/ci/check-regression-traceability.sh +0 -67
- package/scripts/ci/dot-cli-startup-bench.sh +0 -126
- package/scripts/ci/install-chezmoi-verified.sh +0 -67
- package/scripts/ci/lint-reusable-pins.sh +0 -78
- package/scripts/ci/run-coverage.sh +0 -451
- package/scripts/ci/validate-chezmoidata.sh +0 -25
- package/scripts/ci/validate-ci-config.sh +0 -224
- package/scripts/ci/windows-smoke-test.ps1 +0 -136
- package/scripts/docs/build-manual.sh +0 -883
- package/scripts/docs/check-manual.sh +0 -213
- package/scripts/dot/lib/bento.sh +0 -50
- package/scripts/dot/lib/log.sh +0 -200
- package/scripts/dot/lib/platform.sh +0 -112
- package/scripts/dot/lib/ui.sh +0 -650
- package/scripts/dot/lib/utils.sh +0 -377
- package/scripts/maintenance/check-updates.sh +0 -131
- package/scripts/release/package-policy-bundles.sh +0 -125
|
@@ -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"
|
|
@@ -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/platform.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
12
12
|
|
|
13
13
|
DRY_RUN=0
|
|
14
14
|
for arg in "$@"; do
|
|
@@ -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/platform.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
12
12
|
|
|
13
13
|
ui_init
|
|
14
14
|
ui_header "Encryption Check"
|
|
@@ -13,9 +13,9 @@ readonly REPO_ROOT
|
|
|
13
13
|
readonly POLICIES_DIR="${REPO_ROOT}/.github/security-policies"
|
|
14
14
|
readonly LOG_FILE="${REPO_ROOT}/.security-audit.log"
|
|
15
15
|
|
|
16
|
-
# shellcheck source
|
|
16
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
17
17
|
# shellcheck disable=SC1091
|
|
18
|
-
source "${SCRIPT_DIR}
|
|
18
|
+
source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
|
|
19
19
|
ui_init
|
|
20
20
|
|
|
21
21
|
# Logging function (also writes to log file)
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
set -euo pipefail
|
|
38
38
|
|
|
39
39
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
40
|
-
# shellcheck source
|
|
40
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
41
41
|
# shellcheck disable=SC1091
|
|
42
|
-
source "$SCRIPT_DIR
|
|
43
|
-
# shellcheck source
|
|
42
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
43
|
+
# shellcheck source=../../lib/dot/platform.sh
|
|
44
44
|
# shellcheck disable=SC1091
|
|
45
|
-
source "$SCRIPT_DIR
|
|
45
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
46
46
|
|
|
47
47
|
DRY_RUN=0
|
|
48
48
|
for arg in "$@"; do
|
|
@@ -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/platform.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
12
12
|
|
|
13
13
|
DRY_RUN=0
|
|
14
14
|
for arg in "$@"; do
|
|
@@ -39,9 +39,9 @@ readonly REPO_ROOT
|
|
|
39
39
|
readonly ENV_TEMPLATE="${REPO_ROOT}/.github/security-policies/environment-template.env"
|
|
40
40
|
readonly ENV_LOCAL="${REPO_ROOT}/.env.local"
|
|
41
41
|
|
|
42
|
-
# shellcheck source
|
|
42
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
43
43
|
# shellcheck disable=SC1091
|
|
44
|
-
source "${SCRIPT_DIR}
|
|
44
|
+
source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
|
|
45
45
|
ui_init
|
|
46
46
|
|
|
47
47
|
# Help text
|
|
@@ -27,9 +27,9 @@ CA_PROVISIONER="${SSH_CERT_CA_PROVISIONER:-}"
|
|
|
27
27
|
# ---------- helpers -------------------------------------------------------- #
|
|
28
28
|
|
|
29
29
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
30
|
-
# shellcheck source
|
|
30
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
31
31
|
# shellcheck disable=SC1091
|
|
32
|
-
source "$SCRIPT_DIR
|
|
32
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
33
33
|
ui_init
|
|
34
34
|
|
|
35
35
|
info() { ui_info "ssh-cert" "$*"; }
|
|
@@ -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/platform.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
12
12
|
|
|
13
13
|
DRY_RUN=0
|
|
14
14
|
for arg in "$@"; do
|
|
@@ -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/platform.sh
|
|
10
10
|
# shellcheck disable=SC1091
|
|
11
|
-
source "$SCRIPT_DIR
|
|
11
|
+
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
12
12
|
|
|
13
13
|
DRY_RUN=0
|
|
14
14
|
for arg in "$@"; do
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# extract-heic-frames.sh — extract per-frame PNGs from dynamic HEIC wallpapers.
|
|
4
|
+
#
|
|
5
|
+
# Apple's dynamic HEIC format packs two images (frame 0 = light, frame 1 =
|
|
6
|
+
# dark) in one container. DMS's matugen worker reads the wallpaper path from
|
|
7
|
+
# ~/.local/state/DankMaterialShell/session.json and feeds it to matugen,
|
|
8
|
+
# which calls ImageMagick's heif decoder. On many systems (Arch Linux's
|
|
9
|
+
# libheif 1.23 + libde265 1.1 is one) that decoder fails to decompress
|
|
10
|
+
# Apple's dynamic HEIC with:
|
|
11
|
+
#
|
|
12
|
+
# Decoder plugin generated an error: Unspecified: Decoding the input
|
|
13
|
+
# data did not give a decompressed image.
|
|
14
|
+
#
|
|
15
|
+
# Symptom: every `dot theme <family>` for a HEIC-only family produces
|
|
16
|
+
# a matugen "Theme worker FATAL" in the dms journal and the dynamic
|
|
17
|
+
# color scheme stops regenerating.
|
|
18
|
+
#
|
|
19
|
+
# Workaround: pre-extract `{family}-0.png` (light) and `{family}-1.png`
|
|
20
|
+
# (dark) PNG frames next to each HEIC. wallpaper-sync.sh's resolver
|
|
21
|
+
# prefers `{family}-{0,1}.png` over `{family}.heic`, so DMS gets the
|
|
22
|
+
# decodable PNG instead of the broken HEIC.
|
|
23
|
+
#
|
|
24
|
+
# We use libheif's `heif-dec -d ffmpeg` because libde265 fails where
|
|
25
|
+
# the bundled ffmpeg decoder succeeds for the same input.
|
|
26
|
+
#
|
|
27
|
+
# Usage:
|
|
28
|
+
# bash scripts/theme/extract-heic-frames.sh # all HEICs in default dir
|
|
29
|
+
# bash scripts/theme/extract-heic-frames.sh --force # re-extract even if PNGs exist
|
|
30
|
+
# bash scripts/theme/extract-heic-frames.sh --dry-run # show what would extract
|
|
31
|
+
# DOTFILES_WALLPAPER_DIR=/path bash scripts/.../extract-heic-frames.sh
|
|
32
|
+
|
|
33
|
+
set -euo pipefail
|
|
34
|
+
|
|
35
|
+
WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
|
|
36
|
+
FORCE=0
|
|
37
|
+
DRY_RUN=0
|
|
38
|
+
|
|
39
|
+
for arg in "$@"; do
|
|
40
|
+
case "$arg" in
|
|
41
|
+
--force | -f) FORCE=1 ;;
|
|
42
|
+
--dry-run | -n) DRY_RUN=1 ;;
|
|
43
|
+
--help | -h)
|
|
44
|
+
sed -n '4,30p' "${BASH_SOURCE[0]}"
|
|
45
|
+
exit 0
|
|
46
|
+
;;
|
|
47
|
+
*)
|
|
48
|
+
echo "Unknown option: $arg" >&2
|
|
49
|
+
exit 1
|
|
50
|
+
;;
|
|
51
|
+
esac
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
if [[ ! -d "$WALLPAPER_DIR" ]]; then
|
|
55
|
+
echo "Wallpaper dir not found: $WALLPAPER_DIR" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
for cmd in magick heif-dec; do
|
|
60
|
+
if ! command -v "$cmd" >/dev/null 2>&1; then
|
|
61
|
+
echo "Required: $cmd (install ImageMagick + libheif-tools)" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
done
|
|
65
|
+
|
|
66
|
+
cd "$WALLPAPER_DIR"
|
|
67
|
+
|
|
68
|
+
extracted=0
|
|
69
|
+
skipped=0
|
|
70
|
+
single=0
|
|
71
|
+
failed=()
|
|
72
|
+
tmp_prefix="$(mktemp -d)/heic"
|
|
73
|
+
|
|
74
|
+
trap 'rm -rf "$(dirname "$tmp_prefix")"' EXIT
|
|
75
|
+
|
|
76
|
+
for f in *.heic; do
|
|
77
|
+
[[ -e "$f" ]] || continue
|
|
78
|
+
name="${f%.heic}"
|
|
79
|
+
|
|
80
|
+
if [[ $FORCE -eq 0 && -f "${name}-0.png" && -f "${name}-1.png" ]]; then
|
|
81
|
+
((skipped++)) || true
|
|
82
|
+
continue
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
frames=$(magick identify "$f" 2>/dev/null | wc -l | tr -d ' ')
|
|
86
|
+
if [[ "$frames" -lt 2 ]]; then
|
|
87
|
+
((single++)) || true
|
|
88
|
+
continue
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
if [[ $DRY_RUN -eq 1 ]]; then
|
|
92
|
+
echo "would extract: $name (frames=$frames)"
|
|
93
|
+
continue
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if heif-dec -d ffmpeg "$f" "${tmp_prefix}-${name}.png" >/dev/null 2>&1 &&
|
|
97
|
+
[[ -f "${tmp_prefix}-${name}-1.png" && -f "${tmp_prefix}-${name}-2.png" ]]; then
|
|
98
|
+
# heif-dec writes 1-indexed (-1, -2). Our convention is 0-indexed:
|
|
99
|
+
# light = frame 0, dark = frame 1.
|
|
100
|
+
mv "${tmp_prefix}-${name}-1.png" "${name}-0.png"
|
|
101
|
+
mv "${tmp_prefix}-${name}-2.png" "${name}-1.png"
|
|
102
|
+
((extracted++)) || true
|
|
103
|
+
echo " + $name"
|
|
104
|
+
else
|
|
105
|
+
failed+=("$name")
|
|
106
|
+
fi
|
|
107
|
+
done
|
|
108
|
+
|
|
109
|
+
echo "---"
|
|
110
|
+
echo "extracted: $extracted skipped (already have PNGs): $skipped single-frame: $single failed: ${#failed[@]}"
|
|
111
|
+
if [[ ${#failed[@]} -gt 0 ]]; then
|
|
112
|
+
printf ' ! %s\n' "${failed[@]}"
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
@@ -15,7 +15,14 @@ set -euo pipefail
|
|
|
15
15
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
16
|
EXTRACT_SCRIPT="$SCRIPT_DIR/extract-theme.py"
|
|
17
17
|
DOTFILES_DIR="${HOME}/.dotfiles"
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
# Descend into the chezmoi source subdir when .chezmoiroot is present (v0.2.503+)
|
|
20
|
+
CHEZMOI_SRC="$DOTFILES_DIR"
|
|
21
|
+
if [[ -f "$DOTFILES_DIR/.chezmoiroot" ]]; then
|
|
22
|
+
_sub="$(head -1 "$DOTFILES_DIR/.chezmoiroot" | tr -d '[:space:]')"
|
|
23
|
+
[[ -n "$_sub" && -d "$DOTFILES_DIR/$_sub" ]] && CHEZMOI_SRC="$DOTFILES_DIR/$_sub"
|
|
24
|
+
fi
|
|
25
|
+
THEMES_FILE="$CHEZMOI_SRC/.chezmoidata/themes.toml"
|
|
19
26
|
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/themes"
|
|
20
27
|
CUSTOM_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
|
|
21
28
|
|
package/scripts/theme/switch.sh
CHANGED
|
@@ -30,9 +30,9 @@ cleanup() {
|
|
|
30
30
|
trap cleanup EXIT
|
|
31
31
|
|
|
32
32
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
33
|
-
# shellcheck source
|
|
33
|
+
# shellcheck source=../../lib/dot/ui.sh
|
|
34
34
|
# shellcheck disable=SC1091
|
|
35
|
-
source "$SCRIPT_DIR
|
|
35
|
+
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
36
36
|
|
|
37
37
|
ui_init
|
|
38
38
|
|
|
@@ -58,8 +58,15 @@ if [ -z "$SRC_DIR" ]; then
|
|
|
58
58
|
exit 1
|
|
59
59
|
fi
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
# Descend into the chezmoi source subdir when .chezmoiroot is present (v0.2.503+)
|
|
62
|
+
CHEZMOI_SRC="$SRC_DIR"
|
|
63
|
+
if [[ -f "$SRC_DIR/.chezmoiroot" ]]; then
|
|
64
|
+
_sub="$(head -1 "$SRC_DIR/.chezmoiroot" | tr -d '[:space:]')"
|
|
65
|
+
[[ -n "$_sub" && -d "$SRC_DIR/$_sub" ]] && CHEZMOI_SRC="$SRC_DIR/$_sub"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
DATA_FILE="$CHEZMOI_SRC/.chezmoidata.toml"
|
|
69
|
+
THEMES_FILE="$CHEZMOI_SRC/.chezmoidata/themes.toml"
|
|
63
70
|
WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
|
|
64
71
|
if [ ! -f "$DATA_FILE" ]; then
|
|
65
72
|
ui_err "Missing" "$DATA_FILE"
|
|
@@ -124,8 +131,8 @@ paired_families() {
|
|
|
124
131
|
wallpaper_source() {
|
|
125
132
|
local family="${1:-}"
|
|
126
133
|
# Check for custom wallpapers: dynamic (family.heic) or split (family-dark/light.ext)
|
|
127
|
-
for ext in heic jpg png; do
|
|
128
|
-
if [[ -f "$WALLPAPER_DIR/${family}.${ext}" || -f "$WALLPAPER_DIR/${family}-dark.${ext}" || -f "$WALLPAPER_DIR/${family}-light.${ext}" ]]; then
|
|
134
|
+
for ext in heic jpg png webp; do
|
|
135
|
+
if [[ -f "$WALLPAPER_DIR/${family}.${ext}" || -f "$WALLPAPER_DIR/${family}-dark.${ext}" || -f "$WALLPAPER_DIR/${family}-light.${ext}" || -f "$WALLPAPER_DIR/${family}-0.${ext}" ]]; then
|
|
129
136
|
echo "Custom"
|
|
130
137
|
return
|
|
131
138
|
fi
|