@sebastienrousseau/dotfiles 0.2.502 → 0.2.504

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 (412) hide show
  1. package/CHANGELOG.md +109 -9
  2. package/LICENSE +21 -1283
  3. package/README.md +6 -4
  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/02-config-files.md +2 -2
  20. package/docs/manual/_toc.yml +1 -1
  21. package/docs/manual/command-index.md +72 -59
  22. package/docs/operations/CI_COMPOSITES.md +2 -2
  23. package/docs/operations/COMPLETIONS.md +2 -2
  24. package/docs/operations/COVERAGE.md +5 -5
  25. package/docs/operations/HARD_AUDIT_2026.md +11 -11
  26. package/docs/operations/MAINTENANCE.md +3 -3
  27. package/docs/operations/MANIFEST.md +127 -0
  28. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  29. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  30. package/docs/operations/ROADMAP_2026.md +6 -6
  31. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  32. package/docs/operations/TESTING.md +17 -0
  33. package/docs/operations/TRACEABILITY.md +6 -3
  34. package/docs/operations/VERSION_SYNC.md +4 -4
  35. package/docs/reference/POWERSHELL_PARITY.md +8 -7
  36. package/docs/schema/dot-env-v1.json +110 -0
  37. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  38. package/docs/security/CI_PINNING.md +17 -9
  39. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  40. package/docs/security/FUZZING.md +114 -0
  41. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  42. package/docs/security/POLICY_RELEASES.md +2 -2
  43. package/docs/security/SCORECARD.md +58 -3
  44. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  45. package/docs/security/VERIFY_RELEASE.md +201 -0
  46. package/install.sh +118 -5
  47. package/package.json +1 -1
  48. package/scripts/README.md +123 -0
  49. package/scripts/ci/check-copyright-headers.sh +4 -93
  50. package/scripts/ci/check-shell-preamble.sh +4 -103
  51. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  52. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  53. package/scripts/diagnostics/alias-governance.sh +1 -1
  54. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  55. package/scripts/diagnostics/benchmark.sh +5 -5
  56. package/scripts/diagnostics/conflicts.sh +2 -2
  57. package/scripts/diagnostics/doctor-unified.sh +3 -3
  58. package/scripts/diagnostics/doctor.sh +10 -10
  59. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  60. package/scripts/diagnostics/health.sh +4 -4
  61. package/scripts/diagnostics/history-analysis.sh +2 -2
  62. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  63. package/scripts/diagnostics/perf.sh +5 -5
  64. package/scripts/diagnostics/scorecard.sh +4 -4
  65. package/scripts/diagnostics/security-score.sh +25 -6
  66. package/scripts/diagnostics/smoke-test.sh +2 -2
  67. package/scripts/diagnostics/snapshot.sh +2 -2
  68. package/scripts/diagnostics/verify.sh +4 -4
  69. package/scripts/diagnostics/version-locks.sh +13 -3
  70. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  71. package/scripts/dot/commands/agent.sh +8 -0
  72. package/scripts/dot/commands/agents.sh +14 -4
  73. package/scripts/dot/commands/ai.sh +156 -37
  74. package/scripts/dot/commands/appearance.sh +2 -2
  75. package/scripts/dot/commands/core.sh +2 -2
  76. package/scripts/dot/commands/diagnostics.sh +5 -5
  77. package/scripts/dot/commands/env-emit.sh +202 -0
  78. package/scripts/dot/commands/fleet.sh +22 -16
  79. package/scripts/dot/commands/init.sh +4 -4
  80. package/scripts/dot/commands/lint.sh +9 -4
  81. package/scripts/dot/commands/manual.sh +3 -3
  82. package/scripts/dot/commands/meta.sh +12 -6
  83. package/scripts/dot/commands/patterns.sh +2 -2
  84. package/scripts/dot/commands/registry.sh +4 -4
  85. package/scripts/dot/commands/restore.sh +4 -4
  86. package/scripts/dot/commands/secrets.sh +4 -3
  87. package/scripts/dot/commands/security.sh +2 -2
  88. package/scripts/dot/commands/tools.sh +13 -3
  89. package/scripts/dot/powershell/Dot.psm1 +199 -0
  90. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  91. package/scripts/git-hooks/pre-commit-audit.sh +3 -3
  92. package/scripts/git-hooks/pre-push +13 -0
  93. package/scripts/ops/ai-setup.sh +1 -1
  94. package/scripts/ops/bundle.sh +3 -3
  95. package/scripts/ops/chaos.sh +2 -2
  96. package/scripts/ops/chezmoi-apply.sh +12 -6
  97. package/scripts/ops/heal.sh +4 -4
  98. package/scripts/ops/post-apply-repair.sh +2 -2
  99. package/scripts/ops/prewarm.sh +2 -2
  100. package/scripts/ops/release.sh +4 -4
  101. package/scripts/ops/rollback.sh +4 -4
  102. package/scripts/ops/setup.sh +2 -2
  103. package/scripts/qa/check-version-consistency.sh +123 -0
  104. package/scripts/qa/coverage-baseline.sh +1 -1
  105. package/scripts/qa/docs-coverage.sh +2 -2
  106. package/scripts/qa/powershell-contract.ps1 +1 -1
  107. package/scripts/qa/scorecard-snapshot.sh +127 -0
  108. package/scripts/security/backup.sh +2 -2
  109. package/scripts/security/dns-doh.sh +4 -4
  110. package/scripts/security/encryption-check.sh +4 -4
  111. package/scripts/security/enforce-policies.sh +2 -2
  112. package/scripts/security/firewall.sh +4 -4
  113. package/scripts/security/lock-screen.sh +4 -4
  114. package/scripts/security/manage-secrets.sh +2 -2
  115. package/scripts/security/ssh-cert.sh +2 -2
  116. package/scripts/security/telemetry-kill.sh +4 -4
  117. package/scripts/security/usb-safety.sh +4 -4
  118. package/scripts/theme/extract-heic-frames.sh +114 -0
  119. package/scripts/theme/rebuild-themes.sh +31 -2
  120. package/scripts/theme/switch.sh +13 -6
  121. package/scripts/theme/wallpaper-sync.sh +297 -93
  122. package/scripts/tuning/linux.sh +2 -2
  123. package/scripts/tuning/macos.sh +2 -2
  124. package/scripts/version-sync.sh +74 -10
  125. package/dot_config/.module-manifest.json +0 -69
  126. package/dot_config/ai/identity.md +0 -23
  127. package/dot_config/ai/patterns/architect.md +0 -16
  128. package/dot_config/ai/patterns/hardener.md +0 -15
  129. package/dot_config/ai/patterns/refactor.md +0 -15
  130. package/dot_config/aider/aider.conf.yml +0 -32
  131. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  132. package/dot_config/ansible/ansible.cfg +0 -11
  133. package/dot_config/atuin/config.toml.tmpl +0 -47
  134. package/dot_config/bat/config +0 -23
  135. package/dot_config/brave-flags.conf.tmpl +0 -7
  136. package/dot_config/btop/btop.conf +0 -16
  137. package/dot_config/btop/themes/tokyonight.theme +0 -34
  138. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  139. package/dot_config/claude/mcp_servers.json +0 -20
  140. package/dot_config/containers/containers.conf +0 -14
  141. package/dot_config/curl/dot_curlrc +0 -18
  142. package/dot_config/dlv/config.yml +0 -39
  143. package/dot_config/docker/config.json +0 -15
  144. package/dot_config/dotfiles/agent-card.json +0 -29
  145. package/dot_config/dotfiles/agent-profiles.json +0 -92
  146. package/dot_config/dotfiles/boot/README.md +0 -13
  147. package/dot_config/dotfiles/grub/README.md +0 -13
  148. package/dot_config/dotfiles/lock/README.md +0 -13
  149. package/dot_config/dotfiles/mcp-lock.json +0 -33
  150. package/dot_config/dotfiles/mcp-policy.json +0 -52
  151. package/dot_config/dotfiles/mcp-registry.json +0 -47
  152. package/dot_config/dotfiles/model-registry.json +0 -20
  153. package/dot_config/dotfiles/policy-bundles.json +0 -38
  154. package/dot_config/dotfiles/prompt-registry.json +0 -16
  155. package/dot_config/dotfiles/versions.env +0 -18
  156. package/dot_config/duf/duf.conf +0 -6
  157. package/dot_config/duti/defaults.duti +0 -5
  158. package/dot_config/emoji/emoji.txt +0 -34
  159. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  160. package/dot_config/environment.d/90-wayland.conf +0 -19
  161. package/dot_config/fastfetch/config.jsonc +0 -28
  162. package/dot_config/firefox/user.js.tmpl +0 -58
  163. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  164. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  165. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  166. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  167. package/dot_config/fish/conf.d/direnv.fish +0 -4
  168. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  169. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  170. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  171. package/dot_config/fish/conf.d/mise-activate.fish +0 -5
  172. package/dot_config/fish/config.fish.tmpl +0 -44
  173. package/dot_config/fish/fish_plugins +0 -1
  174. package/dot_config/fish/functions/_.fish +0 -3
  175. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  176. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  177. package/dot_config/fish/functions/als.fish +0 -46
  178. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  179. package/dot_config/fish/functions/c.fish +0 -3
  180. package/dot_config/fish/functions/cat.fish +0 -9
  181. package/dot_config/fish/functions/d.fish +0 -7
  182. package/dot_config/fish/functions/dot.fish +0 -34
  183. package/dot_config/fish/functions/h.fish +0 -3
  184. package/dot_config/fish/functions/l.fish +0 -7
  185. package/dot_config/fish/functions/la.fish +0 -7
  186. package/dot_config/fish/functions/ll.fish +0 -7
  187. package/dot_config/fish/functions/log_error.fish +0 -13
  188. package/dot_config/fish/functions/log_info.fish +0 -13
  189. package/dot_config/fish/functions/lr.fish +0 -7
  190. package/dot_config/fish/functions/lra.fish +0 -7
  191. package/dot_config/fish/functions/ls.fish +0 -7
  192. package/dot_config/fish/functions/lt.fish +0 -7
  193. package/dot_config/fish/functions/lta.fish +0 -7
  194. package/dot_config/fish/functions/notify-run.fish +0 -11
  195. package/dot_config/fish/functions/q.fish +0 -3
  196. package/dot_config/fish/functions/silent-run.fish +0 -7
  197. package/dot_config/fish/functions/yy.fish +0 -8
  198. package/dot_config/flatpak/flatpak.list +0 -4
  199. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  200. package/dot_config/foot/foot.ini.tmpl +0 -33
  201. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  202. package/dot_config/fzf/fzf.zsh +0 -48
  203. package/dot_config/gem/gemrc +0 -9
  204. package/dot_config/gh/config.yml +0 -12
  205. package/dot_config/ghostty/config.tmpl +0 -165
  206. package/dot_config/git/allowed_signers.tmpl +0 -18
  207. package/dot_config/git/attributes +0 -12
  208. package/dot_config/git/commit-template +0 -10
  209. package/dot_config/git/hooks/executable_commit-msg +0 -146
  210. package/dot_config/git/ignore +0 -27
  211. package/dot_config/gnupg/gpg-agent.conf +0 -11
  212. package/dot_config/go/golangci.yml +0 -118
  213. package/dot_config/go/gopls.json +0 -30
  214. package/dot_config/goose/config.yaml +0 -29
  215. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  216. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  217. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  218. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  219. package/dot_config/htop/htoprc +0 -20
  220. package/dot_config/inputrc +0 -2
  221. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  222. package/dot_config/just/justfile +0 -122
  223. package/dot_config/k9s/config.yaml +0 -65
  224. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  225. package/dot_config/kanshi/config.tmpl +0 -22
  226. package/dot_config/karabiner/karabiner.json +0 -14
  227. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  228. package/dot_config/lazydocker/config.yml +0 -186
  229. package/dot_config/lazygit/config.yml +0 -35
  230. package/dot_config/mako/config +0 -47
  231. package/dot_config/mas/masapps.txt +0 -5
  232. package/dot_config/micro/settings.json +0 -3
  233. package/dot_config/mimeapps.list +0 -77
  234. package/dot_config/minikube/config.json +0 -13
  235. package/dot_config/mise/config.toml +0 -99
  236. package/dot_config/mongosh/mongoshrc.js +0 -68
  237. package/dot_config/mpv/input.conf +0 -47
  238. package/dot_config/mpv/mpv.conf +0 -47
  239. package/dot_config/mycli/myclirc +0 -67
  240. package/dot_config/nano/nanorc +0 -28
  241. package/dot_config/ncdu/config +0 -12
  242. package/dot_config/niri/config.kdl.tmpl +0 -327
  243. package/dot_config/nushell/aliases.nu +0 -18
  244. package/dot_config/nushell/cached_eval.nu +0 -80
  245. package/dot_config/nushell/completions.nu.tmpl +0 -52
  246. package/dot_config/nushell/config.nu.tmpl +0 -86
  247. package/dot_config/nushell/env.nu.tmpl +0 -102
  248. package/dot_config/nushell/functions.nu.tmpl +0 -17
  249. package/dot_config/nvim/init.lua +0 -18
  250. package/dot_config/nvim/lazy-lock.json +0 -58
  251. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  252. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  253. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  254. package/dot_config/nvim/lua/config/options.lua +0 -49
  255. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  256. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  257. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  258. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  259. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  260. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  261. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  262. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  263. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  264. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  265. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  266. package/dot_config/paru/paru.conf +0 -10
  267. package/dot_config/pip/pip.conf.tmpl +0 -32
  268. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  269. package/dot_config/pueue/pueue.yml +0 -34
  270. package/dot_config/pypoetry/config.toml +0 -6
  271. package/dot_config/pyrightconfig.json +0 -5
  272. package/dot_config/raycast/README.md +0 -13
  273. package/dot_config/redis/redisclirc +0 -41
  274. package/dot_config/ripgrep/ripgreprc +0 -21
  275. package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
  276. package/dot_config/shell/05-core-safety.sh +0 -48
  277. package/dot_config/shell/10-secrets.sh +0 -41
  278. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  279. package/dot_config/shell/40-ls-colors.sh +0 -49
  280. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  281. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  282. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  283. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  284. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  285. package/dot_config/shell/Brewfile +0 -207
  286. package/dot_config/shell/Brewfile.cask +0 -92
  287. package/dot_config/shell/Brewfile.cli +0 -127
  288. package/dot_config/shell/README.md +0 -284
  289. package/dot_config/shell/als_data.txt.tmpl +0 -65
  290. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  291. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  292. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  293. package/dot_config/sops/dot_sops.yaml +0 -23
  294. package/dot_config/starship.toml.tmpl +0 -202
  295. package/dot_config/swaylock/config +0 -43
  296. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  297. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  298. package/dot_config/systemd/user/pueued.service +0 -12
  299. package/dot_config/systemd/user/ssh-agent.service +0 -12
  300. package/dot_config/task/Taskfile.yml +0 -86
  301. package/dot_config/tflint/tflint.hcl +0 -9
  302. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  303. package/dot_config/topgrade.toml.tmpl +0 -54
  304. package/dot_config/user-dirs.dirs +0 -10
  305. package/dot_config/vscode/extensions.txt +0 -11
  306. package/dot_config/vscode/settings.json.tmpl +0 -82
  307. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  308. package/dot_config/waybar/style.css.tmpl +0 -211
  309. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  310. package/dot_config/wget/wgetrc +0 -12
  311. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  312. package/dot_config/yarn/yarnrc.yml +0 -36
  313. package/dot_config/yazi/keymap.toml +0 -67
  314. package/dot_config/yazi/theme.toml +0 -102
  315. package/dot_config/yazi/yazi.toml +0 -40
  316. package/dot_config/zathura/zathurarc +0 -52
  317. package/dot_config/zellij/config.kdl.tmpl +0 -79
  318. package/dot_config/zsh/dot_zprofile +0 -7
  319. package/dot_config/zsh/dot_zshenv +0 -5
  320. package/dot_config/zsh/dot_zshrc.tmpl +0 -688
  321. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  322. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  323. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  324. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  325. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  326. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  327. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  328. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  329. package/dot_local/bin/executable_ai-update +0 -195
  330. package/dot_local/bin/executable_ai_core +0 -152
  331. package/dot_local/bin/executable_antigravity +0 -11
  332. package/dot_local/bin/executable_b64 +0 -84
  333. package/dot_local/bin/executable_bm +0 -79
  334. package/dot_local/bin/executable_cb +0 -39
  335. package/dot_local/bin/executable_dot +0 -636
  336. package/dot_local/bin/executable_dot-ai +0 -36
  337. package/dot_local/bin/executable_dot-bootstrap +0 -76
  338. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  339. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  340. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  341. package/dot_local/bin/executable_dot-theme-sync +0 -952
  342. package/dot_local/bin/executable_dot_completion +0 -57
  343. package/dot_local/bin/executable_dtags +0 -28
  344. package/dot_local/bin/executable_epoch +0 -67
  345. package/dot_local/bin/executable_extract +0 -41
  346. package/dot_local/bin/executable_gbd +0 -52
  347. package/dot_local/bin/executable_gd +0 -42
  348. package/dot_local/bin/executable_git-ai-commit +0 -175
  349. package/dot_local/bin/executable_git-ai-diff +0 -169
  350. package/dot_local/bin/executable_gl +0 -101
  351. package/dot_local/bin/executable_hash +0 -161
  352. package/dot_local/bin/executable_hashsum +0 -160
  353. package/dot_local/bin/executable_hex +0 -115
  354. package/dot_local/bin/executable_jsonv +0 -78
  355. package/dot_local/bin/executable_jwt +0 -94
  356. package/dot_local/bin/executable_kill-port +0 -75
  357. package/dot_local/bin/executable_lorem +0 -118
  358. package/dot_local/bin/executable_mkscript +0 -35
  359. package/dot_local/bin/executable_monitor +0 -56
  360. package/dot_local/bin/executable_myip +0 -51
  361. package/dot_local/bin/executable_notify +0 -24
  362. package/dot_local/bin/executable_open +0 -38
  363. package/dot_local/bin/executable_pw +0 -27
  364. package/dot_local/bin/executable_rec-start +0 -46
  365. package/dot_local/bin/executable_rec-stop +0 -35
  366. package/dot_local/bin/executable_regex +0 -132
  367. package/dot_local/bin/executable_start-niri +0 -8
  368. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  369. package/dot_local/bin/executable_tour +0 -177
  370. package/dot_local/bin/executable_up +0 -23
  371. package/dot_local/bin/executable_update +0 -142
  372. package/dot_local/bin/executable_uuid +0 -87
  373. package/dot_local/bin/executable_win +0 -32
  374. package/dot_local/bin/executable_yamlv +0 -57
  375. package/dot_local/share/bash-completion/completions/dot +0 -72
  376. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  377. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  378. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  379. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  380. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  381. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  382. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  383. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  384. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  385. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  386. package/dot_local/share/man/man1/dot.1 +0 -149
  387. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  388. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  389. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  390. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  391. package/dot_local/share/zsh/completions/.keep +0 -0
  392. package/dot_local/share/zsh/completions/_dot +0 -287
  393. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  394. package/scripts/ci/check-deps-dev.sh +0 -236
  395. package/scripts/ci/check-insecure-tls.sh +0 -61
  396. package/scripts/ci/check-regression-traceability.sh +0 -67
  397. package/scripts/ci/dot-cli-startup-bench.sh +0 -126
  398. package/scripts/ci/install-chezmoi-verified.sh +0 -67
  399. package/scripts/ci/lint-reusable-pins.sh +0 -78
  400. package/scripts/ci/run-coverage.sh +0 -451
  401. package/scripts/ci/validate-chezmoidata.sh +0 -25
  402. package/scripts/ci/validate-ci-config.sh +0 -224
  403. package/scripts/ci/windows-smoke-test.ps1 +0 -136
  404. package/scripts/docs/build-manual.sh +0 -883
  405. package/scripts/docs/check-manual.sh +0 -213
  406. package/scripts/dot/lib/bento.sh +0 -50
  407. package/scripts/dot/lib/log.sh +0 -200
  408. package/scripts/dot/lib/platform.sh +0 -112
  409. package/scripts/dot/lib/ui.sh +0 -650
  410. package/scripts/dot/lib/utils.sh +0 -377
  411. package/scripts/maintenance/check-updates.sh +0 -131
  412. package/scripts/release/package-policy-bundles.sh +0 -125
@@ -11,6 +11,33 @@ narrative behind it.
11
11
 
12
12
  ## Live score
13
13
 
14
+ <!-- BEGIN scorecard-snapshot (auto-generated, do not edit by hand) -->
15
+ Aggregate score **7.6 / 10** at 2026-05-17T08:11:51Z.
16
+
17
+ | Check | Score | Reason |
18
+ |---|---:|---|
19
+ | Binary-Artifacts | 10 | no binaries found in the repo |
20
+ | Branch-Protection | -1 | internal error: error during branchesHandler.setup: internal error: some github tokens can't read cl |
21
+ | CI-Tests | 10 | 15 out of 15 merged PRs checked by a CI test -- score normalized to 10 |
22
+ | CII-Best-Practices | 2 | badge detected: InProgress |
23
+ | Code-Review | 0 | Found 0/30 approved changesets -- score normalized to 0 |
24
+ | Contributors | 0 | project has 0 contributing companies or organizations -- score normalized to 0 |
25
+ | Dangerous-Workflow | 10 | no dangerous workflow patterns detected |
26
+ | Dependency-Update-Tool | 10 | update tool detected |
27
+ | Fuzzing | 0 | project is not fuzzed |
28
+ | License | 9 | license file detected |
29
+ | Maintained | 10 | 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10 |
30
+ | Packaging | 10 | packaging workflow detected |
31
+ | Pinned-Dependencies | 9 | dependency not pinned by hash detected -- score normalized to 9 |
32
+ | SAST | 10 | SAST tool is run on all commits |
33
+ | Security-Policy | 10 | security policy file detected |
34
+ | Signed-Releases | 3 | 1 out of the last 3 releases have a total of 2 signed artifacts. |
35
+ | Token-Permissions | 10 | GitHub workflow tokens follow principle of least privilege |
36
+ | Vulnerabilities | 10 | 0 existing vulnerabilities detected |
37
+
38
+ *Refresh: `scripts/qa/scorecard-snapshot.sh` · CI check: `lint/scorecard-snapshot` (planned).*
39
+ <!-- END scorecard-snapshot -->
40
+
14
41
  [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sebastienrousseau/dotfiles/badge)](https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles)
15
42
 
16
43
  The badge above is regenerated every Monday at 06:00 UTC and on every
@@ -43,7 +70,7 @@ marks reflect this repo's posture at the time of writing — the
43
70
  | Signed-Commits | ✓ | Enforced by pre-push hook (`scripts/git-hooks/pre-push`) and at-push by branch protection (#853 + #857). |
44
71
  | Dependency-Update-Tool | ✓ | Dependabot configured for github-actions / npm / docker / devcontainers / uv. |
45
72
  | Fuzzing | ⚠ | `install.sh` fuzz harness lives under `tests/fuzz/` (closes #881), but it's shell-based and Scorecard's heuristic only recognizes OSS-Fuzz / ClusterFuzzLite / native Go fuzz / libFuzzer / Atheris. None support shell. Property tests under `tests/unit/functions/test_property_*.sh` cover the closest equivalent surface. |
46
- | License | ✓ | Apache-2.0 at repo root. |
73
+ | License | ✓ | MIT at repo root (`LICENSE`). |
47
74
  | Maintained | ✓ | Active commit cadence; the [README](../../README.md) lists the current `dotfiles_version`. |
48
75
  | Pinned-Dependencies | ⚠ | Closed 8 of 14 findings this cycle (every Dockerfile base + every workflow action + 2 `curl \| sh` installers + the `npm install -g npm` upgrade step). 5 residual findings stay open by design — see `Open findings`. |
49
76
  | SAST | ✓ | CodeQL (`.github/workflows/codeql.yml`) + Checkov + Grype. |
@@ -101,12 +128,40 @@ false positives in Scorecard's regex.
101
128
  | 2026-05-14 | 6.5 | 11 | Closed 17 of 28: 10× TokenPermissions (#886), 6× Dockerfile bases (#886), 1× gitleaks fixture (#884). |
102
129
  | 2026-05-14 | 6.5 | 9 | Closed 2× `curl \| sh` installers (#888). |
103
130
  | 2026-05-14 | 6.5 | 8 | Closed 1× `npm install -g npm@…` via Node 24 bump (#889). |
131
+ | 2026-05-17 | 7.6 | 7 | v0.2.502 released; Cosign keyless signing live (#876 implementation landed in `security-release.yml` sbom job). |
132
+ | 2026-05-17 | 7.6 | 6 | SLSA Release Attestation pipeline unblocked (PR #894 — 6 prior releases had failed identically). v0.2.502 backfilled with `.intoto.jsonl` + `.sig` + `.pem` triplet. `Signed-Releases` should bump from 3 to ~10 on next Scorecard re-scrape. |
133
+ | 2026-05-17 | 7.6 | — | Added `MAINTAINERS.md` + `GOVERNANCE.md` at repo root. Provides the formal context for the `Code-Review` 0/30 score (solo maintainer) and unblocks the CII Best Practices badge application. |
104
134
 
105
135
  ## Open work
106
136
 
107
- - **Apply for the OpenSSF Best Practices Badge** — see Bucket 3 above.
108
- - **Wire Cosign keyless signing into the release pipeline (#876)** — should push `Signed-Releases` to its maximum.
137
+ - **Apply for the OpenSSF Best Practices Badge** — see Bucket 3 above. All passing-tier criteria are now met (signed commits, CI, security policy, MIT license, MAINTAINERS.md, GOVERNANCE.md, RFC process documented).
138
+ - **Re-trigger Scorecard after SLSA backfill propagates** — expected `Signed-Releases` 3 10.
109
139
  - **`harden-runner` block-mode adoption (#878)** — should tighten the `Token-Permissions` check further.
140
+ - **Investigate `License` 9/10 false-positive** — repo is MIT (SPDX-compliant), Scorecard's penalty should not apply.
141
+ - **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/master/protection` and document.
142
+
143
+ ### Enabling Branch-Protection + Webhooks checks (one-time PAT setup)
144
+
145
+ Scorecard's `Branch-Protection` and `Webhooks` checks require a
146
+ fine-grained Personal Access Token with `Administration: read`
147
+ scope. Without it both checks return `-1` ("internal error"). The
148
+ workflow already wires this up — only the secret needs to be created.
149
+
150
+ Steps (one-time, repo owner):
151
+
152
+ 1. Go to <https://github.com/settings/personal-access-tokens/new>
153
+ 2. **Resource owner**: `sebastienrousseau` · **Repository access**: only `sebastienrousseau/dotfiles`
154
+ 3. **Repository permissions** → `Administration: read-only` and `Metadata: read-only`
155
+ 4. **Expiration**: 1 year (set a calendar reminder to rotate; document the rotation in this file when done)
156
+ 5. Generate the token, copy it once
157
+ 6. Add as a secret named `SCORECARD_TOKEN` at <https://github.com/sebastienrousseau/dotfiles/settings/secrets/actions/new>
158
+ 7. Next Scorecard run (manual via `gh workflow run scorecard.yml` or weekly cron) picks it up automatically
159
+ 8. Expected effect: `Branch-Protection` `-1` → 10/10 if all rules are correctly configured; `Webhooks` `-1` → 10/10 (no webhooks present).
160
+
161
+ The PAT secret is **optional**. When absent, the workflow falls back
162
+ to `${{ github.token }}` and Scorecard continues to run, only with
163
+ those two checks at `-1`. Adding the PAT cannot reduce any other check's
164
+ score — it's a strict improvement.
110
165
 
111
166
  ## Exceptions
112
167
 
@@ -7,7 +7,7 @@ render_with_liquid: false
7
7
  Every bash script in this repo must include `set -euo pipefail` (or
8
8
  `set -eu` for POSIX `sh`) within its first 50 lines. The rule is
9
9
  enforced by
10
- [`scripts/ci/check-shell-preamble.sh`](../../scripts/ci/check-shell-preamble.sh),
10
+ [`tools/ci/check-shell-preamble.sh`](../../tools/ci/check-shell-preamble.sh),
11
11
  wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
12
12
  Tests pin the contract under
13
13
  [`tests/unit/security/test_shell_preamble_lint.sh`](../../tests/unit/security/test_shell_preamble_lint.sh).
@@ -115,14 +115,14 @@ When you need to mark a new file:
115
115
  3. **Run the checker:**
116
116
 
117
117
  ```bash
118
- ./scripts/ci/check-shell-preamble.sh path/to/file.sh
118
+ ./tools/ci/check-shell-preamble.sh path/to/file.sh
119
119
  ```
120
120
 
121
121
  Exit 0 = lint passes.
122
122
 
123
123
  4. **If you're adding a new entire directory of fragments**
124
124
  (rare — alias buckets, plugin trees), edit the path-skip rule
125
- in `scripts/ci/check-shell-preamble.sh` and document it in this
125
+ in `tools/ci/check-shell-preamble.sh` and document it in this
126
126
  page's "Bulk-sourced fragments" table above.
127
127
 
128
128
  ## CI integration
@@ -138,7 +138,7 @@ this page in the same PR.
138
138
 
139
139
  ## References
140
140
 
141
- - `scripts/ci/check-shell-preamble.sh` — the lint.
141
+ - `tools/ci/check-shell-preamble.sh` — the lint.
142
142
  - `tests/unit/security/test_shell_preamble_lint.sh` — contract test.
143
143
  - `config/pre-commit-config.yaml` (`shell-preamble-check` hook).
144
144
  - `.github/workflows/reusable-shell-lint.yml` — CI invocation.
@@ -0,0 +1,201 @@
1
+ ---
2
+ title: "Verify a Release"
3
+ date: 2026-05-17
4
+ ---
5
+
6
+ # Verifying a Release
7
+
8
+ Every release of the framework ships four independent attestations.
9
+ Verify any of them, they're orthogonal and each rules out a
10
+ different class of attack.
11
+
12
+ | Artefact | Format | Tool | Threat covered |
13
+ |----------|--------|------|----------------|
14
+ | **SBOM** (`dotfiles-sbom.spdx.json`) | SPDX 2.3 JSON | any SBOM viewer | "what's in the release?", full component inventory |
15
+ | **Cosign signature** (`.sig` + `.pem`) | sigstore keyless | `cosign verify-blob` | "did our CI actually produce this SBOM?", short-lived Fulcio cert + Rekor transparency-log entry |
16
+ | **SLSA provenance** (`.intoto.jsonl`) | in-toto v1 / SLSA L3 | `slsa-verifier` | "what build process produced this?", workflow ID, source ref, builder identity |
17
+ | **Unified manifest** (`ALL_SHA256SUMS` + `.sig` + `.pem`) | text + sigstore keyless | `cosign verify-blob` then `sha256sum -c` | "is every other asset on this release the one our CI produced?", one signed line per asset |
18
+
19
+ All four are attached to every GitHub Release as assets, from v0.2.503 forward.
20
+ Releases v0.2.500 through v0.2.502 carry the SBOM bundle only: the unified
21
+ manifest landed in v0.2.503 and is forward-only (re-tagging earlier releases
22
+ would break consumer pins on existing SHAs).
23
+
24
+ ---
25
+
26
+ ## TL;DR — verify v0.2.503+ end-to-end
27
+
28
+ ```sh
29
+ # 0. Pick the release to verify
30
+ TAG=v0.2.503
31
+ REPO=sebastienrousseau/dotfiles
32
+
33
+ # 1. Download every attestation artefact
34
+ gh release download "$TAG" --repo "$REPO" \
35
+ --pattern dotfiles-sbom.spdx.json \
36
+ --pattern dotfiles-sbom.spdx.json.sig \
37
+ --pattern dotfiles-sbom.spdx.json.pem \
38
+ --pattern dotfiles-sbom.spdx.json.intoto.jsonl \
39
+ --pattern ALL_SHA256SUMS \
40
+ --pattern ALL_SHA256SUMS.sig \
41
+ --pattern ALL_SHA256SUMS.pem
42
+
43
+ # 2. Verify Cosign signature on the SBOM (binds SBOM to CI workflow identity)
44
+ cosign verify-blob \
45
+ --certificate dotfiles-sbom.spdx.json.pem \
46
+ --signature dotfiles-sbom.spdx.json.sig \
47
+ --certificate-identity-regexp "^https://github.com/$REPO/" \
48
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
49
+ dotfiles-sbom.spdx.json
50
+
51
+ # 3. Verify SLSA provenance (binds SBOM to exact source tag + builder)
52
+ slsa-verifier verify-artifact dotfiles-sbom.spdx.json \
53
+ --provenance-path dotfiles-sbom.spdx.json.intoto.jsonl \
54
+ --source-uri "github.com/$REPO" \
55
+ --source-tag "$TAG"
56
+
57
+ # 4. Verify the unified manifest, then verify every other asset against it.
58
+ # One signed file covers all release artefacts in one shot.
59
+ cosign verify-blob \
60
+ --certificate ALL_SHA256SUMS.pem \
61
+ --signature ALL_SHA256SUMS.sig \
62
+ --certificate-identity-regexp "^https://github.com/$REPO/" \
63
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
64
+ ALL_SHA256SUMS
65
+
66
+ gh release download "$TAG" --repo "$REPO" --dir . # pull every other asset
67
+ sha256sum -c ALL_SHA256SUMS # one line per asset
68
+ ```
69
+
70
+ All four commands should print "Verified" / "PASSED" / "OK" and
71
+ exit 0. If any fails, **the release was tampered with**: open
72
+ an issue at <https://github.com/sebastienrousseau/dotfiles/issues>
73
+ and do **not** install.
74
+
75
+ ---
76
+
77
+ ## Tool installation
78
+
79
+ | Tool | macOS | Linux | Windows |
80
+ |------|-------|-------|---------|
81
+ | `gh` (GitHub CLI) | `brew install gh` | `apt install gh` / [release page](https://github.com/cli/cli/releases) | `scoop install gh` |
82
+ | `cosign` | `brew install cosign` | `curl -sSfL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign && chmod +x /usr/local/bin/cosign` | `scoop install cosign` |
83
+ | `slsa-verifier` | `brew install slsa-verifier` | `go install github.com/slsa-framework/slsa-verifier/v2/cli/slsa-verifier@latest` | `scoop install slsa-verifier` |
84
+
85
+ If you don't have Go installed, fetch the pre-built `slsa-verifier`
86
+ binary from <https://github.com/slsa-framework/slsa-verifier/releases>
87
+ (SHA256-verify per their release notes).
88
+
89
+ ---
90
+
91
+ ## What each verification actually proves
92
+
93
+ ### `cosign verify-blob` succeeds
94
+
95
+ - The SBOM was signed by a workflow run **on this repository** (the
96
+ `--certificate-identity-regexp` enforces it).
97
+ - The signing OIDC token was issued by **GitHub Actions** (the
98
+ `--certificate-oidc-issuer` enforces it).
99
+ - The signature is recorded in the **Rekor public transparency log**
100
+ (cosign queries this automatically) — anyone can audit it.
101
+ - The Cosign cert was issued by **Fulcio** (the sigstore CA) and
102
+ was valid at the time of signing.
103
+
104
+ This **does not** prove what the build process did — only that
105
+ "the file you have is the file CI produced." For "what did CI do",
106
+ see SLSA verification below.
107
+
108
+ ### `slsa-verifier verify-artifact` succeeds
109
+
110
+ - The SBOM digest matches a provenance statement.
111
+ - The provenance was generated by the **SLSA-Generator** running on
112
+ **GitHub-hosted runners** for **this exact repository**.
113
+ - The build was triggered by the named tag (`--source-tag $TAG`).
114
+ - The provenance is anchored in Rekor (immutable, third-party-auditable).
115
+
116
+ SLSA Level 3 is achieved because: (a) the provenance is generated
117
+ by a *trusted, isolated* builder (slsa-github-generator), not by
118
+ us; (b) the builder runs with hermetic, non-falsifiable inputs;
119
+ (c) the provenance is signed by the builder's own identity, not
120
+ ours.
121
+
122
+ ### What none of this proves
123
+
124
+ The framework's source code is **not formally verified**. SBOM +
125
+ SLSA + Cosign protect the *supply chain* (you got what we shipped)
126
+ — not the *correctness* (what we shipped does what we claim).
127
+
128
+ For correctness review:
129
+
130
+ - Code is open under MIT — read it. Start at `bin/dot`.
131
+ - CI runs ~75 checks per PR (shellcheck, shfmt, CodeQL, Semgrep, Codacy, etc.).
132
+ - Pre-commit hooks reject typos, unsigned commits, raw secrets.
133
+ - See `docs/security/SCORECARD.md` for the OpenSSF score posture.
134
+
135
+ ---
136
+
137
+ ## In-shell one-liner for ongoing verification
138
+
139
+ If you intend to install or update from a release tag, add this to
140
+ your shell startup (already in `dot_config/shell/*` for users who
141
+ run `chezmoi apply`):
142
+
143
+ ```sh
144
+ verify-dot-release() {
145
+ local tag="${1:-$(gh release view --json tagName --jq .tagName \
146
+ --repo sebastienrousseau/dotfiles)}"
147
+ local tmp
148
+ tmp="$(mktemp -d)"
149
+ ( cd "$tmp" \
150
+ && gh release download "$tag" --repo sebastienrousseau/dotfiles \
151
+ --pattern 'dotfiles-sbom.*' \
152
+ && cosign verify-blob \
153
+ --certificate dotfiles-sbom.spdx.json.pem \
154
+ --signature dotfiles-sbom.spdx.json.sig \
155
+ --certificate-identity-regexp '^https://github.com/sebastienrousseau/dotfiles/' \
156
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
157
+ dotfiles-sbom.spdx.json \
158
+ && slsa-verifier verify-artifact dotfiles-sbom.spdx.json \
159
+ --provenance-path dotfiles-sbom.spdx.json.intoto.jsonl \
160
+ --source-uri github.com/sebastienrousseau/dotfiles \
161
+ --source-tag "$tag"
162
+ )
163
+ local rc=$?
164
+ rm -rf "$tmp"
165
+ return $rc
166
+ }
167
+ ```
168
+
169
+ Usage:
170
+
171
+ ```sh
172
+ verify-dot-release # verify latest
173
+ verify-dot-release v0.2.502 # verify specific tag
174
+ ```
175
+
176
+ ---
177
+
178
+ ## If verification fails
179
+
180
+ 1. **Don't install.** Stop the bootstrap script. `^C` any in-flight
181
+ `chezmoi apply`.
182
+ 2. **Compare assets**. The release page shows file sizes — if
183
+ yours don't match what's on
184
+ <https://github.com/sebastienrousseau/dotfiles/releases>, you
185
+ downloaded from a man-in-the-middle.
186
+ 3. **Report**: open an issue and email
187
+ `security@sebastienrousseau.com` (encrypted to the WKD-published
188
+ GPG key — fingerprint
189
+ `55AFAD364FD9DB3819E61F0C8D688FAFA9144693`). Acknowledgement
190
+ SLA: 72 hours per `.github/SECURITY.md`.
191
+
192
+ ---
193
+
194
+ ## See also
195
+
196
+ - `.github/SECURITY.md` — coordinated disclosure policy.
197
+ - `docs/security/KEY_ROTATION.md` — disclosure-key rotation procedure.
198
+ - `docs/security/SCORECARD.md` — OpenSSF Scorecard posture.
199
+ - `docs/operations/HARD_AUDIT_2026.md` Part 7 — the GPG key generation + WKD publication record.
200
+ - [Sigstore Cosign docs](https://docs.sigstore.dev/cosign/signing/overview/)
201
+ - [SLSA verifier docs](https://github.com/slsa-framework/slsa-verifier)
package/install.sh CHANGED
@@ -6,6 +6,13 @@
6
6
 
7
7
  set -euo pipefail
8
8
 
9
+ # Restrict the permissions of any file/dir we create during bootstrap.
10
+ # The installer writes secret-adjacent artifacts (chezmoi config, age
11
+ # keys, ssh tooling, downloaded archives) under $HOME — 077 prevents
12
+ # other local accounts from reading them. Individual call sites can
13
+ # still relax with `chmod` when a file is meant to be world-readable.
14
+ umask 077
15
+
9
16
  # ANSI Colors
10
17
  RED='\033[0;31m'
11
18
  GREEN='\033[0;32m'
@@ -52,21 +59,26 @@ show_help() {
52
59
  Usage: install.sh [version] [options]
53
60
 
54
61
  Arguments:
55
- version The version (tag or branch) to install (default: v0.2.502)
62
+ version The version (tag or branch) to install (default: v0.2.504)
56
63
 
57
64
  Options:
58
65
  --help Show this help message
59
66
  --force Non-interactive mode (sets DOTFILES_NONINTERACTIVE=1)
60
67
  --silent Quiet mode (sets DOTFILES_SILENT=1)
61
68
  --minimal Minimal profile (disable nvim, tmux, zellij)
69
+ --provision After applying configs, install the toolchain (packages,
70
+ fonts, language tools) via the install/provision scripts.
71
+ Also enabled by DOTFILES_PROVISION=1. Opt-in because it
72
+ installs packages and may change OS defaults.
62
73
 
63
74
  EOF
64
75
  }
65
76
 
66
77
  main() {
67
- local version="v0.2.502"
78
+ local version="v0.2.504"
68
79
  local version_set=0
69
80
  local minimal=0
81
+ local provision="${DOTFILES_PROVISION:-0}"
70
82
  local _cleanup_files=()
71
83
  trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
72
84
 
@@ -79,6 +91,7 @@ main() {
79
91
  --silent) export DOTFILES_SILENT=1 ;;
80
92
  --force) export DOTFILES_NONINTERACTIVE=1 ;;
81
93
  --minimal) minimal=1 ;;
94
+ --provision) provision=1 ;;
82
95
  -*)
83
96
  # Catch single-dash and double-dash unknowns the same way.
84
97
  error "Unknown option: $arg"
@@ -92,7 +105,7 @@ main() {
92
105
  # like `foobar` doesn't trigger a 30s+ network download attempt.
93
106
  # Caught by the install.sh fuzz harness (#881).
94
107
  if [[ ! "$arg" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+([-+][a-zA-Z0-9.-]+)?$ ]]; then
95
- error "Unrecognized positional argument '$arg' — expected a semver version (e.g. v0.2.502)."
108
+ error "Unrecognized positional argument '$arg' — expected a semver version (e.g. v0.2.504)."
96
109
  fi
97
110
  version="$arg"
98
111
  version_set=1
@@ -185,7 +198,7 @@ main() {
185
198
  # executing an unverified script (the previous fall-back to
186
199
  # `get.chezmoi.io` was an unsigned bootstrap and a security hole).
187
200
  local verified_installer
188
- verified_installer="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/ci/install-chezmoi-verified.sh"
201
+ verified_installer="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tools/ci/install-chezmoi-verified.sh"
189
202
  if [[ -x "$verified_installer" ]] || [[ -f "$verified_installer" ]]; then
190
203
  echo " Using checksum-verified installer..."
191
204
  if ! bash "$verified_installer" "${CHEZMOI_VERSION:-2.47.1}" "$bin_dir"; then
@@ -200,7 +213,7 @@ main() {
200
213
  return 0
201
214
  fi
202
215
  echo "" >&2
203
- echo " scripts/ci/install-chezmoi-verified.sh is missing; cannot verify chezmoi bootstrap." >&2
216
+ echo " tools/ci/install-chezmoi-verified.sh is missing; cannot verify chezmoi bootstrap." >&2
204
217
  echo " Install chezmoi manually (brew install chezmoi / official binary)" >&2
205
218
  echo " and re-run install.sh." >&2
206
219
  return 1
@@ -250,6 +263,35 @@ main() {
250
263
  sed_in_place 's/^zellij = true/zellij = false/' "$data_file"
251
264
  }
252
265
 
266
+ # Carry the user's existing global git identity into chezmoi's data.
267
+ #
268
+ # This installer sets up chezmoi via sourceDir rather than `chezmoi init`,
269
+ # so the config template's prompts for git_name / git_email never run. The
270
+ # gitconfig template coalesces git_name->name->"" (likewise email,
271
+ # signingkey) and only emits a [user] block when non-empty — so without
272
+ # this, a fresh install produces a ~/.gitconfig with no identity at all,
273
+ # and commits fail with "Author identity unknown". Seed name/email/
274
+ # signingkey from `git config --global` when present. Idempotent: skips if
275
+ # the config already carries a [data] block.
276
+ toml_escape() { printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'; }
277
+ seed_git_identity() {
278
+ local cfg="$CHEZMOI_CONFIG_FILE"
279
+ [[ -f "$cfg" ]] || return 0
280
+ grep -q '^\[data\]' "$cfg" 2>/dev/null && return 0
281
+ local gname gemail gkey
282
+ gname="$(git config --global user.name 2>/dev/null || true)"
283
+ gemail="$(git config --global user.email 2>/dev/null || true)"
284
+ gkey="$(git config --global user.signingkey 2>/dev/null || true)"
285
+ [[ -z "$gname" && -z "$gemail" ]] && return 0
286
+ {
287
+ printf '\n[data]\n'
288
+ [[ -n "$gname" ]] && printf 'name = "%s"\n' "$(toml_escape "$gname")"
289
+ [[ -n "$gemail" ]] && printf 'email = "%s"\n' "$(toml_escape "$gemail")"
290
+ [[ -n "$gkey" ]] && printf 'signingkey = "%s"\n' "$(toml_escape "$gkey")"
291
+ } >>"$cfg"
292
+ echo " Seeded git identity ($gname <$gemail>) into chezmoi data."
293
+ }
294
+
253
295
  # 5. Backup existing dotfiles that chezmoi will overwrite
254
296
  step "Backing up existing dotfiles..."
255
297
  BACKUP_DIR="$HOME/.dotfiles.bak.$(date +"%Y%m%d_%H%M%S")"
@@ -266,6 +308,17 @@ main() {
266
308
  if command -v chezmoi >/dev/null && [[ -f "$CHEZMOI_CONFIG_FILE" ]]; then
267
309
  while IFS= read -r file; do
268
310
  [[ -z "$file" ]] && continue
311
+ # Skip managed *directories*: chezmoi apply never clobbers a
312
+ # directory's existing contents, so they don't need backing up, and
313
+ # `cp -a` on one recurses into things it can't copy — e.g. the live
314
+ # ssh-agent sockets under ~/.ssh/agent, which spew
315
+ # "is a socket (not copied)" warnings. The managed files chezmoi
316
+ # would actually overwrite are listed (and backed up) individually.
317
+ # `-d` without `-L` excludes only real dirs; symlinks are copied as
318
+ # links by `cp -a`, so they never recurse.
319
+ if [[ -d "$file" && ! -L "$file" ]]; then
320
+ continue
321
+ fi
269
322
  if [[ -e "$file" ]]; then
270
323
  rel="${file#"$HOME"/}"
271
324
  mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
@@ -297,10 +350,26 @@ main() {
297
350
  # 6. Initialize & Apply
298
351
  step "Applying Configuration..."
299
352
 
353
+ # ── Auto-migration for v0.2.504 reorg ─────────────────────────────────
354
+ # If the user is upgrading from a pre-0.2.503 install, run the
355
+ # migration script BEFORE `chezmoi apply` so the reorg's source-
356
+ # path moves don't cause chezmoi to delete deployed files.
357
+ # The script is idempotent + silent-by-default; safe to run on
358
+ # every install (fresh installs detect "no prior state" and exit 0).
359
+ for migrate_src in "$SOURCE_DIR" "$LEGACY_SOURCE_DIR"; do
360
+ migrate_script="$migrate_src/install/migrate/migrate-v0_2-to-v0_2_503.sh"
361
+ if [[ -x "$migrate_script" ]]; then
362
+ echo " Running v0.2.504 migration (idempotent; safe on fresh installs)..."
363
+ "$migrate_script" || echo " migration exited non-zero — continuing apply"
364
+ break
365
+ fi
366
+ done
367
+
300
368
  # If we are running from a local source, just apply
301
369
  if [[ -d "$SOURCE_DIR/.git" ]]; then
302
370
  echo " Applying from local source: $SOURCE_DIR"
303
371
  ensure_chezmoi_source "$SOURCE_DIR"
372
+ seed_git_identity
304
373
  APPLY_FLAGS=()
305
374
  if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
306
375
  APPLY_FLAGS=(--force --no-tty)
@@ -310,6 +379,7 @@ main() {
310
379
  echo " Migrating from legacy source: $LEGACY_SOURCE_DIR"
311
380
  mv "$LEGACY_SOURCE_DIR" "$SOURCE_DIR"
312
381
  ensure_chezmoi_source "$SOURCE_DIR"
382
+ seed_git_identity
313
383
  APPLY_FLAGS=()
314
384
  if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
315
385
  APPLY_FLAGS=(--force --no-tty)
@@ -340,6 +410,7 @@ main() {
340
410
  fi
341
411
 
342
412
  ensure_chezmoi_source "$SOURCE_DIR"
413
+ seed_git_identity
343
414
  APPLY_FLAGS=()
344
415
  if [[ "${DOTFILES_NONINTERACTIVE:-0}" = "1" ]]; then
345
416
  APPLY_FLAGS=(--force --no-tty)
@@ -347,7 +418,49 @@ main() {
347
418
  chezmoi apply "${APPLY_FLAGS[@]}"
348
419
  fi
349
420
 
421
+ # Toolchain provisioning (opt-in). The install/provision/ scripts (package
422
+ # managers, fonts, language + AI tools) are chezmoi run_ scripts, but they
423
+ # live OUTSIDE the .chezmoiroot source dir (defaults/), so `chezmoi apply`
424
+ # never runs them — a fresh install otherwise ships configs but zero tools.
425
+ # Run them here only when explicitly requested: they install packages and
426
+ # can change OS defaults, so we never do it implicitly (CI / Docker /
427
+ # unattended automation must opt in via --provision or DOTFILES_PROVISION=1).
428
+ if [[ "$provision" = "1" && $minimal -eq 0 ]]; then
429
+ step "Provisioning toolchain (packages, fonts, tools)..."
430
+ local prov_dir="$SOURCE_DIR/install/provision"
431
+ if [[ -d "$prov_dir" ]]; then
432
+ local script
433
+ # run_once_install_* (shells) first, then numbered run_onchange_* in order.
434
+ while IFS= read -r script; do
435
+ [[ -f "$script" ]] || continue
436
+ echo " → $(basename "$script")"
437
+ if [[ "$script" == *.tmpl ]]; then
438
+ chezmoi execute-template <"$script" | bash ||
439
+ echo " (step exited non-zero — continuing)"
440
+ else
441
+ bash "$script" || echo " (step exited non-zero — continuing)"
442
+ fi
443
+ done < <(ls "$prov_dir"/run_once_install_* "$prov_dir"/run_onchange_* 2>/dev/null | sort)
444
+ fi
445
+ elif [[ $minimal -eq 0 ]]; then
446
+ step "Configs deployed. To also install the toolchain (packages, fonts, tools):"
447
+ echo " bash \"$SOURCE_DIR/install.sh\" --provision # or DOTFILES_PROVISION=1"
448
+ echo " (or: brew bundle --file ~/.config/shell/Brewfile.cli)"
449
+ fi
450
+
350
451
  success "Configuration loaded. Please restart your shell."
452
+
453
+ # If no git identity ended up configured, commits will fail with
454
+ # "Author identity unknown". Point the user at the one-line fix rather
455
+ # than letting them discover it on their first commit.
456
+ if [[ -z "$(git config --global user.email 2>/dev/null || true)" ]] &&
457
+ ! grep -q '^email' "$CHEZMOI_CONFIG_FILE" 2>/dev/null; then
458
+ step "No git identity detected. Set yours so commits are attributed:"
459
+ echo " git config --global user.name \"Your Name\""
460
+ echo " git config --global user.email \"you@example.com\""
461
+ echo " then re-run: chezmoi apply"
462
+ fi
463
+
351
464
  step "Run 'dot learn' for an interactive tour of your new dotfiles."
352
465
  }
353
466
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebastienrousseau/dotfiles",
3
- "version": "0.2.502",
3
+ "version": "0.2.504",
4
4
  "description": "The Trusted Shell Platform — Universal dotfiles managed by Chezmoi. Features Bash & Zsh for macOS, Linux & WSL. Rust modern tooling & enterprise-grade security.",
5
5
  "main": "install.sh",
6
6
  "bin": {