@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.
Files changed (420) hide show
  1. package/CHANGELOG.md +155 -4
  2. package/LICENSE +21 -1283
  3. package/README.md +40 -8
  4. package/docs/CONFIG_STRATEGY.md +124 -0
  5. package/docs/COPYRIGHT +1 -1
  6. package/docs/GOVERNANCE.md +98 -0
  7. package/docs/MAINTAINERS.md +41 -0
  8. package/docs/OPENCODE.md +127 -0
  9. package/docs/README.md +2 -0
  10. package/docs/STRUCTURE.md +102 -0
  11. package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
  12. package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
  13. package/docs/architecture/REPO_LAYOUT.md +8 -8
  14. package/docs/archive/MILESTONE_v0.2.493.md +1 -1
  15. package/docs/index.md +2 -2
  16. package/docs/interop/POWERSHELL.md +1 -1
  17. package/docs/manual/00-introduction.md +1 -1
  18. package/docs/manual/01-concepts/02-trust-model.md +1 -1
  19. package/docs/manual/03-reference/01-dot-cli.md +63 -45
  20. package/docs/manual/03-reference/02-config-files.md +2 -2
  21. package/docs/manual/03-reference/05-feature-flags.md +62 -3
  22. package/docs/manual/_toc.yml +1 -1
  23. package/docs/manual/command-index.md +72 -55
  24. package/docs/manual/index.md +66 -0
  25. package/docs/operations/CI_COMPOSITES.md +2 -2
  26. package/docs/operations/COMPLETIONS.md +2 -2
  27. package/docs/operations/COVERAGE.md +40 -6
  28. package/docs/operations/HARD_AUDIT_2026.md +631 -0
  29. package/docs/operations/MAINTENANCE.md +3 -3
  30. package/docs/operations/MANIFEST.md +127 -0
  31. package/docs/operations/REGISTRY.md +89 -0
  32. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  33. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  34. package/docs/operations/ROADMAP_2026.md +665 -0
  35. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  36. package/docs/operations/TESTING.md +17 -0
  37. package/docs/operations/TRACEABILITY.md +9 -3
  38. package/docs/operations/VERSION_SYNC.md +4 -4
  39. package/docs/reference/POWERSHELL_PARITY.md +81 -0
  40. package/docs/registry.json +6 -0
  41. package/docs/schema/dot-env-v1.json +110 -0
  42. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  43. package/docs/security/CI_PINNING.md +121 -0
  44. package/docs/security/COMMIT_SIGNING.md +138 -0
  45. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  46. package/docs/security/DISCLOSURE.md +130 -0
  47. package/docs/security/FUZZING.md +114 -0
  48. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  49. package/docs/security/KEY_ROTATION.md +81 -1
  50. package/docs/security/POLICY_RELEASES.md +2 -2
  51. package/docs/security/SCORECARD.md +130 -15
  52. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  53. package/docs/security/VERIFY_RELEASE.md +201 -0
  54. package/docs/security/security-pubkey.asc +15 -0
  55. package/install.sh +67 -38
  56. package/package.json +1 -1
  57. package/scripts/README.md +123 -0
  58. package/scripts/ci/check-copyright-headers.sh +4 -93
  59. package/scripts/ci/check-shell-preamble.sh +4 -103
  60. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  61. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  62. package/scripts/diagnostics/alias-governance.sh +1 -1
  63. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  64. package/scripts/diagnostics/benchmark.sh +4 -4
  65. package/scripts/diagnostics/conflicts.sh +2 -2
  66. package/scripts/diagnostics/doctor-unified.sh +2 -2
  67. package/scripts/diagnostics/doctor.sh +45 -15
  68. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  69. package/scripts/diagnostics/health.sh +4 -4
  70. package/scripts/diagnostics/history-analysis.sh +2 -2
  71. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  72. package/scripts/diagnostics/perf.sh +4 -4
  73. package/scripts/diagnostics/scorecard.sh +4 -4
  74. package/scripts/diagnostics/security-score.sh +2 -2
  75. package/scripts/diagnostics/smoke-test.sh +2 -2
  76. package/scripts/diagnostics/snapshot.sh +2 -2
  77. package/scripts/diagnostics/verify.sh +4 -4
  78. package/scripts/diagnostics/version-locks.sh +2 -2
  79. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  80. package/scripts/dot/commands/agent.sh +27 -22
  81. package/scripts/dot/commands/agents.sh +335 -0
  82. package/scripts/dot/commands/ai.sh +144 -25
  83. package/scripts/dot/commands/aliases.sh +10 -8
  84. package/scripts/dot/commands/appearance.sh +2 -2
  85. package/scripts/dot/commands/core.sh +12 -6
  86. package/scripts/dot/commands/diagnostics.sh +5 -5
  87. package/scripts/dot/commands/env-emit.sh +202 -0
  88. package/scripts/dot/commands/fleet.sh +290 -14
  89. package/scripts/dot/commands/init.sh +184 -0
  90. package/scripts/dot/commands/lint.sh +9 -4
  91. package/scripts/dot/commands/manual.sh +3 -3
  92. package/scripts/dot/commands/meta.sh +19 -10
  93. package/scripts/dot/commands/patterns.sh +2 -2
  94. package/scripts/dot/commands/registry.sh +263 -0
  95. package/scripts/dot/commands/restore.sh +4 -4
  96. package/scripts/dot/commands/secrets.sh +4 -3
  97. package/scripts/dot/commands/security.sh +2 -2
  98. package/scripts/dot/commands/tools.sh +62 -4
  99. package/scripts/dot/powershell/Dot.psm1 +199 -0
  100. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  101. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  102. package/scripts/git-hooks/pre-push +13 -0
  103. package/scripts/lib/secrets_provider.sh +32 -6
  104. package/scripts/ops/ai-setup.sh +1 -1
  105. package/scripts/ops/bundle.sh +2 -2
  106. package/scripts/ops/chaos.sh +2 -2
  107. package/scripts/ops/chezmoi-apply.sh +4 -4
  108. package/scripts/ops/heal.sh +4 -4
  109. package/scripts/ops/post-apply-repair.sh +2 -2
  110. package/scripts/ops/prewarm.sh +2 -2
  111. package/scripts/ops/release.sh +4 -4
  112. package/scripts/ops/rollback.sh +18 -4
  113. package/scripts/ops/setup.sh +2 -2
  114. package/scripts/qa/check-version-consistency.sh +123 -0
  115. package/scripts/qa/coverage-baseline.sh +1 -1
  116. package/scripts/qa/docs-coverage.sh +2 -2
  117. package/scripts/qa/powershell-contract.ps1 +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +127 -0
  119. package/scripts/security/backup.sh +2 -2
  120. package/scripts/security/check-disclosure-key-expiry.sh +110 -0
  121. package/scripts/security/dns-doh.sh +4 -4
  122. package/scripts/security/encryption-check.sh +4 -4
  123. package/scripts/security/enforce-policies.sh +2 -2
  124. package/scripts/security/firewall.sh +4 -4
  125. package/scripts/security/lock-configs.sh +11 -2
  126. package/scripts/security/lock-screen.sh +4 -4
  127. package/scripts/security/manage-secrets.sh +2 -2
  128. package/scripts/security/ssh-cert.sh +2 -2
  129. package/scripts/security/telemetry-kill.sh +4 -4
  130. package/scripts/security/usb-safety.sh +4 -4
  131. package/scripts/theme/extract-heic-frames.sh +114 -0
  132. package/scripts/theme/rebuild-themes.sh +8 -1
  133. package/scripts/theme/switch.sh +13 -6
  134. package/scripts/theme/wallpaper-sync.sh +297 -93
  135. package/scripts/tuning/linux.sh +2 -2
  136. package/scripts/tuning/macos.sh +2 -2
  137. package/scripts/version-sync.sh +58 -7
  138. package/dot_config/.module-manifest.json +0 -69
  139. package/dot_config/ai/identity.md +0 -23
  140. package/dot_config/ai/patterns/architect.md +0 -16
  141. package/dot_config/ai/patterns/hardener.md +0 -15
  142. package/dot_config/ai/patterns/refactor.md +0 -15
  143. package/dot_config/aider/aider.conf.yml +0 -32
  144. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  145. package/dot_config/ansible/ansible.cfg +0 -11
  146. package/dot_config/atuin/config.toml.tmpl +0 -47
  147. package/dot_config/bat/config +0 -23
  148. package/dot_config/brave-flags.conf.tmpl +0 -7
  149. package/dot_config/btop/btop.conf +0 -16
  150. package/dot_config/btop/themes/tokyonight.theme +0 -34
  151. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  152. package/dot_config/claude/mcp_servers.json +0 -20
  153. package/dot_config/containers/containers.conf +0 -14
  154. package/dot_config/curl/dot_curlrc +0 -18
  155. package/dot_config/dlv/config.yml +0 -39
  156. package/dot_config/docker/config.json +0 -15
  157. package/dot_config/dotfiles/agent-card.json +0 -29
  158. package/dot_config/dotfiles/agent-profiles.json +0 -92
  159. package/dot_config/dotfiles/boot/README.md +0 -13
  160. package/dot_config/dotfiles/grub/README.md +0 -13
  161. package/dot_config/dotfiles/lock/README.md +0 -13
  162. package/dot_config/dotfiles/mcp-lock.json +0 -33
  163. package/dot_config/dotfiles/mcp-policy.json +0 -52
  164. package/dot_config/dotfiles/mcp-registry.json +0 -47
  165. package/dot_config/dotfiles/model-registry.json +0 -20
  166. package/dot_config/dotfiles/policy-bundles.json +0 -38
  167. package/dot_config/dotfiles/prompt-registry.json +0 -16
  168. package/dot_config/dotfiles/versions.env +0 -18
  169. package/dot_config/duf/duf.conf +0 -6
  170. package/dot_config/duti/defaults.duti +0 -5
  171. package/dot_config/emoji/emoji.txt +0 -34
  172. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  173. package/dot_config/environment.d/90-wayland.conf +0 -19
  174. package/dot_config/fastfetch/config.jsonc +0 -28
  175. package/dot_config/firefox/user.js.tmpl +0 -58
  176. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  177. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  178. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  179. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  180. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  181. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  182. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  183. package/dot_config/fish/config.fish.tmpl +0 -44
  184. package/dot_config/fish/fish_plugins +0 -1
  185. package/dot_config/fish/functions/_.fish +0 -3
  186. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  187. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  188. package/dot_config/fish/functions/als.fish +0 -46
  189. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  190. package/dot_config/fish/functions/c.fish +0 -3
  191. package/dot_config/fish/functions/cat.fish +0 -9
  192. package/dot_config/fish/functions/d.fish +0 -7
  193. package/dot_config/fish/functions/dot.fish +0 -34
  194. package/dot_config/fish/functions/h.fish +0 -3
  195. package/dot_config/fish/functions/l.fish +0 -7
  196. package/dot_config/fish/functions/la.fish +0 -7
  197. package/dot_config/fish/functions/ll.fish +0 -7
  198. package/dot_config/fish/functions/log_error.fish +0 -13
  199. package/dot_config/fish/functions/log_info.fish +0 -13
  200. package/dot_config/fish/functions/lr.fish +0 -7
  201. package/dot_config/fish/functions/lra.fish +0 -7
  202. package/dot_config/fish/functions/ls.fish +0 -7
  203. package/dot_config/fish/functions/lt.fish +0 -7
  204. package/dot_config/fish/functions/lta.fish +0 -7
  205. package/dot_config/fish/functions/notify-run.fish +0 -11
  206. package/dot_config/fish/functions/q.fish +0 -3
  207. package/dot_config/fish/functions/silent-run.fish +0 -7
  208. package/dot_config/fish/functions/yy.fish +0 -8
  209. package/dot_config/flatpak/flatpak.list +0 -4
  210. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  211. package/dot_config/foot/foot.ini.tmpl +0 -33
  212. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  213. package/dot_config/fzf/fzf.zsh +0 -48
  214. package/dot_config/gem/gemrc +0 -9
  215. package/dot_config/gh/config.yml +0 -12
  216. package/dot_config/ghostty/config.tmpl +0 -165
  217. package/dot_config/git/allowed_signers.tmpl +0 -18
  218. package/dot_config/git/attributes +0 -12
  219. package/dot_config/git/commit-template +0 -10
  220. package/dot_config/git/hooks/executable_commit-msg +0 -146
  221. package/dot_config/git/ignore +0 -27
  222. package/dot_config/gnupg/gpg-agent.conf +0 -11
  223. package/dot_config/go/golangci.yml +0 -118
  224. package/dot_config/go/gopls.json +0 -30
  225. package/dot_config/goose/config.yaml +0 -29
  226. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  227. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  228. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  229. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  230. package/dot_config/htop/htoprc +0 -20
  231. package/dot_config/inputrc +0 -2
  232. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  233. package/dot_config/just/justfile +0 -122
  234. package/dot_config/k9s/config.yaml +0 -65
  235. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  236. package/dot_config/kanshi/config.tmpl +0 -22
  237. package/dot_config/karabiner/karabiner.json +0 -14
  238. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  239. package/dot_config/lazydocker/config.yml +0 -186
  240. package/dot_config/lazygit/config.yml +0 -35
  241. package/dot_config/mako/config +0 -47
  242. package/dot_config/mas/masapps.txt +0 -5
  243. package/dot_config/micro/settings.json +0 -3
  244. package/dot_config/mimeapps.list +0 -77
  245. package/dot_config/minikube/config.json +0 -13
  246. package/dot_config/mise/config.toml +0 -99
  247. package/dot_config/mongosh/mongoshrc.js +0 -68
  248. package/dot_config/mpv/input.conf +0 -47
  249. package/dot_config/mpv/mpv.conf +0 -47
  250. package/dot_config/mycli/myclirc +0 -67
  251. package/dot_config/nano/nanorc +0 -28
  252. package/dot_config/ncdu/config +0 -12
  253. package/dot_config/niri/config.kdl.tmpl +0 -327
  254. package/dot_config/nushell/aliases.nu +0 -18
  255. package/dot_config/nushell/cached_eval.nu +0 -80
  256. package/dot_config/nushell/completions.nu.tmpl +0 -52
  257. package/dot_config/nushell/config.nu.tmpl +0 -86
  258. package/dot_config/nushell/env.nu.tmpl +0 -102
  259. package/dot_config/nushell/functions.nu.tmpl +0 -17
  260. package/dot_config/nvim/init.lua +0 -18
  261. package/dot_config/nvim/lazy-lock.json +0 -58
  262. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  263. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  264. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  265. package/dot_config/nvim/lua/config/options.lua +0 -49
  266. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  267. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  268. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  269. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  270. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  271. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  272. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  273. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  274. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  275. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  276. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  277. package/dot_config/paru/paru.conf +0 -10
  278. package/dot_config/pip/pip.conf.tmpl +0 -32
  279. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  280. package/dot_config/pueue/pueue.yml +0 -34
  281. package/dot_config/pypoetry/config.toml +0 -6
  282. package/dot_config/pyrightconfig.json +0 -5
  283. package/dot_config/raycast/README.md +0 -13
  284. package/dot_config/redis/redisclirc +0 -41
  285. package/dot_config/ripgrep/ripgreprc +0 -21
  286. package/dot_config/shell/00-core-paths.sh.tmpl +0 -134
  287. package/dot_config/shell/05-core-safety.sh +0 -48
  288. package/dot_config/shell/10-secrets.sh +0 -41
  289. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  290. package/dot_config/shell/40-ls-colors.sh +0 -49
  291. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  292. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  293. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  294. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  295. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  296. package/dot_config/shell/Brewfile +0 -207
  297. package/dot_config/shell/Brewfile.cask +0 -92
  298. package/dot_config/shell/Brewfile.cli +0 -127
  299. package/dot_config/shell/README.md +0 -284
  300. package/dot_config/shell/als_data.txt.tmpl +0 -65
  301. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  302. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  303. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  304. package/dot_config/sops/dot_sops.yaml +0 -23
  305. package/dot_config/starship.toml.tmpl +0 -202
  306. package/dot_config/swaylock/config +0 -43
  307. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  308. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  309. package/dot_config/systemd/user/pueued.service +0 -12
  310. package/dot_config/systemd/user/ssh-agent.service +0 -12
  311. package/dot_config/task/Taskfile.yml +0 -86
  312. package/dot_config/tflint/tflint.hcl +0 -9
  313. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  314. package/dot_config/topgrade.toml.tmpl +0 -54
  315. package/dot_config/user-dirs.dirs +0 -10
  316. package/dot_config/vscode/extensions.txt +0 -11
  317. package/dot_config/vscode/settings.json.tmpl +0 -82
  318. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  319. package/dot_config/waybar/style.css.tmpl +0 -211
  320. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  321. package/dot_config/wget/wgetrc +0 -12
  322. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  323. package/dot_config/yarn/yarnrc.yml +0 -36
  324. package/dot_config/yazi/keymap.toml +0 -67
  325. package/dot_config/yazi/theme.toml +0 -102
  326. package/dot_config/yazi/yazi.toml +0 -40
  327. package/dot_config/zathura/zathurarc +0 -52
  328. package/dot_config/zellij/config.kdl.tmpl +0 -79
  329. package/dot_config/zsh/dot_zprofile +0 -7
  330. package/dot_config/zsh/dot_zshenv +0 -5
  331. package/dot_config/zsh/dot_zshrc.tmpl +0 -635
  332. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  333. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  334. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  335. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  336. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  337. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  338. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  339. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  340. package/dot_local/bin/executable_ai-update +0 -195
  341. package/dot_local/bin/executable_ai_core +0 -152
  342. package/dot_local/bin/executable_antigravity +0 -11
  343. package/dot_local/bin/executable_b64 +0 -84
  344. package/dot_local/bin/executable_bm +0 -79
  345. package/dot_local/bin/executable_cb +0 -39
  346. package/dot_local/bin/executable_dot +0 -596
  347. package/dot_local/bin/executable_dot-ai +0 -36
  348. package/dot_local/bin/executable_dot-bootstrap +0 -77
  349. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  350. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  351. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  352. package/dot_local/bin/executable_dot-theme-sync +0 -952
  353. package/dot_local/bin/executable_dot_completion +0 -57
  354. package/dot_local/bin/executable_dtags +0 -28
  355. package/dot_local/bin/executable_epoch +0 -67
  356. package/dot_local/bin/executable_extract +0 -41
  357. package/dot_local/bin/executable_gbd +0 -52
  358. package/dot_local/bin/executable_gd +0 -42
  359. package/dot_local/bin/executable_git-ai-commit +0 -175
  360. package/dot_local/bin/executable_git-ai-diff +0 -169
  361. package/dot_local/bin/executable_gl +0 -101
  362. package/dot_local/bin/executable_hash +0 -161
  363. package/dot_local/bin/executable_hashsum +0 -160
  364. package/dot_local/bin/executable_hex +0 -115
  365. package/dot_local/bin/executable_jsonv +0 -78
  366. package/dot_local/bin/executable_jwt +0 -94
  367. package/dot_local/bin/executable_kill-port +0 -75
  368. package/dot_local/bin/executable_lorem +0 -118
  369. package/dot_local/bin/executable_mkscript +0 -35
  370. package/dot_local/bin/executable_monitor +0 -56
  371. package/dot_local/bin/executable_myip +0 -51
  372. package/dot_local/bin/executable_notify +0 -24
  373. package/dot_local/bin/executable_open +0 -38
  374. package/dot_local/bin/executable_pw +0 -27
  375. package/dot_local/bin/executable_rec-start +0 -46
  376. package/dot_local/bin/executable_rec-stop +0 -35
  377. package/dot_local/bin/executable_regex +0 -132
  378. package/dot_local/bin/executable_start-niri +0 -8
  379. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  380. package/dot_local/bin/executable_tour +0 -177
  381. package/dot_local/bin/executable_up +0 -23
  382. package/dot_local/bin/executable_update +0 -142
  383. package/dot_local/bin/executable_uuid +0 -87
  384. package/dot_local/bin/executable_win +0 -32
  385. package/dot_local/bin/executable_yamlv +0 -57
  386. package/dot_local/share/bash-completion/completions/dot +0 -72
  387. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  388. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  389. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  390. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  391. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  392. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  393. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  394. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  395. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  396. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  397. package/dot_local/share/man/man1/dot.1 +0 -149
  398. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  399. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  400. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  401. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  402. package/dot_local/share/zsh/completions/.keep +0 -0
  403. package/dot_local/share/zsh/completions/_dot +0 -283
  404. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  405. package/scripts/ci/check-deps-dev.sh +0 -236
  406. package/scripts/ci/check-insecure-tls.sh +0 -61
  407. package/scripts/ci/check-regression-traceability.sh +0 -67
  408. package/scripts/ci/install-chezmoi-verified.sh +0 -64
  409. package/scripts/ci/run-coverage.sh +0 -362
  410. package/scripts/ci/validate-chezmoidata.sh +0 -25
  411. package/scripts/ci/validate-ci-config.sh +0 -224
  412. package/scripts/docs/build-manual.sh +0 -883
  413. package/scripts/docs/check-manual.sh +0 -213
  414. package/scripts/dot/lib/bento.sh +0 -50
  415. package/scripts/dot/lib/log.sh +0 -200
  416. package/scripts/dot/lib/platform.sh +0 -99
  417. package/scripts/dot/lib/ui.sh +0 -518
  418. package/scripts/dot/lib/utils.sh +0 -377
  419. package/scripts/maintenance/check-updates.sh +0 -131
  420. 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
- _(none currently)_
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
- - [`scripts/ci/check-deps-dev.sh`](../../scripts/ci/check-deps-dev.sh) — the scanner.
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
- `scripts/ci/install-chezmoi-verified.sh`, which:
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
- - `scripts/ci/install-chezmoi-verified.sh` — the SHA256-pinned
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 guide covers rotating encryption keys for secrets managed by Age and SOPS.
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 scripts/release/package-policy-bundles.sh --version 2026.03
23
- bash scripts/release/package-policy-bundles.sh --json
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