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