@sebastienrousseau/dotfiles 0.2.501 → 0.2.503
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +155 -4
- package/LICENSE +21 -1283
- package/README.md +40 -8
- package/docs/CONFIG_STRATEGY.md +124 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/GOVERNANCE.md +98 -0
- package/docs/MAINTAINERS.md +41 -0
- package/docs/OPENCODE.md +127 -0
- package/docs/README.md +2 -0
- package/docs/STRUCTURE.md +102 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
- package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
- package/docs/architecture/REPO_LAYOUT.md +8 -8
- package/docs/archive/MILESTONE_v0.2.493.md +1 -1
- package/docs/index.md +2 -2
- package/docs/interop/POWERSHELL.md +1 -1
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/01-concepts/02-trust-model.md +1 -1
- package/docs/manual/03-reference/01-dot-cli.md +63 -45
- package/docs/manual/03-reference/02-config-files.md +2 -2
- package/docs/manual/03-reference/05-feature-flags.md +62 -3
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +72 -55
- package/docs/manual/index.md +66 -0
- package/docs/operations/CI_COMPOSITES.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +40 -6
- package/docs/operations/HARD_AUDIT_2026.md +631 -0
- package/docs/operations/MAINTENANCE.md +3 -3
- package/docs/operations/MANIFEST.md +127 -0
- package/docs/operations/REGISTRY.md +89 -0
- package/docs/operations/RELEASE_PIPELINE.md +130 -0
- package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
- package/docs/operations/ROADMAP_2026.md +665 -0
- package/docs/operations/ROADMAP_V0_2_503.md +134 -0
- package/docs/operations/TESTING.md +17 -0
- package/docs/operations/TRACEABILITY.md +9 -3
- package/docs/operations/VERSION_SYNC.md +4 -4
- package/docs/reference/POWERSHELL_PARITY.md +81 -0
- package/docs/registry.json +6 -0
- package/docs/schema/dot-env-v1.json +110 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
- package/docs/security/CI_PINNING.md +121 -0
- package/docs/security/COMMIT_SIGNING.md +138 -0
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
- package/docs/security/DISCLOSURE.md +130 -0
- package/docs/security/FUZZING.md +114 -0
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/KEY_ROTATION.md +81 -1
- package/docs/security/POLICY_RELEASES.md +2 -2
- package/docs/security/SCORECARD.md +130 -15
- package/docs/security/SHELL_EXEMPTIONS.md +4 -4
- package/docs/security/VERIFY_RELEASE.md +201 -0
- package/docs/security/security-pubkey.asc +15 -0
- package/install.sh +67 -38
- package/package.json +1 -1
- package/scripts/README.md +123 -0
- package/scripts/ci/check-copyright-headers.sh +4 -93
- package/scripts/ci/check-shell-preamble.sh +4 -103
- package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
- package/scripts/diagnostics/a2a-conformance.sh +4 -4
- package/scripts/diagnostics/alias-governance.sh +1 -1
- package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
- package/scripts/diagnostics/benchmark.sh +4 -4
- package/scripts/diagnostics/conflicts.sh +2 -2
- package/scripts/diagnostics/doctor-unified.sh +2 -2
- package/scripts/diagnostics/doctor.sh +45 -15
- package/scripts/diagnostics/drift-dashboard.sh +2 -2
- package/scripts/diagnostics/health.sh +4 -4
- package/scripts/diagnostics/history-analysis.sh +2 -2
- package/scripts/diagnostics/mcp-doctor.sh +10 -7
- package/scripts/diagnostics/perf.sh +4 -4
- package/scripts/diagnostics/scorecard.sh +4 -4
- package/scripts/diagnostics/security-score.sh +2 -2
- package/scripts/diagnostics/smoke-test.sh +2 -2
- package/scripts/diagnostics/snapshot.sh +2 -2
- package/scripts/diagnostics/verify.sh +4 -4
- package/scripts/diagnostics/version-locks.sh +2 -2
- package/scripts/diagnostics/workstation-attestation.sh +14 -14
- package/scripts/dot/commands/agent.sh +27 -22
- package/scripts/dot/commands/agents.sh +335 -0
- package/scripts/dot/commands/ai.sh +144 -25
- package/scripts/dot/commands/aliases.sh +10 -8
- package/scripts/dot/commands/appearance.sh +2 -2
- package/scripts/dot/commands/core.sh +12 -6
- package/scripts/dot/commands/diagnostics.sh +5 -5
- package/scripts/dot/commands/env-emit.sh +202 -0
- package/scripts/dot/commands/fleet.sh +290 -14
- package/scripts/dot/commands/init.sh +184 -0
- package/scripts/dot/commands/lint.sh +9 -4
- package/scripts/dot/commands/manual.sh +3 -3
- package/scripts/dot/commands/meta.sh +19 -10
- package/scripts/dot/commands/patterns.sh +2 -2
- package/scripts/dot/commands/registry.sh +263 -0
- package/scripts/dot/commands/restore.sh +4 -4
- package/scripts/dot/commands/secrets.sh +4 -3
- package/scripts/dot/commands/security.sh +2 -2
- package/scripts/dot/commands/tools.sh +62 -4
- package/scripts/dot/powershell/Dot.psm1 +199 -0
- package/scripts/fonts/install-nerd-fonts.sh +2 -2
- package/scripts/git-hooks/pre-commit-audit.sh +2 -2
- package/scripts/git-hooks/pre-push +13 -0
- package/scripts/lib/secrets_provider.sh +32 -6
- package/scripts/ops/ai-setup.sh +1 -1
- package/scripts/ops/bundle.sh +2 -2
- package/scripts/ops/chaos.sh +2 -2
- package/scripts/ops/chezmoi-apply.sh +4 -4
- package/scripts/ops/heal.sh +4 -4
- package/scripts/ops/post-apply-repair.sh +2 -2
- package/scripts/ops/prewarm.sh +2 -2
- package/scripts/ops/release.sh +4 -4
- package/scripts/ops/rollback.sh +18 -4
- package/scripts/ops/setup.sh +2 -2
- package/scripts/qa/check-version-consistency.sh +123 -0
- package/scripts/qa/coverage-baseline.sh +1 -1
- package/scripts/qa/docs-coverage.sh +2 -2
- package/scripts/qa/powershell-contract.ps1 +1 -1
- package/scripts/qa/scorecard-snapshot.sh +127 -0
- package/scripts/security/backup.sh +2 -2
- package/scripts/security/check-disclosure-key-expiry.sh +110 -0
- package/scripts/security/dns-doh.sh +4 -4
- package/scripts/security/encryption-check.sh +4 -4
- package/scripts/security/enforce-policies.sh +2 -2
- package/scripts/security/firewall.sh +4 -4
- package/scripts/security/lock-configs.sh +11 -2
- package/scripts/security/lock-screen.sh +4 -4
- package/scripts/security/manage-secrets.sh +2 -2
- package/scripts/security/ssh-cert.sh +2 -2
- package/scripts/security/telemetry-kill.sh +4 -4
- package/scripts/security/usb-safety.sh +4 -4
- package/scripts/theme/extract-heic-frames.sh +114 -0
- package/scripts/theme/rebuild-themes.sh +8 -1
- package/scripts/theme/switch.sh +13 -6
- package/scripts/theme/wallpaper-sync.sh +297 -93
- package/scripts/tuning/linux.sh +2 -2
- package/scripts/tuning/macos.sh +2 -2
- package/scripts/version-sync.sh +58 -7
- package/dot_config/.module-manifest.json +0 -69
- package/dot_config/ai/identity.md +0 -23
- package/dot_config/ai/patterns/architect.md +0 -16
- package/dot_config/ai/patterns/hardener.md +0 -15
- package/dot_config/ai/patterns/refactor.md +0 -15
- package/dot_config/aider/aider.conf.yml +0 -32
- package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
- package/dot_config/ansible/ansible.cfg +0 -11
- package/dot_config/atuin/config.toml.tmpl +0 -47
- package/dot_config/bat/config +0 -23
- package/dot_config/brave-flags.conf.tmpl +0 -7
- package/dot_config/btop/btop.conf +0 -16
- package/dot_config/btop/themes/tokyonight.theme +0 -34
- package/dot_config/bun/bunfig.toml.tmpl +0 -33
- package/dot_config/claude/mcp_servers.json +0 -20
- package/dot_config/containers/containers.conf +0 -14
- package/dot_config/curl/dot_curlrc +0 -18
- package/dot_config/dlv/config.yml +0 -39
- package/dot_config/docker/config.json +0 -15
- package/dot_config/dotfiles/agent-card.json +0 -29
- package/dot_config/dotfiles/agent-profiles.json +0 -92
- package/dot_config/dotfiles/boot/README.md +0 -13
- package/dot_config/dotfiles/grub/README.md +0 -13
- package/dot_config/dotfiles/lock/README.md +0 -13
- package/dot_config/dotfiles/mcp-lock.json +0 -33
- package/dot_config/dotfiles/mcp-policy.json +0 -52
- package/dot_config/dotfiles/mcp-registry.json +0 -47
- package/dot_config/dotfiles/model-registry.json +0 -20
- package/dot_config/dotfiles/policy-bundles.json +0 -38
- package/dot_config/dotfiles/prompt-registry.json +0 -16
- package/dot_config/dotfiles/versions.env +0 -18
- package/dot_config/duf/duf.conf +0 -6
- package/dot_config/duti/defaults.duti +0 -5
- package/dot_config/emoji/emoji.txt +0 -34
- package/dot_config/environment.d/50-ssh-agent.conf +0 -2
- package/dot_config/environment.d/90-wayland.conf +0 -19
- package/dot_config/fastfetch/config.jsonc +0 -28
- package/dot_config/firefox/user.js.tmpl +0 -58
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
- package/dot_config/fish/completions/dot.fish.tmpl +0 -115
- package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
- package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
- package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
- package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
- package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
- package/dot_config/fish/config.fish.tmpl +0 -44
- package/dot_config/fish/fish_plugins +0 -1
- package/dot_config/fish/functions/_.fish +0 -3
- package/dot_config/fish/functions/_cached_eval.fish +0 -131
- package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
- package/dot_config/fish/functions/als.fish +0 -46
- package/dot_config/fish/functions/bg-upgrade.fish +0 -7
- package/dot_config/fish/functions/c.fish +0 -3
- package/dot_config/fish/functions/cat.fish +0 -9
- package/dot_config/fish/functions/d.fish +0 -7
- package/dot_config/fish/functions/dot.fish +0 -34
- package/dot_config/fish/functions/h.fish +0 -3
- package/dot_config/fish/functions/l.fish +0 -7
- package/dot_config/fish/functions/la.fish +0 -7
- package/dot_config/fish/functions/ll.fish +0 -7
- package/dot_config/fish/functions/log_error.fish +0 -13
- package/dot_config/fish/functions/log_info.fish +0 -13
- package/dot_config/fish/functions/lr.fish +0 -7
- package/dot_config/fish/functions/lra.fish +0 -7
- package/dot_config/fish/functions/ls.fish +0 -7
- package/dot_config/fish/functions/lt.fish +0 -7
- package/dot_config/fish/functions/lta.fish +0 -7
- package/dot_config/fish/functions/notify-run.fish +0 -11
- package/dot_config/fish/functions/q.fish +0 -3
- package/dot_config/fish/functions/silent-run.fish +0 -7
- package/dot_config/fish/functions/yy.fish +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
- package/dot_config/foot/foot.ini.tmpl +0 -33
- package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
- package/dot_config/fzf/fzf.zsh +0 -48
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -165
- package/dot_config/git/allowed_signers.tmpl +0 -18
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/commit-template +0 -10
- package/dot_config/git/hooks/executable_commit-msg +0 -146
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf +0 -11
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py +0 -19
- package/dot_config/just/justfile +0 -122
- package/dot_config/k9s/config.yaml +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/kanshi/config.tmpl +0 -22
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -53
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -35
- package/dot_config/mako/config +0 -47
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/micro/settings.json +0 -3
- package/dot_config/mimeapps.list +0 -77
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -99
- package/dot_config/mongosh/mongoshrc.js +0 -68
- package/dot_config/mpv/input.conf +0 -47
- package/dot_config/mpv/mpv.conf +0 -47
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/niri/config.kdl.tmpl +0 -327
- package/dot_config/nushell/aliases.nu +0 -18
- package/dot_config/nushell/cached_eval.nu +0 -80
- package/dot_config/nushell/completions.nu.tmpl +0 -52
- package/dot_config/nushell/config.nu.tmpl +0 -86
- package/dot_config/nushell/env.nu.tmpl +0 -102
- package/dot_config/nushell/functions.nu.tmpl +0 -17
- package/dot_config/nvim/init.lua +0 -18
- package/dot_config/nvim/lazy-lock.json +0 -58
- package/dot_config/nvim/lua/config/autocmds.lua +0 -107
- package/dot_config/nvim/lua/config/keymaps.lua +0 -92
- package/dot_config/nvim/lua/config/lazy.lua +0 -44
- package/dot_config/nvim/lua/config/options.lua +0 -49
- package/dot_config/nvim/lua/plugins/ai.lua +0 -75
- package/dot_config/nvim/lua/plugins/coding.lua +0 -216
- package/dot_config/nvim/lua/plugins/completion.lua +0 -60
- package/dot_config/nvim/lua/plugins/dap.lua +0 -412
- package/dot_config/nvim/lua/plugins/editor.lua +0 -55
- package/dot_config/nvim/lua/plugins/git.lua +0 -10
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
- package/dot_config/nvim/lua/plugins/rust.lua +0 -34
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
- package/dot_config/nvim/lua/plugins/ui.lua +0 -509
- package/dot_config/paru/paru.conf +0 -10
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
- package/dot_config/pueue/pueue.yml +0 -34
- package/dot_config/pypoetry/config.toml +0 -6
- package/dot_config/pyrightconfig.json +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/ripgrep/ripgreprc +0 -21
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -134
- package/dot_config/shell/05-core-safety.sh +0 -48
- package/dot_config/shell/10-secrets.sh +0 -41
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
- package/dot_config/shell/40-ls-colors.sh +0 -49
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -127
- package/dot_config/shell/README.md +0 -284
- package/dot_config/shell/als_data.txt.tmpl +0 -65
- package/dot_config/shell/custom/auto_ls.zsh +0 -20
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -202
- package/dot_config/swaylock/config +0 -43
- package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
- package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
- package/dot_config/systemd/user/pueued.service +0 -12
- package/dot_config/systemd/user/ssh-agent.service +0 -12
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -223
- package/dot_config/topgrade.toml.tmpl +0 -54
- package/dot_config/user-dirs.dirs +0 -10
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -82
- package/dot_config/waybar/config.jsonc.tmpl +0 -90
- package/dot_config/waybar/style.css.tmpl +0 -211
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
- package/dot_config/yarn/yarnrc.yml +0 -36
- package/dot_config/yazi/keymap.toml +0 -67
- package/dot_config/yazi/theme.toml +0 -102
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zathura/zathurarc +0 -52
- package/dot_config/zellij/config.kdl.tmpl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -7
- package/dot_config/zsh/dot_zshenv +0 -5
- package/dot_config/zsh/dot_zshrc.tmpl +0 -635
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
- package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
- package/dot_local/bin/executable_ai-update +0 -195
- package/dot_local/bin/executable_ai_core +0 -152
- package/dot_local/bin/executable_antigravity +0 -11
- package/dot_local/bin/executable_b64 +0 -84
- package/dot_local/bin/executable_bm +0 -79
- package/dot_local/bin/executable_cb +0 -39
- package/dot_local/bin/executable_dot +0 -596
- package/dot_local/bin/executable_dot-ai +0 -36
- package/dot_local/bin/executable_dot-bootstrap +0 -77
- package/dot_local/bin/executable_dot-launch-or-focus +0 -52
- package/dot_local/bin/executable_dot-load-benchmark +0 -31
- package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
- package/dot_local/bin/executable_dot-theme-sync +0 -952
- package/dot_local/bin/executable_dot_completion +0 -57
- package/dot_local/bin/executable_dtags +0 -28
- package/dot_local/bin/executable_epoch +0 -67
- package/dot_local/bin/executable_extract +0 -41
- package/dot_local/bin/executable_gbd +0 -52
- package/dot_local/bin/executable_gd +0 -42
- package/dot_local/bin/executable_git-ai-commit +0 -175
- package/dot_local/bin/executable_git-ai-diff +0 -169
- package/dot_local/bin/executable_gl +0 -101
- package/dot_local/bin/executable_hash +0 -161
- package/dot_local/bin/executable_hashsum +0 -160
- package/dot_local/bin/executable_hex +0 -115
- package/dot_local/bin/executable_jsonv +0 -78
- package/dot_local/bin/executable_jwt +0 -94
- package/dot_local/bin/executable_kill-port +0 -75
- package/dot_local/bin/executable_lorem +0 -118
- package/dot_local/bin/executable_mkscript +0 -35
- package/dot_local/bin/executable_monitor +0 -56
- package/dot_local/bin/executable_myip +0 -51
- package/dot_local/bin/executable_notify +0 -24
- package/dot_local/bin/executable_open +0 -38
- package/dot_local/bin/executable_pw +0 -27
- package/dot_local/bin/executable_rec-start +0 -46
- package/dot_local/bin/executable_rec-stop +0 -35
- package/dot_local/bin/executable_regex +0 -132
- package/dot_local/bin/executable_start-niri +0 -8
- package/dot_local/bin/executable_tmux-sessionizer +0 -314
- package/dot_local/bin/executable_tour +0 -177
- package/dot_local/bin/executable_up +0 -23
- package/dot_local/bin/executable_update +0 -142
- package/dot_local/bin/executable_uuid +0 -87
- package/dot_local/bin/executable_win +0 -32
- package/dot_local/bin/executable_yamlv +0 -57
- package/dot_local/share/bash-completion/completions/dot +0 -72
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +0 -149
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +0 -283
- package/scripts/ci/check-dangerous-chmod.sh +0 -19
- package/scripts/ci/check-deps-dev.sh +0 -236
- package/scripts/ci/check-insecure-tls.sh +0 -61
- package/scripts/ci/check-regression-traceability.sh +0 -67
- package/scripts/ci/install-chezmoi-verified.sh +0 -64
- package/scripts/ci/run-coverage.sh +0 -362
- package/scripts/ci/validate-chezmoidata.sh +0 -25
- package/scripts/ci/validate-ci-config.sh +0 -224
- package/scripts/docs/build-manual.sh +0 -883
- package/scripts/docs/check-manual.sh +0 -213
- package/scripts/dot/lib/bento.sh +0 -50
- package/scripts/dot/lib/log.sh +0 -200
- package/scripts/dot/lib/platform.sh +0 -99
- package/scripts/dot/lib/ui.sh +0 -518
- package/scripts/dot/lib/utils.sh +0 -377
- package/scripts/maintenance/check-updates.sh +0 -131
- package/scripts/release/package-policy-bundles.sh +0 -125
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Commit Signing — Policy & Setup
|
|
2
|
+
|
|
3
|
+
Every commit that reaches `master` in this repository must carry a
|
|
4
|
+
cryptographic signature that GitHub can verify. The policy is enforced
|
|
5
|
+
in three independent layers, so a single bypass does not break the
|
|
6
|
+
chain. This document explains the policy, walks through SSH and GPG
|
|
7
|
+
setup, and lists the verification commands you can run locally before
|
|
8
|
+
pushing.
|
|
9
|
+
|
|
10
|
+
## Why
|
|
11
|
+
|
|
12
|
+
Closes [#853](https://github.com/sebastienrousseau/dotfiles/issues/853).
|
|
13
|
+
Local hooks alone are bypassable — `git commit --no-verify`,
|
|
14
|
+
`git push --no-verify`, or unsetting `DOTFILES_ALLOW_UNSKIPPED_PUSH`
|
|
15
|
+
all let an unsigned commit reach a remote if GitHub-side enforcement
|
|
16
|
+
is missing. The chain below removes every escape hatch.
|
|
17
|
+
|
|
18
|
+
## Enforcement layers
|
|
19
|
+
|
|
20
|
+
1. **Local commit hook** — `dot_config/git/hooks/executable_commit-msg`
|
|
21
|
+
is deployed by chezmoi. It rejects an unsigned commit at the
|
|
22
|
+
`commit-msg` stage on the developer machine.
|
|
23
|
+
2. **Local pre-push hook** — `scripts/git-hooks/pre-push` runs
|
|
24
|
+
`git verify-commit` against every commit in the push range. A
|
|
25
|
+
single unverified commit aborts the push. `--no-verify` skips
|
|
26
|
+
this layer; the next two catch it.
|
|
27
|
+
3. **GitHub Rulesets** — `.github/rulesets/master.json` declares
|
|
28
|
+
`required_signatures` on `refs/heads/master`. The rule is part
|
|
29
|
+
of the repo so it's reproducible across forks. Apply with
|
|
30
|
+
`gh ruleset import .github/rulesets/master.json`.
|
|
31
|
+
4. **`compliance-guard.yml` workflow** — runs on every PR targeting
|
|
32
|
+
`master`. Walks the commit range with `git verify-commit` and
|
|
33
|
+
marks unsigned commits in the PR summary; fails the workflow
|
|
34
|
+
when `unsigned_count > 0`.
|
|
35
|
+
|
|
36
|
+
A merge to `master` therefore requires (Ruleset accepts the push) AND
|
|
37
|
+
(the workflow's signed-commit check passes) AND (the maintainer's
|
|
38
|
+
push key is allowed). The protection holds even if a contributor's
|
|
39
|
+
local hooks are missing or skipped.
|
|
40
|
+
|
|
41
|
+
## Setting up SSH signing (recommended)
|
|
42
|
+
|
|
43
|
+
SSH signing is the 2026 default. It reuses your existing SSH key —
|
|
44
|
+
no new key material, no GPG agent, no Kleopatra UI. GitHub has
|
|
45
|
+
recognised SSH signatures since [2022](https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/).
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
# 1. Tell git to sign with SSH.
|
|
49
|
+
git config --global gpg.format ssh
|
|
50
|
+
|
|
51
|
+
# 2. Point at the SSH key you want git to use.
|
|
52
|
+
git config --global user.signingkey "$HOME/.ssh/id_ed25519.pub"
|
|
53
|
+
|
|
54
|
+
# 3. Turn on auto-signing for every commit and tag.
|
|
55
|
+
git config --global commit.gpgsign true
|
|
56
|
+
git config --global tag.gpgsign true
|
|
57
|
+
|
|
58
|
+
# 4. Tell GitHub which SSH key signs your commits.
|
|
59
|
+
gh ssh-key add ~/.ssh/id_ed25519.pub --type signing --title "$(hostname) signing"
|
|
60
|
+
|
|
61
|
+
# 5. (Optional) Populate the allowed_signers file so
|
|
62
|
+
# `git log --show-signature` can verify locally.
|
|
63
|
+
mkdir -p "$HOME/.config/git"
|
|
64
|
+
echo "$(git config user.email) $(cat ~/.ssh/id_ed25519.pub)" \
|
|
65
|
+
> "$HOME/.config/git/allowed_signers"
|
|
66
|
+
git config --global gpg.ssh.allowedSignersFile \
|
|
67
|
+
"$HOME/.config/git/allowed_signers"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
After this, `git log --show-signature` shows `Good "git" signature
|
|
71
|
+
for you@example.com with ED25519 key SHA256:…` on every new commit.
|
|
72
|
+
|
|
73
|
+
## Setting up GPG signing (legacy / for tag-signing mirrors that don't yet support SSH)
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
# 1. Generate or import a key. ED25519 is the modern recommendation;
|
|
77
|
+
# RSA-4096 is the conservative fallback.
|
|
78
|
+
gpg --quick-generate-key "Your Name <you@example.com>" ed25519 sign 2y
|
|
79
|
+
|
|
80
|
+
# 2. Find the long key ID.
|
|
81
|
+
gpg --list-secret-keys --keyid-format=long
|
|
82
|
+
|
|
83
|
+
# 3. Tell git which key.
|
|
84
|
+
git config --global user.signingkey <LONG_KEY_ID>
|
|
85
|
+
git config --global commit.gpgsign true
|
|
86
|
+
|
|
87
|
+
# 4. Export and upload the public key to GitHub.
|
|
88
|
+
gpg --armor --export <LONG_KEY_ID> | gh gpg-key add -
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Verifying locally before pushing
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
# Every commit in the push range.
|
|
95
|
+
git log "$(git merge-base @{u} HEAD)..HEAD" \
|
|
96
|
+
--pretty='%H %G? %s' \
|
|
97
|
+
| awk '$2 != "G" {print "UNSIGNED:", $0}'
|
|
98
|
+
|
|
99
|
+
# Or the canonical command the pre-push hook uses:
|
|
100
|
+
for c in $(git rev-list "$(git merge-base @{u} HEAD)..HEAD"); do
|
|
101
|
+
git verify-commit "$c" >/dev/null 2>&1 \
|
|
102
|
+
&& echo "✓ $c" \
|
|
103
|
+
|| echo "✗ $c — unsigned, will be rejected by master ruleset"
|
|
104
|
+
done
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Troubleshooting
|
|
108
|
+
|
|
109
|
+
| Symptom | Likely cause | Fix |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `error: gpg failed to sign the data` | gpg-agent isn't running, or `GPG_TTY` not exported | `export GPG_TTY=$(tty)` in your shell rc; restart agent with `gpgconf --kill gpg-agent` |
|
|
112
|
+
| `error: Load key "/.../id_ed25519": Permission denied` | SSH key permissions too open | `chmod 600 ~/.ssh/id_ed25519` |
|
|
113
|
+
| GitHub shows "Unverified" on a commit signed locally | Signing key not uploaded to GitHub | `gh ssh-key add … --type signing` (SSH) or `gh gpg-key add` (GPG) |
|
|
114
|
+
| Pre-push hook rejects a merge commit you didn't author | Upstream commit lacks a signature | Either pull the rebased branch, or fast-forward instead of merging |
|
|
115
|
+
| Ruleset import via `gh` complains "invalid JSON" | Rulesets API expects the `target` + `rules` envelope, not just the rules array | Use the file as-is — `gh ruleset import .github/rulesets/master.json` |
|
|
116
|
+
|
|
117
|
+
## Re-applying the ruleset after a manual edit
|
|
118
|
+
|
|
119
|
+
If someone edits the ruleset in the GitHub UI by mistake, the
|
|
120
|
+
file-of-truth wins. Re-apply:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
gh api -X POST repos/{owner}/{repo}/rulesets \
|
|
124
|
+
--input .github/rulesets/master.json
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
(or `-X PUT` against the existing ruleset's ID if it already exists).
|
|
128
|
+
|
|
129
|
+
## References
|
|
130
|
+
|
|
131
|
+
- `.github/rulesets/master.json` — the enforced policy.
|
|
132
|
+
- `.github/workflows/compliance-guard.yml` — the workflow that
|
|
133
|
+
fails PRs containing unsigned commits.
|
|
134
|
+
- `scripts/git-hooks/pre-push` — the local pre-push gate.
|
|
135
|
+
- `dot_config/git/hooks/executable_commit-msg` — the local
|
|
136
|
+
commit-msg gate.
|
|
137
|
+
- [GitHub: About commit signature verification](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification)
|
|
138
|
+
- [GitHub: Telling Git about your SSH key](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key)
|
|
@@ -19,7 +19,7 @@ Managed under [#877](https://github.com/sebastienrousseau/dotfiles/issues/877).
|
|
|
19
19
|
|
|
20
20
|
## Active exceptions
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
*(none currently)*
|
|
23
23
|
|
|
24
24
|
## Adding an exception
|
|
25
25
|
|
|
@@ -79,7 +79,7 @@ auto-fail the gate even when they're still listed here.
|
|
|
79
79
|
|
|
80
80
|
## References
|
|
81
81
|
|
|
82
|
-
- [`
|
|
82
|
+
- [`tools/ci/check-deps-dev.sh`](../../tools/ci/check-deps-dev.sh) — the scanner.
|
|
83
83
|
- [`.github/workflows/deps-dev-validation.yml`](../../.github/workflows/deps-dev-validation.yml) — CI wiring.
|
|
84
84
|
- [`tests/unit/security/test_check_deps_dev.sh`](../../tests/unit/security/test_check_deps_dev.sh) — contract test against canned fixtures.
|
|
85
85
|
- [deps.dev API reference](https://docs.deps.dev/api/v3/).
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Encrypted Security Disclosure — Reporter Workflow
|
|
2
|
+
|
|
3
|
+
This document is for **external security researchers** who have found
|
|
4
|
+
an issue in this repository and want to report it without exposing
|
|
5
|
+
sensitive details (PII, exploit chains, internal infrastructure) in
|
|
6
|
+
transit or at rest on third-party servers.
|
|
7
|
+
|
|
8
|
+
If your report doesn't need encryption, please use
|
|
9
|
+
[GitHub Security Advisories](https://github.com/sebastienrousseau/dotfiles/security/advisories)
|
|
10
|
+
instead — it's faster and the GitHub-side audit trail is stronger.
|
|
11
|
+
|
|
12
|
+
## 1. Fetch the maintainer's public key
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
# Web Key Directory is the modern recommendation.
|
|
16
|
+
gpg --auto-key-locate clear,wkd \
|
|
17
|
+
--locate-keys security@sebastienrousseau.com
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
If WKD fails (offline keyserver, corporate proxy), download directly:
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
curl -fsSL \
|
|
24
|
+
https://sebastienrousseau.com/.well-known/openpgpkey/hu/qpzqfwauiwxnu1xrf5h47bunsho44p6f \
|
|
25
|
+
| gpg --import
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 2. Verify the fingerprint
|
|
29
|
+
|
|
30
|
+
**Do not skip this step.** A MITM attacker can serve their own key.
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
gpg --fingerprint security@sebastienrousseau.com
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The fingerprint must match the one published in
|
|
37
|
+
[`.github/SECURITY.md`](../../.github/SECURITY.md). Cross-verify
|
|
38
|
+
against the SSH signing key in `dot_config/git/allowed_signers.tmpl`
|
|
39
|
+
— the maintainer signs commits with the same identity, so both
|
|
40
|
+
fingerprints derive from the same identity claim.
|
|
41
|
+
|
|
42
|
+
If the two fingerprints don't match, **stop**. Open a private
|
|
43
|
+
[Security Advisory](https://github.com/sebastienrousseau/dotfiles/security/advisories/new)
|
|
44
|
+
and ask the maintainer to confirm the key out-of-band.
|
|
45
|
+
|
|
46
|
+
## 3. Encrypt your report
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
cat <<EOF | gpg --encrypt --armor \
|
|
50
|
+
--recipient security@sebastienrousseau.com \
|
|
51
|
+
--output disclosure.asc
|
|
52
|
+
Subject: <short description of the issue>
|
|
53
|
+
|
|
54
|
+
<full details — repro steps, affected versions, exploit, screenshots
|
|
55
|
+
referenced by base64-encoded attachments, contact info for follow-up>
|
|
56
|
+
EOF
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Verify the output is an ASCII-armored OpenPGP message before sending:
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
head -1 disclosure.asc
|
|
63
|
+
# Expected: -----BEGIN PGP MESSAGE-----
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 4. Send
|
|
67
|
+
|
|
68
|
+
Attach `disclosure.asc` to an email to
|
|
69
|
+
**<security@sebastienrousseau.com>**.
|
|
70
|
+
|
|
71
|
+
Subject line: `[dotfiles] <severity>: <short description>` (no
|
|
72
|
+
encryption-sensitive content in the subject; mail relays log
|
|
73
|
+
subjects in plain text).
|
|
74
|
+
|
|
75
|
+
## 5. Acknowledgement
|
|
76
|
+
|
|
77
|
+
You should receive an acknowledgement within the SLA in
|
|
78
|
+
[`.github/SECURITY.md`](../../.github/SECURITY.md):
|
|
79
|
+
|
|
80
|
+
| Severity | Initial response |
|
|
81
|
+
|---|---|
|
|
82
|
+
| Critical | 24 hours |
|
|
83
|
+
| High | 72 hours |
|
|
84
|
+
| Medium | 5 business days |
|
|
85
|
+
| Low | 10 business days |
|
|
86
|
+
|
|
87
|
+
The acknowledgement will be signed with the same key you encrypted
|
|
88
|
+
to. Verify the signature:
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
gpg --verify response.asc
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
If you don't receive an acknowledgement in the SLA window, or the
|
|
95
|
+
acknowledgement signature doesn't verify, escalate by:
|
|
96
|
+
|
|
97
|
+
1. Opening a private GitHub Security Advisory.
|
|
98
|
+
2. DM-ing the maintainer on Mastodon: `@sebastienrousseau@hachyderm.io`.
|
|
99
|
+
|
|
100
|
+
## 6. After disclosure
|
|
101
|
+
|
|
102
|
+
The maintainer commits to:
|
|
103
|
+
|
|
104
|
+
- A fix timeline communicated within the SLA.
|
|
105
|
+
- A CVE assignment when severity ≥ Medium and the issue affects
|
|
106
|
+
published releases (npm package, release tarballs).
|
|
107
|
+
- Public credit at fix time in the release notes (unless you
|
|
108
|
+
request anonymity at report time).
|
|
109
|
+
- A backport to any actively-supported release line listed in
|
|
110
|
+
`.github/SECURITY.md`.
|
|
111
|
+
|
|
112
|
+
## What NOT to do
|
|
113
|
+
|
|
114
|
+
- Don't post details in a public issue, even a "I found a bug, ping
|
|
115
|
+
me for details" placeholder — every public reference is a tip-off
|
|
116
|
+
to attackers monitoring the repo.
|
|
117
|
+
- Don't disclose to third parties (other dotfile maintainers,
|
|
118
|
+
security mailing lists, blog posts) before the embargo lifts.
|
|
119
|
+
- Don't access data or systems you don't own.
|
|
120
|
+
- Don't run automated scans against `*.sebastienrousseau.com` that
|
|
121
|
+
exceed normal browser-like traffic.
|
|
122
|
+
|
|
123
|
+
## See also
|
|
124
|
+
|
|
125
|
+
- [`.github/SECURITY.md`](../../.github/SECURITY.md) — policy
|
|
126
|
+
overview + fingerprint.
|
|
127
|
+
- [`docs/security/KEY_ROTATION.md`](KEY_ROTATION.md) — schedule for
|
|
128
|
+
when the disclosure key is rotated.
|
|
129
|
+
- [`docs/security/AUDIT_BYPASS.md`](AUDIT_BYPASS.md) — separate flow
|
|
130
|
+
for the pre-push audit bypass (not for disclosure).
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Fuzzing"
|
|
3
|
+
date: 2026-05-17
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Fuzzing
|
|
7
|
+
|
|
8
|
+
The project ships native-Go fuzz harnesses for every user-input
|
|
9
|
+
parsing surface in the framework. The harnesses run locally via
|
|
10
|
+
`go test -fuzz`, in CI on every PR via `.github/workflows/fuzz.yml`,
|
|
11
|
+
and (pending upstream submission) continuously on Google's OSS-Fuzz
|
|
12
|
+
infrastructure.
|
|
13
|
+
|
|
14
|
+
## Why Go fuzzing
|
|
15
|
+
|
|
16
|
+
The framework is bash. Bash has no first-class fuzzing framework
|
|
17
|
+
that OpenSSF Scorecard recognises (Scorecard scores `Fuzzing` 0
|
|
18
|
+
unless the project ships an integration with one of: OSS-Fuzz,
|
|
19
|
+
ClusterFuzzLite, native Go fuzz, libFuzzer, Atheris). The
|
|
20
|
+
pragmatic path is to **port each user-input parsing surface
|
|
21
|
+
into a small Go function**, run the fuzzer against the Go port,
|
|
22
|
+
and keep the Go port in lockstep with the shell original via
|
|
23
|
+
identical regex / control-flow.
|
|
24
|
+
|
|
25
|
+
Drift between the shell and Go port IS the bug class the
|
|
26
|
+
fuzzer is designed to surface — if the Go port accepts a string
|
|
27
|
+
the shell rejects (or vice-versa), one of them has a hole.
|
|
28
|
+
|
|
29
|
+
## Harnesses today
|
|
30
|
+
|
|
31
|
+
| Harness | Mirrors | What it proves |
|
|
32
|
+
|---------|---------|----------------|
|
|
33
|
+
| `FuzzValidateName` | `scripts/dot/lib/utils.sh:101` (`validate_name`) | Every accepted name contains only `[a-zA-Z0-9._-]`; no shell metacharacter slips through; empty input refused. |
|
|
34
|
+
| `FuzzInitURLResolver` | `scripts/dot/commands/init.sh` (URL construction in `dot init <user\|owner/repo\|url>`) | Accepted URLs use `https://` / `git@` / `ssh://` only; plain HTTP refused; no shell metacharacters in constructed URLs; one input shape per acceptable form. |
|
|
35
|
+
|
|
36
|
+
Add a harness when:
|
|
37
|
+
|
|
38
|
+
- a new `dot <subcommand>` accepts user input via `$1` / `--flag`,
|
|
39
|
+
- a new regex appears in `scripts/dot/lib/utils.sh`,
|
|
40
|
+
- a new "construct a URL / path / shell-eval string" code path lands.
|
|
41
|
+
|
|
42
|
+
## Running locally
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
cd oss-fuzz-integration/fuzz
|
|
46
|
+
|
|
47
|
+
# 30-second smoke (find regressions quickly)
|
|
48
|
+
go test -run TestNothing -fuzz=FuzzValidateName -fuzztime=30s ./...
|
|
49
|
+
go test -run TestNothing -fuzz=FuzzInitURLResolver -fuzztime=30s ./...
|
|
50
|
+
|
|
51
|
+
# Longer run when investigating a flake
|
|
52
|
+
go test -run TestNothing -fuzz=FuzzValidateName -fuzztime=10m ./...
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Failures land in `testdata/fuzz/Fuzz<Name>/` as auto-saved
|
|
56
|
+
reproducers. Commit them — they become permanent regression
|
|
57
|
+
guards via `go test ./...`.
|
|
58
|
+
|
|
59
|
+
## OSS-Fuzz integration (pending)
|
|
60
|
+
|
|
61
|
+
The `oss-fuzz-integration/` directory contains everything OSS-Fuzz
|
|
62
|
+
needs to onboard this project:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
oss-fuzz-integration/
|
|
66
|
+
├── project.yaml # OSS-Fuzz project metadata
|
|
67
|
+
├── Dockerfile # build environment
|
|
68
|
+
├── build.sh # compiles every harness in fuzz/
|
|
69
|
+
└── fuzz/ # the harnesses themselves
|
|
70
|
+
├── go.mod
|
|
71
|
+
├── validate_name_test.go
|
|
72
|
+
└── init_url_resolver_test.go
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
To onboard:
|
|
76
|
+
|
|
77
|
+
1. Fork `github.com/google/oss-fuzz`.
|
|
78
|
+
2. Copy `oss-fuzz-integration/` contents to `projects/dotfiles/` in the fork.
|
|
79
|
+
3. Verify locally per <https://google.github.io/oss-fuzz/getting-started/new-project-guide/#testing-locally>:
|
|
80
|
+
|
|
81
|
+
```sh
|
|
82
|
+
python infra/helper.py build_image dotfiles
|
|
83
|
+
python infra/helper.py build_fuzzers --sanitizer address dotfiles
|
|
84
|
+
python infra/helper.py check_build dotfiles
|
|
85
|
+
python infra/helper.py run_fuzzer dotfiles fuzz_validate_name
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
4. Open a PR to `google/oss-fuzz` per <https://google.github.io/oss-fuzz/getting-started/accepting-new-projects/>.
|
|
89
|
+
5. Once merged, OSS-Fuzz schedules continuous runs on GCP; findings land as private issues in the OSS-Fuzz tracker and are mirrored to the maintainer email in `project.yaml`.
|
|
90
|
+
6. Update `docs/security/SCORECARD.md` — Scorecard's `Fuzzing` check recognises OSS-Fuzz projects automatically (0 → 10).
|
|
91
|
+
|
|
92
|
+
The upstream PR opens the door to the **CIFuzz** GitHub Action,
|
|
93
|
+
which runs OSS-Fuzz-style fuzzing on every PR in this repo
|
|
94
|
+
(separate from the local-go-fuzz CI job).
|
|
95
|
+
|
|
96
|
+
## CI workflow
|
|
97
|
+
|
|
98
|
+
`.github/workflows/fuzz.yml` (planned) runs each harness for
|
|
99
|
+
60 seconds on every PR touching:
|
|
100
|
+
|
|
101
|
+
- `scripts/dot/lib/utils.sh`
|
|
102
|
+
- `scripts/dot/commands/init.sh`
|
|
103
|
+
- `oss-fuzz-integration/**`
|
|
104
|
+
|
|
105
|
+
This is the local equivalent of CIFuzz and catches the
|
|
106
|
+
"shell-regex-change without Go-port update" drift class before
|
|
107
|
+
PR merge.
|
|
108
|
+
|
|
109
|
+
## See also
|
|
110
|
+
|
|
111
|
+
- `docs/security/SCORECARD.md` — `Fuzzing` check tracking.
|
|
112
|
+
- [Go native fuzzing tutorial](https://go.dev/doc/tutorial/fuzz).
|
|
113
|
+
- [OSS-Fuzz new project guide](https://google.github.io/oss-fuzz/getting-started/new-project-guide/).
|
|
114
|
+
- [CIFuzz GitHub Action](https://google.github.io/oss-fuzz/getting-started/continuous-integration/).
|
|
@@ -27,7 +27,7 @@ the install never starts.
|
|
|
27
27
|
### 2. The `chezmoi` binary (always verified when possible)
|
|
28
28
|
|
|
29
29
|
`install.sh` prefers the bundled checksum-verified installer at
|
|
30
|
-
`
|
|
30
|
+
`tools/ci/install-chezmoi-verified.sh`, which:
|
|
31
31
|
|
|
32
32
|
- Resolves the platform (`uname -s` + `uname -m`).
|
|
33
33
|
- Downloads `chezmoi_<version>_<os>_<arch>.tar.gz` AND the matching
|
|
@@ -115,7 +115,7 @@ PR.
|
|
|
115
115
|
## References
|
|
116
116
|
|
|
117
117
|
- `install.sh` — the entry point.
|
|
118
|
-
- `
|
|
118
|
+
- `tools/ci/install-chezmoi-verified.sh` — the SHA256-pinned
|
|
119
119
|
chezmoi installer.
|
|
120
120
|
- `tests/unit/install/test_install_chezmoi_verified.sh` — the
|
|
121
121
|
negative test.
|
|
@@ -4,7 +4,87 @@ render_with_liquid: false
|
|
|
4
4
|
|
|
5
5
|
# Key Rotation Guide
|
|
6
6
|
|
|
7
|
-
This
|
|
7
|
+
This page tracks two distinct key lifecycles:
|
|
8
|
+
|
|
9
|
+
1. **Disclosure key** — the GPG key reporters use to encrypt vulnerability reports to the maintainer. Single key, public, rotated annually or on compromise. Source of truth for the active fingerprint is `.github/SECURITY.md`.
|
|
10
|
+
2. **Secrets encryption keys** — the Age and SOPS keys that protect encrypted dotfiles in this repo. Multiple keys, per-machine, rotated annually or on personnel / device change.
|
|
11
|
+
|
|
12
|
+
Both sections live here so a single audit can confirm the project's
|
|
13
|
+
posture across encrypted-disclosure-in and encrypted-secrets-at-rest.
|
|
14
|
+
|
|
15
|
+
## Disclosure Key (GPG)
|
|
16
|
+
|
|
17
|
+
Closes the rotation half of [#870](https://github.com/sebastienrousseau/dotfiles/issues/870).
|
|
18
|
+
|
|
19
|
+
### Active key
|
|
20
|
+
|
|
21
|
+
| Field | Value |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Identity | `security@sebastienrousseau.com` |
|
|
24
|
+
| Fingerprint | `55AFAD364FD9DB3819E61F0C8D688FAFA9144693` |
|
|
25
|
+
| Algorithm | ED25519 signing primary + CV25519 encryption subkey |
|
|
26
|
+
| Created | 2026-05-16 |
|
|
27
|
+
| Expires | 2029-05-15 (3 years from creation) |
|
|
28
|
+
| WKD URL | <https://sebastienrousseau.com/.well-known/openpgpkey/hu/qpzqfwauiwxnu1xrf5h47bunsho44p6f> |
|
|
29
|
+
| Cross-reference | matches the SSH signing key in `dot_config/git/allowed_signers.tmpl` |
|
|
30
|
+
|
|
31
|
+
### Rotation triggers
|
|
32
|
+
|
|
33
|
+
| Trigger | Response time | Action |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| Annual cadence | Within 30 days of expiry | Generate new key, publish, sign transition statement with the old key, archive old key below. |
|
|
36
|
+
| Suspected compromise | Same day | Revoke immediately, publish revocation cert to WKD, replay in-flight encrypted disclosures with the new key. |
|
|
37
|
+
| Algorithm deprecation | Within 90 days of advisory | Generate replacement on a stronger algorithm; follow annual-cadence steps. |
|
|
38
|
+
| Maintainer change | Same day as handover | Old maintainer signs a transition statement; old key revoked 30 days after handover. |
|
|
39
|
+
|
|
40
|
+
### Rotation procedure
|
|
41
|
+
|
|
42
|
+
1. Generate the new key (air-gapped where possible):
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
gpg --quick-generate-key \
|
|
46
|
+
"Sebastien Rousseau (Security) <security@sebastienrousseau.com>" \
|
|
47
|
+
ed25519 sign 1y
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
2. Sign a transition statement with the OLD key:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
gpg --clearsign <<EOF
|
|
54
|
+
Transition statement, $(date -u +%Y-%m-%dT%H:%M:%SZ).
|
|
55
|
+
The disclosure key for security@sebastienrousseau.com rotates from:
|
|
56
|
+
OLD: <old-fingerprint>
|
|
57
|
+
NEW: <new-fingerprint>
|
|
58
|
+
Encrypted reports sent to either key during the 30-day overlap
|
|
59
|
+
will be accepted. After <UTC-cutoff>, only the new key is honoured.
|
|
60
|
+
EOF
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. Publish the new key to:
|
|
64
|
+
- `sebastienrousseau.com/.well-known/openpgpkey/hu/` (WKD)
|
|
65
|
+
- the maintainer's keyoxide profile if applicable
|
|
66
|
+
|
|
67
|
+
4. Update the "Active key" table above with the new fingerprint and
|
|
68
|
+
move the previous row into the "Historical disclosure keys"
|
|
69
|
+
table below with the actual revocation date.
|
|
70
|
+
|
|
71
|
+
5. Commit, signing with both old and new keys during the overlap:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
git commit -S -m "security(key): rotate disclosure key $(date +%Y-%m)" \
|
|
75
|
+
-m "$(cat transition.asc)"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
6. After the 30-day overlap, revoke the old key and publish the
|
|
79
|
+
revocation cert to the same WKD endpoint.
|
|
80
|
+
|
|
81
|
+
### Historical disclosure keys
|
|
82
|
+
|
|
83
|
+
| From | Until | Fingerprint | Reason for rotation |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| *(none yet — first key)* | *—* | *—* | *—* |
|
|
86
|
+
|
|
87
|
+
---
|
|
8
88
|
|
|
9
89
|
## Age Key Rotation
|
|
10
90
|
|
|
@@ -19,8 +19,8 @@ They include:
|
|
|
19
19
|
## Local packaging
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
bash
|
|
23
|
-
bash
|
|
22
|
+
bash tools/release/package-policy-bundles.sh --version 2026.03
|
|
23
|
+
bash tools/release/package-policy-bundles.sh --json
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
## Release workflow
|