@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
|
@@ -11,6 +11,33 @@ narrative behind it.
|
|
|
11
11
|
|
|
12
12
|
## Live score
|
|
13
13
|
|
|
14
|
+
<!-- BEGIN scorecard-snapshot (auto-generated, do not edit by hand) -->
|
|
15
|
+
Aggregate score **7.6 / 10** at 2026-05-17T08:11:51Z.
|
|
16
|
+
|
|
17
|
+
| Check | Score | Reason |
|
|
18
|
+
|---|---:|---|
|
|
19
|
+
| Binary-Artifacts | 10 | no binaries found in the repo |
|
|
20
|
+
| Branch-Protection | -1 | internal error: error during branchesHandler.setup: internal error: some github tokens can't read cl |
|
|
21
|
+
| CI-Tests | 10 | 15 out of 15 merged PRs checked by a CI test -- score normalized to 10 |
|
|
22
|
+
| CII-Best-Practices | 2 | badge detected: InProgress |
|
|
23
|
+
| Code-Review | 0 | Found 0/30 approved changesets -- score normalized to 0 |
|
|
24
|
+
| Contributors | 0 | project has 0 contributing companies or organizations -- score normalized to 0 |
|
|
25
|
+
| Dangerous-Workflow | 10 | no dangerous workflow patterns detected |
|
|
26
|
+
| Dependency-Update-Tool | 10 | update tool detected |
|
|
27
|
+
| Fuzzing | 0 | project is not fuzzed |
|
|
28
|
+
| License | 9 | license file detected |
|
|
29
|
+
| Maintained | 10 | 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10 |
|
|
30
|
+
| Packaging | 10 | packaging workflow detected |
|
|
31
|
+
| Pinned-Dependencies | 9 | dependency not pinned by hash detected -- score normalized to 9 |
|
|
32
|
+
| SAST | 10 | SAST tool is run on all commits |
|
|
33
|
+
| Security-Policy | 10 | security policy file detected |
|
|
34
|
+
| Signed-Releases | 3 | 1 out of the last 3 releases have a total of 2 signed artifacts. |
|
|
35
|
+
| Token-Permissions | 10 | GitHub workflow tokens follow principle of least privilege |
|
|
36
|
+
| Vulnerabilities | 10 | 0 existing vulnerabilities detected |
|
|
37
|
+
|
|
38
|
+
*Refresh: `scripts/qa/scorecard-snapshot.sh` · CI check: `lint/scorecard-snapshot` (planned).*
|
|
39
|
+
<!-- END scorecard-snapshot -->
|
|
40
|
+
|
|
14
41
|
[](https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles)
|
|
15
42
|
|
|
16
43
|
The badge above is regenerated every Monday at 06:00 UTC and on every
|
|
@@ -43,7 +70,7 @@ marks reflect this repo's posture at the time of writing — the
|
|
|
43
70
|
| Signed-Commits | ✓ | Enforced by pre-push hook (`scripts/git-hooks/pre-push`) and at-push by branch protection (#853 + #857). |
|
|
44
71
|
| Dependency-Update-Tool | ✓ | Dependabot configured for github-actions / npm / docker / devcontainers / uv. |
|
|
45
72
|
| Fuzzing | ⚠ | `install.sh` fuzz harness lives under `tests/fuzz/` (closes #881), but it's shell-based and Scorecard's heuristic only recognizes OSS-Fuzz / ClusterFuzzLite / native Go fuzz / libFuzzer / Atheris. None support shell. Property tests under `tests/unit/functions/test_property_*.sh` cover the closest equivalent surface. |
|
|
46
|
-
| License | ✓ |
|
|
73
|
+
| License | ✓ | MIT at repo root (`LICENSE`). |
|
|
47
74
|
| Maintained | ✓ | Active commit cadence; the [README](../../README.md) lists the current `dotfiles_version`. |
|
|
48
75
|
| Pinned-Dependencies | ⚠ | Closed 8 of 14 findings this cycle (every Dockerfile base + every workflow action + 2 `curl \| sh` installers + the `npm install -g npm` upgrade step). 5 residual findings stay open by design — see `Open findings`. |
|
|
49
76
|
| SAST | ✓ | CodeQL (`.github/workflows/codeql.yml`) + Checkov + Grype. |
|
|
@@ -101,12 +128,40 @@ false positives in Scorecard's regex.
|
|
|
101
128
|
| 2026-05-14 | 6.5 | 11 | Closed 17 of 28: 10× TokenPermissions (#886), 6× Dockerfile bases (#886), 1× gitleaks fixture (#884). |
|
|
102
129
|
| 2026-05-14 | 6.5 | 9 | Closed 2× `curl \| sh` installers (#888). |
|
|
103
130
|
| 2026-05-14 | 6.5 | 8 | Closed 1× `npm install -g npm@…` via Node 24 bump (#889). |
|
|
131
|
+
| 2026-05-17 | 7.6 | 7 | v0.2.502 released; Cosign keyless signing live (#876 implementation landed in `security-release.yml` sbom job). |
|
|
132
|
+
| 2026-05-17 | 7.6 | 6 | SLSA Release Attestation pipeline unblocked (PR #894 — 6 prior releases had failed identically). v0.2.502 backfilled with `.intoto.jsonl` + `.sig` + `.pem` triplet. `Signed-Releases` should bump from 3 to ~10 on next Scorecard re-scrape. |
|
|
133
|
+
| 2026-05-17 | 7.6 | — | Added `MAINTAINERS.md` + `GOVERNANCE.md` at repo root. Provides the formal context for the `Code-Review` 0/30 score (solo maintainer) and unblocks the CII Best Practices badge application. |
|
|
104
134
|
|
|
105
135
|
## Open work
|
|
106
136
|
|
|
107
|
-
- **Apply for the OpenSSF Best Practices Badge** — see Bucket 3 above.
|
|
108
|
-
- **
|
|
137
|
+
- **Apply for the OpenSSF Best Practices Badge** — see Bucket 3 above. All passing-tier criteria are now met (signed commits, CI, security policy, MIT license, MAINTAINERS.md, GOVERNANCE.md, RFC process documented).
|
|
138
|
+
- **Re-trigger Scorecard after SLSA backfill propagates** — expected `Signed-Releases` 3 → 10.
|
|
109
139
|
- **`harden-runner` block-mode adoption (#878)** — should tighten the `Token-Permissions` check further.
|
|
140
|
+
- **Investigate `License` 9/10 false-positive** — repo is MIT (SPDX-compliant), Scorecard's penalty should not apply.
|
|
141
|
+
- **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/master/protection` and document.
|
|
142
|
+
|
|
143
|
+
### Enabling Branch-Protection + Webhooks checks (one-time PAT setup)
|
|
144
|
+
|
|
145
|
+
Scorecard's `Branch-Protection` and `Webhooks` checks require a
|
|
146
|
+
fine-grained Personal Access Token with `Administration: read`
|
|
147
|
+
scope. Without it both checks return `-1` ("internal error"). The
|
|
148
|
+
workflow already wires this up — only the secret needs to be created.
|
|
149
|
+
|
|
150
|
+
Steps (one-time, repo owner):
|
|
151
|
+
|
|
152
|
+
1. Go to <https://github.com/settings/personal-access-tokens/new>
|
|
153
|
+
2. **Resource owner**: `sebastienrousseau` · **Repository access**: only `sebastienrousseau/dotfiles`
|
|
154
|
+
3. **Repository permissions** → `Administration: read-only` and `Metadata: read-only`
|
|
155
|
+
4. **Expiration**: 1 year (set a calendar reminder to rotate; document the rotation in this file when done)
|
|
156
|
+
5. Generate the token, copy it once
|
|
157
|
+
6. Add as a secret named `SCORECARD_TOKEN` at <https://github.com/sebastienrousseau/dotfiles/settings/secrets/actions/new>
|
|
158
|
+
7. Next Scorecard run (manual via `gh workflow run scorecard.yml` or weekly cron) picks it up automatically
|
|
159
|
+
8. Expected effect: `Branch-Protection` `-1` → 10/10 if all rules are correctly configured; `Webhooks` `-1` → 10/10 (no webhooks present).
|
|
160
|
+
|
|
161
|
+
The PAT secret is **optional**. When absent, the workflow falls back
|
|
162
|
+
to `${{ github.token }}` and Scorecard continues to run, only with
|
|
163
|
+
those two checks at `-1`. Adding the PAT cannot reduce any other check's
|
|
164
|
+
score — it's a strict improvement.
|
|
110
165
|
|
|
111
166
|
## Exceptions
|
|
112
167
|
|
|
@@ -7,7 +7,7 @@ render_with_liquid: false
|
|
|
7
7
|
Every bash script in this repo must include `set -euo pipefail` (or
|
|
8
8
|
`set -eu` for POSIX `sh`) within its first 50 lines. The rule is
|
|
9
9
|
enforced by
|
|
10
|
-
[`
|
|
10
|
+
[`tools/ci/check-shell-preamble.sh`](../../tools/ci/check-shell-preamble.sh),
|
|
11
11
|
wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
|
|
12
12
|
Tests pin the contract under
|
|
13
13
|
[`tests/unit/security/test_shell_preamble_lint.sh`](../../tests/unit/security/test_shell_preamble_lint.sh).
|
|
@@ -115,14 +115,14 @@ When you need to mark a new file:
|
|
|
115
115
|
3. **Run the checker:**
|
|
116
116
|
|
|
117
117
|
```bash
|
|
118
|
-
./
|
|
118
|
+
./tools/ci/check-shell-preamble.sh path/to/file.sh
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
Exit 0 = lint passes.
|
|
122
122
|
|
|
123
123
|
4. **If you're adding a new entire directory of fragments**
|
|
124
124
|
(rare — alias buckets, plugin trees), edit the path-skip rule
|
|
125
|
-
in `
|
|
125
|
+
in `tools/ci/check-shell-preamble.sh` and document it in this
|
|
126
126
|
page's "Bulk-sourced fragments" table above.
|
|
127
127
|
|
|
128
128
|
## CI integration
|
|
@@ -138,7 +138,7 @@ this page in the same PR.
|
|
|
138
138
|
|
|
139
139
|
## References
|
|
140
140
|
|
|
141
|
-
- `
|
|
141
|
+
- `tools/ci/check-shell-preamble.sh` — the lint.
|
|
142
142
|
- `tests/unit/security/test_shell_preamble_lint.sh` — contract test.
|
|
143
143
|
- `config/pre-commit-config.yaml` (`shell-preamble-check` hook).
|
|
144
144
|
- `.github/workflows/reusable-shell-lint.yml` — CI invocation.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Verify a Release"
|
|
3
|
+
date: 2026-05-17
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Verifying a Release
|
|
7
|
+
|
|
8
|
+
Every release of the framework ships four independent attestations.
|
|
9
|
+
Verify any of them, they're orthogonal and each rules out a
|
|
10
|
+
different class of attack.
|
|
11
|
+
|
|
12
|
+
| Artefact | Format | Tool | Threat covered |
|
|
13
|
+
|----------|--------|------|----------------|
|
|
14
|
+
| **SBOM** (`dotfiles-sbom.spdx.json`) | SPDX 2.3 JSON | any SBOM viewer | "what's in the release?", full component inventory |
|
|
15
|
+
| **Cosign signature** (`.sig` + `.pem`) | sigstore keyless | `cosign verify-blob` | "did our CI actually produce this SBOM?", short-lived Fulcio cert + Rekor transparency-log entry |
|
|
16
|
+
| **SLSA provenance** (`.intoto.jsonl`) | in-toto v1 / SLSA L3 | `slsa-verifier` | "what build process produced this?", workflow ID, source ref, builder identity |
|
|
17
|
+
| **Unified manifest** (`ALL_SHA256SUMS` + `.sig` + `.pem`) | text + sigstore keyless | `cosign verify-blob` then `sha256sum -c` | "is every other asset on this release the one our CI produced?", one signed line per asset |
|
|
18
|
+
|
|
19
|
+
All four are attached to every GitHub Release as assets, from v0.2.503 forward.
|
|
20
|
+
Releases v0.2.500 through v0.2.502 carry the SBOM bundle only: the unified
|
|
21
|
+
manifest landed in v0.2.503 and is forward-only (re-tagging earlier releases
|
|
22
|
+
would break consumer pins on existing SHAs).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## TL;DR — verify v0.2.503+ end-to-end
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
# 0. Pick the release to verify
|
|
30
|
+
TAG=v0.2.503
|
|
31
|
+
REPO=sebastienrousseau/dotfiles
|
|
32
|
+
|
|
33
|
+
# 1. Download every attestation artefact
|
|
34
|
+
gh release download "$TAG" --repo "$REPO" \
|
|
35
|
+
--pattern dotfiles-sbom.spdx.json \
|
|
36
|
+
--pattern dotfiles-sbom.spdx.json.sig \
|
|
37
|
+
--pattern dotfiles-sbom.spdx.json.pem \
|
|
38
|
+
--pattern dotfiles-sbom.spdx.json.intoto.jsonl \
|
|
39
|
+
--pattern ALL_SHA256SUMS \
|
|
40
|
+
--pattern ALL_SHA256SUMS.sig \
|
|
41
|
+
--pattern ALL_SHA256SUMS.pem
|
|
42
|
+
|
|
43
|
+
# 2. Verify Cosign signature on the SBOM (binds SBOM to CI workflow identity)
|
|
44
|
+
cosign verify-blob \
|
|
45
|
+
--certificate dotfiles-sbom.spdx.json.pem \
|
|
46
|
+
--signature dotfiles-sbom.spdx.json.sig \
|
|
47
|
+
--certificate-identity-regexp "^https://github.com/$REPO/" \
|
|
48
|
+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
|
49
|
+
dotfiles-sbom.spdx.json
|
|
50
|
+
|
|
51
|
+
# 3. Verify SLSA provenance (binds SBOM to exact source tag + builder)
|
|
52
|
+
slsa-verifier verify-artifact dotfiles-sbom.spdx.json \
|
|
53
|
+
--provenance-path dotfiles-sbom.spdx.json.intoto.jsonl \
|
|
54
|
+
--source-uri "github.com/$REPO" \
|
|
55
|
+
--source-tag "$TAG"
|
|
56
|
+
|
|
57
|
+
# 4. Verify the unified manifest, then verify every other asset against it.
|
|
58
|
+
# One signed file covers all release artefacts in one shot.
|
|
59
|
+
cosign verify-blob \
|
|
60
|
+
--certificate ALL_SHA256SUMS.pem \
|
|
61
|
+
--signature ALL_SHA256SUMS.sig \
|
|
62
|
+
--certificate-identity-regexp "^https://github.com/$REPO/" \
|
|
63
|
+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
|
64
|
+
ALL_SHA256SUMS
|
|
65
|
+
|
|
66
|
+
gh release download "$TAG" --repo "$REPO" --dir . # pull every other asset
|
|
67
|
+
sha256sum -c ALL_SHA256SUMS # one line per asset
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
All four commands should print "Verified" / "PASSED" / "OK" and
|
|
71
|
+
exit 0. If any fails, **the release was tampered with**: open
|
|
72
|
+
an issue at <https://github.com/sebastienrousseau/dotfiles/issues>
|
|
73
|
+
and do **not** install.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Tool installation
|
|
78
|
+
|
|
79
|
+
| Tool | macOS | Linux | Windows |
|
|
80
|
+
|------|-------|-------|---------|
|
|
81
|
+
| `gh` (GitHub CLI) | `brew install gh` | `apt install gh` / [release page](https://github.com/cli/cli/releases) | `scoop install gh` |
|
|
82
|
+
| `cosign` | `brew install cosign` | `curl -sSfL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign && chmod +x /usr/local/bin/cosign` | `scoop install cosign` |
|
|
83
|
+
| `slsa-verifier` | `brew install slsa-verifier` | `go install github.com/slsa-framework/slsa-verifier/v2/cli/slsa-verifier@latest` | `scoop install slsa-verifier` |
|
|
84
|
+
|
|
85
|
+
If you don't have Go installed, fetch the pre-built `slsa-verifier`
|
|
86
|
+
binary from <https://github.com/slsa-framework/slsa-verifier/releases>
|
|
87
|
+
(SHA256-verify per their release notes).
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## What each verification actually proves
|
|
92
|
+
|
|
93
|
+
### `cosign verify-blob` succeeds
|
|
94
|
+
|
|
95
|
+
- The SBOM was signed by a workflow run **on this repository** (the
|
|
96
|
+
`--certificate-identity-regexp` enforces it).
|
|
97
|
+
- The signing OIDC token was issued by **GitHub Actions** (the
|
|
98
|
+
`--certificate-oidc-issuer` enforces it).
|
|
99
|
+
- The signature is recorded in the **Rekor public transparency log**
|
|
100
|
+
(cosign queries this automatically) — anyone can audit it.
|
|
101
|
+
- The Cosign cert was issued by **Fulcio** (the sigstore CA) and
|
|
102
|
+
was valid at the time of signing.
|
|
103
|
+
|
|
104
|
+
This **does not** prove what the build process did — only that
|
|
105
|
+
"the file you have is the file CI produced." For "what did CI do",
|
|
106
|
+
see SLSA verification below.
|
|
107
|
+
|
|
108
|
+
### `slsa-verifier verify-artifact` succeeds
|
|
109
|
+
|
|
110
|
+
- The SBOM digest matches a provenance statement.
|
|
111
|
+
- The provenance was generated by the **SLSA-Generator** running on
|
|
112
|
+
**GitHub-hosted runners** for **this exact repository**.
|
|
113
|
+
- The build was triggered by the named tag (`--source-tag $TAG`).
|
|
114
|
+
- The provenance is anchored in Rekor (immutable, third-party-auditable).
|
|
115
|
+
|
|
116
|
+
SLSA Level 3 is achieved because: (a) the provenance is generated
|
|
117
|
+
by a *trusted, isolated* builder (slsa-github-generator), not by
|
|
118
|
+
us; (b) the builder runs with hermetic, non-falsifiable inputs;
|
|
119
|
+
(c) the provenance is signed by the builder's own identity, not
|
|
120
|
+
ours.
|
|
121
|
+
|
|
122
|
+
### What none of this proves
|
|
123
|
+
|
|
124
|
+
The framework's source code is **not formally verified**. SBOM +
|
|
125
|
+
SLSA + Cosign protect the *supply chain* (you got what we shipped)
|
|
126
|
+
— not the *correctness* (what we shipped does what we claim).
|
|
127
|
+
|
|
128
|
+
For correctness review:
|
|
129
|
+
|
|
130
|
+
- Code is open under MIT — read it. Start at `bin/dot`.
|
|
131
|
+
- CI runs ~75 checks per PR (shellcheck, shfmt, CodeQL, Semgrep, Codacy, etc.).
|
|
132
|
+
- Pre-commit hooks reject typos, unsigned commits, raw secrets.
|
|
133
|
+
- See `docs/security/SCORECARD.md` for the OpenSSF score posture.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## In-shell one-liner for ongoing verification
|
|
138
|
+
|
|
139
|
+
If you intend to install or update from a release tag, add this to
|
|
140
|
+
your shell startup (already in `dot_config/shell/*` for users who
|
|
141
|
+
run `chezmoi apply`):
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
verify-dot-release() {
|
|
145
|
+
local tag="${1:-$(gh release view --json tagName --jq .tagName \
|
|
146
|
+
--repo sebastienrousseau/dotfiles)}"
|
|
147
|
+
local tmp
|
|
148
|
+
tmp="$(mktemp -d)"
|
|
149
|
+
( cd "$tmp" \
|
|
150
|
+
&& gh release download "$tag" --repo sebastienrousseau/dotfiles \
|
|
151
|
+
--pattern 'dotfiles-sbom.*' \
|
|
152
|
+
&& cosign verify-blob \
|
|
153
|
+
--certificate dotfiles-sbom.spdx.json.pem \
|
|
154
|
+
--signature dotfiles-sbom.spdx.json.sig \
|
|
155
|
+
--certificate-identity-regexp '^https://github.com/sebastienrousseau/dotfiles/' \
|
|
156
|
+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
|
157
|
+
dotfiles-sbom.spdx.json \
|
|
158
|
+
&& slsa-verifier verify-artifact dotfiles-sbom.spdx.json \
|
|
159
|
+
--provenance-path dotfiles-sbom.spdx.json.intoto.jsonl \
|
|
160
|
+
--source-uri github.com/sebastienrousseau/dotfiles \
|
|
161
|
+
--source-tag "$tag"
|
|
162
|
+
)
|
|
163
|
+
local rc=$?
|
|
164
|
+
rm -rf "$tmp"
|
|
165
|
+
return $rc
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Usage:
|
|
170
|
+
|
|
171
|
+
```sh
|
|
172
|
+
verify-dot-release # verify latest
|
|
173
|
+
verify-dot-release v0.2.502 # verify specific tag
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## If verification fails
|
|
179
|
+
|
|
180
|
+
1. **Don't install.** Stop the bootstrap script. `^C` any in-flight
|
|
181
|
+
`chezmoi apply`.
|
|
182
|
+
2. **Compare assets**. The release page shows file sizes — if
|
|
183
|
+
yours don't match what's on
|
|
184
|
+
<https://github.com/sebastienrousseau/dotfiles/releases>, you
|
|
185
|
+
downloaded from a man-in-the-middle.
|
|
186
|
+
3. **Report**: open an issue and email
|
|
187
|
+
`security@sebastienrousseau.com` (encrypted to the WKD-published
|
|
188
|
+
GPG key — fingerprint
|
|
189
|
+
`55AFAD364FD9DB3819E61F0C8D688FAFA9144693`). Acknowledgement
|
|
190
|
+
SLA: 72 hours per `.github/SECURITY.md`.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## See also
|
|
195
|
+
|
|
196
|
+
- `.github/SECURITY.md` — coordinated disclosure policy.
|
|
197
|
+
- `docs/security/KEY_ROTATION.md` — disclosure-key rotation procedure.
|
|
198
|
+
- `docs/security/SCORECARD.md` — OpenSSF Scorecard posture.
|
|
199
|
+
- `docs/operations/HARD_AUDIT_2026.md` Part 7 — the GPG key generation + WKD publication record.
|
|
200
|
+
- [Sigstore Cosign docs](https://docs.sigstore.dev/cosign/signing/overview/)
|
|
201
|
+
- [SLSA verifier docs](https://github.com/slsa-framework/slsa-verifier)
|
package/install.sh
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
set -euo pipefail
|
|
8
8
|
|
|
9
|
+
# Restrict the permissions of any file/dir we create during bootstrap.
|
|
10
|
+
# The installer writes secret-adjacent artifacts (chezmoi config, age
|
|
11
|
+
# keys, ssh tooling, downloaded archives) under $HOME — 077 prevents
|
|
12
|
+
# other local accounts from reading them. Individual call sites can
|
|
13
|
+
# still relax with `chmod` when a file is meant to be world-readable.
|
|
14
|
+
umask 077
|
|
15
|
+
|
|
9
16
|
# ANSI Colors
|
|
10
17
|
RED='\033[0;31m'
|
|
11
18
|
GREEN='\033[0;32m'
|
|
@@ -52,7 +59,7 @@ show_help() {
|
|
|
52
59
|
Usage: install.sh [version] [options]
|
|
53
60
|
|
|
54
61
|
Arguments:
|
|
55
|
-
version The version (tag or branch) to install (default: v0.2.
|
|
62
|
+
version The version (tag or branch) to install (default: v0.2.503)
|
|
56
63
|
|
|
57
64
|
Options:
|
|
58
65
|
--help Show this help message
|
|
@@ -64,7 +71,7 @@ EOF
|
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
main() {
|
|
67
|
-
local version="v0.2.
|
|
74
|
+
local version="v0.2.503"
|
|
68
75
|
local version_set=0
|
|
69
76
|
local minimal=0
|
|
70
77
|
local _cleanup_files=()
|
|
@@ -92,7 +99,7 @@ main() {
|
|
|
92
99
|
# like `foobar` doesn't trigger a 30s+ network download attempt.
|
|
93
100
|
# Caught by the install.sh fuzz harness (#881).
|
|
94
101
|
if [[ ! "$arg" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+([-+][a-zA-Z0-9.-]+)?$ ]]; then
|
|
95
|
-
error "Unrecognized positional argument '$arg' — expected a semver version (e.g. v0.2.
|
|
102
|
+
error "Unrecognized positional argument '$arg' — expected a semver version (e.g. v0.2.503)."
|
|
96
103
|
fi
|
|
97
104
|
version="$arg"
|
|
98
105
|
version_set=1
|
|
@@ -185,7 +192,7 @@ main() {
|
|
|
185
192
|
# executing an unverified script (the previous fall-back to
|
|
186
193
|
# `get.chezmoi.io` was an unsigned bootstrap and a security hole).
|
|
187
194
|
local verified_installer
|
|
188
|
-
verified_installer="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/
|
|
195
|
+
verified_installer="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/ci/install-chezmoi-verified.sh"
|
|
189
196
|
if [[ -x "$verified_installer" ]] || [[ -f "$verified_installer" ]]; then
|
|
190
197
|
echo " Using checksum-verified installer..."
|
|
191
198
|
if ! bash "$verified_installer" "${CHEZMOI_VERSION:-2.47.1}" "$bin_dir"; then
|
|
@@ -200,7 +207,7 @@ main() {
|
|
|
200
207
|
return 0
|
|
201
208
|
fi
|
|
202
209
|
echo "" >&2
|
|
203
|
-
echo "
|
|
210
|
+
echo " tools/ci/install-chezmoi-verified.sh is missing; cannot verify chezmoi bootstrap." >&2
|
|
204
211
|
echo " Install chezmoi manually (brew install chezmoi / official binary)" >&2
|
|
205
212
|
echo " and re-run install.sh." >&2
|
|
206
213
|
return 1
|
|
@@ -297,6 +304,21 @@ main() {
|
|
|
297
304
|
# 6. Initialize & Apply
|
|
298
305
|
step "Applying Configuration..."
|
|
299
306
|
|
|
307
|
+
# ── Auto-migration for v0.2.503 reorg ─────────────────────────────────
|
|
308
|
+
# If the user is upgrading from a pre-0.2.503 install, run the
|
|
309
|
+
# migration script BEFORE `chezmoi apply` so the reorg's source-
|
|
310
|
+
# path moves don't cause chezmoi to delete deployed files.
|
|
311
|
+
# The script is idempotent + silent-by-default; safe to run on
|
|
312
|
+
# every install (fresh installs detect "no prior state" and exit 0).
|
|
313
|
+
for migrate_src in "$SOURCE_DIR" "$LEGACY_SOURCE_DIR"; do
|
|
314
|
+
migrate_script="$migrate_src/install/migrate/migrate-v0_2-to-v0_2_503.sh"
|
|
315
|
+
if [[ -x "$migrate_script" ]]; then
|
|
316
|
+
echo " Running v0.2.503 migration (idempotent; safe on fresh installs)..."
|
|
317
|
+
"$migrate_script" || echo " migration exited non-zero — continuing apply"
|
|
318
|
+
break
|
|
319
|
+
fi
|
|
320
|
+
done
|
|
321
|
+
|
|
300
322
|
# If we are running from a local source, just apply
|
|
301
323
|
if [[ -d "$SOURCE_DIR/.git" ]]; then
|
|
302
324
|
echo " Applying from local source: $SOURCE_DIR"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sebastienrousseau/dotfiles",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.503",
|
|
4
4
|
"description": "The Trusted Shell Platform — Universal dotfiles managed by Chezmoi. Features Bash & Zsh for macOS, Linux & WSL. Rust modern tooling & enterprise-grade security.",
|
|
5
5
|
"main": "install.sh",
|
|
6
6
|
"bin": {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# `scripts/` — Framework Code
|
|
2
|
+
|
|
3
|
+
Everything in this directory is **framework code**. Nothing here
|
|
4
|
+
deploys to `~/`; chezmoi ignores the whole tree (see
|
|
5
|
+
`.chezmoiignore`). Scripts are invoked by the `dot` CLI, by CI
|
|
6
|
+
workflows, by `chezmoi apply` hooks, or by hand.
|
|
7
|
+
|
|
8
|
+
## Subtree map
|
|
9
|
+
|
|
10
|
+
Per the v0.2.503 reorg (RFC `docs/operations/RFC_v0_2_503_reorganization.md`),
|
|
11
|
+
**repo-only ops** (CI, release, maintenance, docs-generation) have
|
|
12
|
+
moved to the top-level `tools/` tree. `scripts/` retains the
|
|
13
|
+
**runtime-invoked** scripts that the `dot` CLI dispatches to plus a
|
|
14
|
+
few specialised subtrees.
|
|
15
|
+
|
|
16
|
+
### `scripts/` (CLI dispatch + specialised subtrees)
|
|
17
|
+
|
|
18
|
+
| Path | Purpose | Touched by |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `scripts/dot/commands/` | Per-subcommand handlers for the `dot` CLI. Sources `lib/dot/*.sh` (moved out of this tree in v0.2.503 Phase 1). | Dispatched by `bin/dot` |
|
|
21
|
+
| `scripts/dot/powershell/` | Native PowerShell module (`Dot.psm1`) exporting `Get-DotVersion` / `Invoke-DotHelp` / `Test-DotAgentsSync`. | `bin/dot.ps1` |
|
|
22
|
+
| `scripts/dot/data/` | Per-command static data (registry seeds, palette tables). | `scripts/dot/commands/*` |
|
|
23
|
+
| `scripts/lib/` | Cross-cutting library helpers reused across multiple scripts. Example: `secrets_provider.sh` (keychain / pass / age dispatch). | `scripts/dot/commands/*`, ops scripts |
|
|
24
|
+
| `scripts/diagnostics/` | `doctor.sh` and its helpers — long-form environment health check. | `dot doctor` |
|
|
25
|
+
| `scripts/security/` | Security-domain ops: `check-disclosure-key-expiry.sh`, `lock-configs.sh`, etc. | `dot security`, CI |
|
|
26
|
+
| `scripts/secrets/` | Secret-bucket utilities (rotation, audit). | `dot secrets` subcommands |
|
|
27
|
+
| `scripts/theme/` | Wallpaper-to-palette extraction logic. | `dot theme rebuild` |
|
|
28
|
+
| `scripts/tools/` | Tool-helpers shipped via `dot tools` (e.g. `cmatrix.sh`, `emoji-picker.sh`, `figlet-banner.sh`, `log-rotate.sh`). Runtime-invoked. | `dot tools`, `dot env` |
|
|
29
|
+
| `scripts/tuning/` | Opt-in OS tuning scripts (`macos.sh`, `linux.sh`). | `dot tune`, manual invocation |
|
|
30
|
+
| `scripts/ops/` | Repo-wide ops: `rollback.sh`, etc. | `dot rollback`, maintenance |
|
|
31
|
+
| `scripts/fonts/` | Nerd Font install helpers. | `dot fonts` |
|
|
32
|
+
| `scripts/git-hooks/` | Git hooks not managed by chezmoi (kept here for portable install). | `install/provision/*` |
|
|
33
|
+
| `scripts/qa/` | Quality-assurance helpers (PowerShell contract tests, version-consistency checks, scorecard snapshot, etc). | `.github/workflows/pr-signature.yml`, `powershell-contract.yml`, doc-drift |
|
|
34
|
+
| `scripts/demo/` | Demonstration helpers (recordings, screenshots). | Manual |
|
|
35
|
+
| `scripts/version-sync.sh` | Bulk version-string propagator (`scripts/qa/check-version-consistency.sh` is the verifier). | Release flow |
|
|
36
|
+
| `scripts/uninstall.sh` | Reverse-of-`install.sh` — user-invoked. | Manual |
|
|
37
|
+
|
|
38
|
+
### `tools/` (repo-only ops, not distributable)
|
|
39
|
+
|
|
40
|
+
| Path | Purpose | Touched by |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `tools/ci/` | CI-only helpers: `dot-cli-startup-bench.sh`, `install-chezmoi-verified.sh`, `windows-smoke-test.ps1`, `run-coverage.sh`, etc. | `.github/workflows/*` |
|
|
43
|
+
| `tools/release/` | Release-time tasks. | Release workflow |
|
|
44
|
+
| `tools/maintenance/` | Recurring upkeep: `check-updates.sh`, etc. | Cron, manual |
|
|
45
|
+
| `tools/docs/` | Documentation-generation helpers (manual builds, screenshot CI, `generate-command-index.sh`). | `manual-publish.yml`, `dot manual`, doc-drift |
|
|
46
|
+
|
|
47
|
+
## `scripts/dot/` breakdown
|
|
48
|
+
|
|
49
|
+
The `dot` CLI is implemented as `bin/dot`
|
|
50
|
+
(dispatcher) + `scripts/dot/commands/<cmd>.sh` (per-command
|
|
51
|
+
handlers) + `lib/dot/*.sh` (shared helpers — moved out of
|
|
52
|
+
`scripts/dot/lib/` in v0.2.503 Phase 1 per the
|
|
53
|
+
[reorganisation RFC](../docs/operations/RFC_v0_2_503_reorganization.md)).
|
|
54
|
+
|
|
55
|
+
| Path | Purpose |
|
|
56
|
+
|---|---|
|
|
57
|
+
| `scripts/dot/commands/` | One file per `dot <cmd>` subcommand. Each defines a `cmd_<name>()` function the dispatcher calls. Sources the library via `$SCRIPT_DIR/../../../lib/dot/<X>.sh`. |
|
|
58
|
+
| `scripts/dot/powershell/` | Native PowerShell module — see top-level table. |
|
|
59
|
+
| **`lib/dot/utils.sh`** | Common helpers (resolve_source_dir, validate_name, die, run_script, etc.). |
|
|
60
|
+
| **`lib/dot/ui.sh`** | Single source of truth for CLI output (ui_ok/warn/err/info, ui_header, ui_table_*, ui_spinner_*, ui_confirm, ...). |
|
|
61
|
+
| **`lib/dot/platform.sh`** | OS / shell / WSL detection, path translation. |
|
|
62
|
+
| **`lib/dot/log.sh`** | Structured logging (JSONL audit log when `DOTFILES_AUDIT_LOG=1`). |
|
|
63
|
+
| **`lib/dot/bento.sh`** | The "bento box" layout primitive used by `dot health` and friends. |
|
|
64
|
+
|
|
65
|
+
## Adding a new subcommand
|
|
66
|
+
|
|
67
|
+
1. Create `scripts/dot/commands/<name>.sh`:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
#!/usr/bin/env bash
|
|
71
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
72
|
+
set -euo pipefail
|
|
73
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
74
|
+
# shellcheck source=../lib/utils.sh
|
|
75
|
+
source "$SCRIPT_DIR/../lib/utils.sh"
|
|
76
|
+
|
|
77
|
+
dot_ui_command_banner "<Title>" "${1:-}"
|
|
78
|
+
|
|
79
|
+
cmd_<name>() {
|
|
80
|
+
# ...
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
cmd_<name>_help() {
|
|
84
|
+
cat <<-EOF
|
|
85
|
+
Usage: dot <name> [args]
|
|
86
|
+
# ...
|
|
87
|
+
EOF
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
2. Add a dispatch arm in `bin/dot`:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
<name>) load_commands "<name>"; cmd_<name> "$@" ;;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
3. Document it in `docs/manual/03-reference/01-dot-cli.md` and add
|
|
98
|
+
to `docs/manual/command-index.md`.
|
|
99
|
+
|
|
100
|
+
4. Add a help-table entry in `bin/dot`'s
|
|
101
|
+
help renderer.
|
|
102
|
+
|
|
103
|
+
5. Add a unit test under `tests/unit/<domain>/test_<name>.sh`
|
|
104
|
+
(run with `./tests/framework/test_runner.sh`).
|
|
105
|
+
|
|
106
|
+
## Conventions
|
|
107
|
+
|
|
108
|
+
- **Shell style**: 2-space indent, `set -euo pipefail`, shellcheck-clean
|
|
109
|
+
with the project's flags (`--severity=error -e SC1091 -e SC2030 -e SC2031`).
|
|
110
|
+
- **Formatting**: `shfmt -i 2 -ci`.
|
|
111
|
+
- **Output**: NEVER `printf` raw ANSI. Source `scripts/dot/lib/ui.sh`
|
|
112
|
+
and use `ui_ok`, `ui_table_*`, etc.
|
|
113
|
+
- **Exit codes**: 1 = bad usage, 2 = no provider / dependency missing,
|
|
114
|
+
3 = empty result / not found, ≥4 = provider-specific. Document
|
|
115
|
+
per-command in the help text.
|
|
116
|
+
- **Validation**: Always `validate_name "$arg" "tool name"` before
|
|
117
|
+
passing user input to `mise`, `gh`, `ssh`, etc.
|
|
118
|
+
|
|
119
|
+
## See also
|
|
120
|
+
|
|
121
|
+
- `../docs/STRUCTURE.md` — full repository map.
|
|
122
|
+
- `docs/manual/03-reference/01-dot-cli.md` — every `dot <cmd>` documented.
|
|
123
|
+
- `scripts/dot/lib/ui.sh` — the UI primitive library (always source this for output).
|
|
@@ -1,96 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# are deliberately narrow to avoid false positives on C-style `(c)` comments
|
|
7
|
-
# or the word "token" appearing in running text.
|
|
8
|
-
#
|
|
9
|
-
# Usage:
|
|
10
|
-
# check-copyright-headers.sh [--extensions=sh,lua,nix,...] [--excludes=REGEX]
|
|
11
|
-
#
|
|
12
|
-
# Exit codes:
|
|
13
|
-
# 0 all files have a valid header
|
|
14
|
-
# 1 one or more files are missing a header
|
|
15
|
-
# 2 invalid invocation
|
|
16
|
-
|
|
3
|
+
# Compat shim: the canonical script moved to tools/ci/ in v0.2.503.
|
|
4
|
+
# Pinned reusable workflows on master still reference the old path;
|
|
5
|
+
# this delegates so they keep working until the next pin bump.
|
|
17
6
|
set -euo pipefail
|
|
18
|
-
|
|
19
|
-
EXTENSIONS_DEFAULT="sh,lua,nix,py,js,ts,go,rs,java,cpp,c,h,hpp"
|
|
20
|
-
EXCLUDES_DEFAULT='(^|/)(node_modules|\.git|vendor|target|build)/|\.tmpl$|(^|/)\.chezmoitemplates/'
|
|
21
|
-
|
|
22
|
-
EXTENSIONS="$EXTENSIONS_DEFAULT"
|
|
23
|
-
EXCLUDES="$EXCLUDES_DEFAULT"
|
|
24
|
-
|
|
25
|
-
for arg in "$@"; do
|
|
26
|
-
case "$arg" in
|
|
27
|
-
--extensions=*) EXTENSIONS="${arg#*=}" ;;
|
|
28
|
-
--excludes=*) EXCLUDES="${arg#*=}" ;;
|
|
29
|
-
-h | --help)
|
|
30
|
-
sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'
|
|
31
|
-
exit 0
|
|
32
|
-
;;
|
|
33
|
-
*)
|
|
34
|
-
echo "Unknown argument: $arg" >&2
|
|
35
|
-
exit 2
|
|
36
|
-
;;
|
|
37
|
-
esac
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
# Narrow patterns — each must be specific enough that running prose cannot match.
|
|
41
|
-
# Deliberately DROPPED: bare "(c) " (false-positives in C comments),
|
|
42
|
-
# bare "All rights reserved" (often appears in vendored prose).
|
|
43
|
-
# Matched by `grep -F`, so these are literal strings.
|
|
44
|
-
PATTERNS=(
|
|
45
|
-
"Copyright (c)"
|
|
46
|
-
"Copyright ©"
|
|
47
|
-
"SPDX-License-Identifier:"
|
|
48
|
-
"© "
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
# Build a ripgrep glob like `{*.sh,*.lua,*.nix}` from the comma list.
|
|
52
|
-
IFS=',' read -r -a exts <<<"$EXTENSIONS"
|
|
53
|
-
glob="{"
|
|
54
|
-
for i in "${!exts[@]}"; do
|
|
55
|
-
[[ $i -gt 0 ]] && glob+=","
|
|
56
|
-
glob+="*.${exts[$i]}"
|
|
57
|
-
done
|
|
58
|
-
glob+="}"
|
|
59
|
-
|
|
60
|
-
mapfile -t all_files < <(rg --files -g "$glob" 2>/dev/null || true)
|
|
61
|
-
|
|
62
|
-
if [[ "${#all_files[@]}" -eq 0 ]]; then
|
|
63
|
-
echo "::notice::No files matched extensions: $EXTENSIONS"
|
|
64
|
-
exit 0
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
missing=()
|
|
68
|
-
for file in "${all_files[@]}"; do
|
|
69
|
-
if [[ "$file" =~ $EXCLUDES ]]; then
|
|
70
|
-
continue
|
|
71
|
-
fi
|
|
72
|
-
|
|
73
|
-
found=false
|
|
74
|
-
# Read the first 10 lines once; search each pattern against that buffer.
|
|
75
|
-
head_buf="$(head -n 10 "$file" 2>/dev/null || true)"
|
|
76
|
-
for pattern in "${PATTERNS[@]}"; do
|
|
77
|
-
if grep -qF -- "$pattern" <<<"$head_buf"; then
|
|
78
|
-
found=true
|
|
79
|
-
break
|
|
80
|
-
fi
|
|
81
|
-
done
|
|
82
|
-
|
|
83
|
-
$found || missing+=("$file")
|
|
84
|
-
done
|
|
85
|
-
|
|
86
|
-
if [[ "${#missing[@]}" -gt 0 ]]; then
|
|
87
|
-
echo "::error::Copyright header validation failed — ${#missing[@]} file(s) missing header"
|
|
88
|
-
echo "Files missing a recognised copyright header:"
|
|
89
|
-
printf ' - %s\n' "${missing[@]}"
|
|
90
|
-
echo
|
|
91
|
-
echo "Add ONE of the following to the first 10 lines:"
|
|
92
|
-
printf ' - %s\n' "${PATTERNS[@]}"
|
|
93
|
-
exit 1
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
echo "::notice::All ${#all_files[@]} file(s) have a valid copyright header"
|
|
7
|
+
exec bash "$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/tools/ci/check-copyright-headers.sh" "$@"
|