@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
@@ -46,7 +46,7 @@ For every release update:
46
46
  6. Local apply has completed:
47
47
 
48
48
  ```bash
49
- CHEZMOI_SOURCE_DIR="$HOME/.dotfiles" ./dot_local/bin/executable_dot apply
49
+ CHEZMOI_SOURCE_DIR="$HOME/.dotfiles" ./bin/dot apply
50
50
  ```
51
51
 
52
52
  ## Security Scan Guardrails
@@ -54,10 +54,10 @@ CHEZMOI_SOURCE_DIR="$HOME/.dotfiles" ./dot_local/bin/executable_dot apply
54
54
  We prevent gitleaks historical-scan regressions with:
55
55
 
56
56
  - Shallow checkout (`fetch-depth: 1`, `fetch-tags: false`) in gitleaks jobs.
57
- - A workflow-dispatch guard script: `scripts/ci/guard-gitleaks-checkout.sh`.
57
+ - A workflow-dispatch guard script: `tools/ci/guard-gitleaks-checkout.sh`.
58
58
 
59
59
  **Manual verification:**
60
60
 
61
61
  ```bash
62
- bash scripts/ci/guard-gitleaks-checkout.sh
62
+ bash tools/ci/guard-gitleaks-checkout.sh
63
63
  ```
@@ -0,0 +1,127 @@
1
+ ---
2
+ title: "Workstation Environment Manifest"
3
+ date: 2026-05-17
4
+ ---
5
+
6
+ # Workstation Environment Manifest
7
+
8
+ `dot env emit` produces a portable, schema-validated record of
9
+ "what is installed on this machine" — the canonical input that
10
+ downstream tooling consumes.
11
+
12
+ ## Schema
13
+
14
+ [`docs/schema/dot-env-v1.json`](../schema/dot-env-v1.json) is a
15
+ JSON Schema 2020-12 file. Validate any manifest against it with:
16
+
17
+ ```sh
18
+ dot env emit | jsonschema -i /dev/stdin docs/schema/dot-env-v1.json
19
+ # or
20
+ dot env emit | check-jsonschema --schemafile docs/schema/dot-env-v1.json /dev/stdin
21
+ ```
22
+
23
+ (`jsonschema` from the `jsonschema` PyPI package; `check-jsonschema`
24
+ from `python-jsonschema/check-jsonschema`. Either works.)
25
+
26
+ ## Quick reference
27
+
28
+ ```sh
29
+ dot env emit # canonical JSON to stdout
30
+ dot env emit --format ndjson # one tool per line, greppable
31
+ dot env emit --output /tmp/env.json # atomic file write
32
+ dot env emit --compact # one-line JSON
33
+ dot env emit --help # flags + examples
34
+ ```
35
+
36
+ Example output (truncated):
37
+
38
+ ```json
39
+ {
40
+ "schema_version": "https://sebastienrousseau.github.io/dotfiles/schema/dot-env-v1.json",
41
+ "manifest_version": "1.0.0",
42
+ "emitted_at": "2026-05-17T10:22:46Z",
43
+ "emitter": {
44
+ "name": "dot env emit",
45
+ "version": "0.2.503",
46
+ "repo": "github.com/sebastienrousseau/dotfiles"
47
+ },
48
+ "host": {
49
+ "hostname": "rousseau-mbp-m1",
50
+ "os": "Darwin",
51
+ "arch": "arm64"
52
+ },
53
+ "tools": [
54
+ {
55
+ "name": "node",
56
+ "version": "24.14.0",
57
+ "source": "/Users/seb/.dotfiles/mise.toml",
58
+ "source_type": "mise.toml",
59
+ "requested_version": "24.14.0",
60
+ "install_path": "/Users/seb/.local/share/mise/installs/node/24.14.0",
61
+ "active": true
62
+ },
63
+ ...
64
+ ]
65
+ }
66
+ ```
67
+
68
+ ## Why this exists
69
+
70
+ R3 §7.4 strategic-reversal call: **ship `dot env emit` BEFORE
71
+ `dot fleet apply --attest`**. Three independent forces converge on
72
+ a 2026-09-17 / 2026-09-11 window:
73
+
74
+ 1. **AgentSpec / AAIF** public deadline at AGNTCon Amsterdam
75
+ 2026-09-17. First-mover with the canonical "one signed
76
+ manifest → AGENTS.md, agent.yaml, devcontainer-feature.json,
77
+ mise.toml, Brewfile, flake.nix, in-toto subject list"
78
+ generator owns the reference implementation.
79
+ 2. **EU CRA SBOM reporting** binding 2026-09-11. A v1 manifest
80
+ per workstation feeds the "demonstrate vulnerability response"
81
+ story for any EU procurement team.
82
+ 3. **dotbot v3.5.0's `workflow.yaml`** is 80% of the way to
83
+ AgentEnv parity. The window before they generate the same
84
+ manifest is measured in weeks.
85
+
86
+ ## Downstream consumers (planned)
87
+
88
+ The v1 manifest is the source-of-truth that subsequent emitters
89
+ will re-render. Each emitter is a single jq filter from the v1
90
+ shape:
91
+
92
+ | Target format | Use case | Status |
93
+ |---|---|---|
94
+ | `AGENTS.md` | Cross-harness AI agent context | shipped (`dot agents render`); will be re-pointed at the v1 manifest in v0.2.504 |
95
+ | `devcontainer-feature.json` | Reproducible cloud-IDE setup | planned (v0.2.504) |
96
+ | `mise.toml` | Round-trip: re-create the same install set on a fresh host | planned |
97
+ | `Brewfile` | Hand off to a Homebrew-managed Mac | planned |
98
+ | `flake.nix` | Nix reproducibility | planned (input to nix-shell) |
99
+ | `in-toto subject list` | SLSA attestation subject array | planned (`dot fleet apply --attest`) |
100
+ | `CycloneDX SBOM` | Compliance reporting (EU CRA) | planned (v0.2.504; per-artifact attestation closes R3-N7) |
101
+
102
+ The schema is intentionally minimal — `dot env emit` records *what
103
+ is installed*, not *what is desired* or *what is approved*. Downstream
104
+ emitters add policy / approval / risk-score columns as they need
105
+ them.
106
+
107
+ ## CI usage
108
+
109
+ ```yaml
110
+ - name: Snapshot environment manifest
111
+ run: |
112
+ dot env emit --output env.json
113
+ # Attest the manifest as part of the next release
114
+ cosign sign-blob --yes --output-signature env.json.sig \
115
+ --output-certificate env.json.pem env.json
116
+ ```
117
+
118
+ The signed manifest goes into the release alongside the SBOM —
119
+ together they let any consumer answer "what software was on the
120
+ runner that produced this release" and verify it cryptographically.
121
+
122
+ ## See also
123
+
124
+ - `docs/schema/dot-env-v1.json` — the JSON Schema authoritative spec.
125
+ - `docs/security/VERIFY_RELEASE.md` — three-attestation verification flow this manifest plugs into.
126
+ - `docs/operations/HARD_AUDIT_2026.md` §7.4 — strategic-reversal record.
127
+ - `docs/operations/ROADMAP_V0_2_503.md` — `dot env emit` was originally deferred to v0.2.504; pulled forward in this PR per user request.
@@ -0,0 +1,89 @@
1
+ ---
2
+ render_with_liquid: false
3
+ title: "Dot Module Registry"
4
+ description: "How to publish and consume reusable dotfile modules."
5
+ ---
6
+
7
+ # Dot Module Registry
8
+
9
+ The `dot registry` command discovers reusable dotfile modules from a JSON index published over HTTPS. The default registry is hosted by this repo at:
10
+
11
+ ```
12
+ https://sebastienrousseau.github.io/dotfiles/registry.json
13
+ ```
14
+
15
+ This page documents the JSON contract and the contribution flow. It is the §3 / Months 12-18 deliverable from [HARD_AUDIT_2026.md](./HARD_AUDIT_2026.md) — the registry is the network-effect feature that turns the framework into a category, not just one person's setup.
16
+
17
+ ## Quick start (consumer side)
18
+
19
+ ```sh
20
+ dot registry list # list every published module
21
+ dot registry search rust # filter by keyword
22
+ dot registry info rust-dev-setup # full metadata for one module
23
+ dot registry install rust-dev-setup # apply to this workstation (scaffold)
24
+ dot registry url # show active registry URL
25
+ dot registry set-url <url> # point at a different registry
26
+ ```
27
+
28
+ The registry index is cached locally at `${XDG_CACHE_HOME:-~/.cache}/dotfiles/registry/index.json` with a 6 hour TTL. Override the URL one-off via `DOTFILES_REGISTRY_URL=<url> dot registry list`.
29
+
30
+ ## JSON contract
31
+
32
+ A registry index is a single JSON document:
33
+
34
+ ```json
35
+ {
36
+ "version": 1,
37
+ "updated": "2026-05-15T16:30:00Z",
38
+ "registry": "sebastienrousseau/dotfiles",
39
+ "modules": [
40
+ {
41
+ "name": "rust-dev-setup",
42
+ "description": "Rust toolchain + cargo plugins + Helix/Neovim editor config",
43
+ "repo": "https://github.com/example/rust-dev-setup",
44
+ "version": "1.2.0",
45
+ "tags": ["rust", "language", "dev"],
46
+ "maintainer": "alice@example.com",
47
+ "sha256": "f9a2c1b…",
48
+ "license": "MIT"
49
+ }
50
+ ]
51
+ }
52
+ ```
53
+
54
+ Required keys: `name` (kebab-case, ≤ 32 chars), `description` (≤ 200 chars), `repo` (HTTPS clone URL), `version` (semver).
55
+
56
+ Recommended keys: `tags` (lower-case array), `maintainer`, `sha256` (pinned at publish time so installers can verify), `license` (SPDX identifier).
57
+
58
+ ## Contributing a module
59
+
60
+ 1. Build your module as a chezmoi-source-compatible directory at `https://github.com/<you>/<module>.git`. The contents are overlaid onto the consumer's chezmoi source dir during install.
61
+ 2. Open a PR against `sebastienrousseau/dotfiles` adding one entry to `docs/registry.json` (alphabetical by `name`).
62
+ 3. The PR runs CI checks for:
63
+ - Schema validity (`jq` against the JSON contract).
64
+ - `repo` URL resolves and is a public git repo.
65
+ - `sha256` matches the latest tag at `repo`.
66
+ 4. Once merged, the GitHub Pages workflow re-deploys the registry; `dot registry list` picks it up within 6 hours (or immediately if the consumer purges the cache).
67
+
68
+ ## Install pipeline (scaffold today, full in Phase 2)
69
+
70
+ `dot registry install <name>` currently prints what *would* happen. The full pipeline lands as follows:
71
+
72
+ 1. Resolve the module entry from the registry index.
73
+ 2. Clone the module to `$XDG_DATA_HOME/dotfiles/modules/<name>/<version>`.
74
+ 3. Verify the clone's HEAD matches `sha256` from the registry.
75
+ 4. Source the module's `module.toml` (if present) for declared profiles + feature flags.
76
+ 5. Merge the module's chezmoi source into the consumer's chezmoi source dir under a namespaced subtree (`/registry/<name>/...`).
77
+ 6. Run `chezmoi apply --include /registry/<name>/**` so only the module's files are written.
78
+
79
+ The sandboxed apply (point 6) requires changes to `dot sync` to accept an include filter — that is its own roadmap issue and tracked separately.
80
+
81
+ ## Security model
82
+
83
+ - Modules execute with the consumer's user privileges via chezmoi `run_onchange_*` scripts. The trust contract is identical to consuming any third-party dotfiles repo.
84
+ - Pinning `sha256` lets a consumer verify the registry entry hasn't been tampered with between publish and install.
85
+ - The registry index itself is fetched over HTTPS; the GitHub Pages cert chain provides transport integrity.
86
+
87
+ ## Why this lives in this repo (for now)
88
+
89
+ A vendor-neutral registry would be ideal but adds operations cost. Hosting `registry.json` under this repo's `docs/` directory and serving it via GitHub Pages keeps the maintenance burden near zero while the registry is small. If/when the registry outgrows GitHub Pages, the JSON contract is stable and the index can move to a dedicated subdomain.
@@ -0,0 +1,130 @@
1
+ ---
2
+ title: "Release Pipeline"
3
+ date: 2026-05-24
4
+ ---
5
+
6
+ # Release Pipeline
7
+
8
+ End-to-end flow from `git tag v0.2.503 && git push --tags` to a fully
9
+ signed, distributed release on GitHub + Homebrew + Scoop + AUR.
10
+
11
+ Five workflows are involved, each scoped to one job and triggered off
12
+ either `release.created` or `release.published`. They run in parallel
13
+ where dependencies allow.
14
+
15
+ ```
16
+ git push --tags (you)
17
+
18
+
19
+ ┌────────────────────────────┐
20
+ │ GitHub creates Release │ (auto, from tag)
21
+ └─┬──────────────────────────┘
22
+ │ on: release.created
23
+
24
+ ┌─────────────────────────────┐ ┌─────────────────────────────┐
25
+ │ release-package-dot.yml │ │ security-release.yml (sbom)│
26
+ │ → dot-VERSION.tar.gz │ │ → SBOM + cosign sig + cert │
27
+ │ → dot-VERSION.zip │ │ → SLSA L3 provenance │
28
+ └─────────────┬───────────────┘ └──────────────┬──────────────┘
29
+ │ uploaded to release │
30
+ │ │
31
+ │ on: release.published │ on: release.published
32
+ │ (after human "publish" click, │ (same trigger)
33
+ │ or auto if Release was created │
34
+ │ with assets+published in one) │
35
+ ▼ ▼
36
+ ┌─────────────────────────────┐ ┌─────────────────────────────┐
37
+ │ release-distribute-*.yml │ │ security-release.yml │
38
+ │ ┌─────────────────────┐ │ │ (manifest job) │
39
+ │ │ homebrew → tap PR │ │ │ → ALL_SHA256SUMS │
40
+ │ │ scoop → bucket PR│ │ │ → cosign sig + cert │
41
+ │ │ aur → AUR push │ │ │ │
42
+ │ └─────────────────────┘ │ └─────────────────────────────┘
43
+ └─────────────────────────────┘
44
+
45
+
46
+ ┌─────────────────────────────┐
47
+ │ release-attestation-check │ (Mondays + on demand)
48
+ │ → opens issue if missing │
49
+ └─────────────────────────────┘
50
+ ```
51
+
52
+ ## Workflows
53
+
54
+ | Workflow | Trigger | Owns | Outputs |
55
+ |---|---|---|---|
56
+ | `release-package-dot.yml` | `release.created`, dispatch | Build deterministic `dot-VERSION.{tar.gz,zip}` from `bin/`, `lib/`, `share/`, completions. | Two release assets. |
57
+ | `security-release.yml` (sbom job) | `release.created`, dispatch | Generate SPDX SBOM via anchore/sbom-action. Cosign keyless sign the SBOM. | `dotfiles-sbom.spdx.json` + `.sig` + `.pem`. |
58
+ | `security-release.yml` (provenance job) | needs sbom | SLSA L3 provenance via slsa-framework/slsa-github-generator. | `dotfiles-sbom.spdx.json.intoto.jsonl`. |
59
+ | `security-release.yml` (manifest job) | `release.published`, dispatch | Build `ALL_SHA256SUMS` over every release asset, Cosign-sign it. | `ALL_SHA256SUMS` + `.sig` + `.pem`. |
60
+ | `release-distribute-homebrew.yml` | `release.published`, dispatch | Hash `dot-VERSION.tar.gz`, regenerate `install/homebrew/dot.rb`, push branch + PR to `sebastienrousseau/homebrew-tap`. | One PR on the tap repo. |
61
+ | `release-distribute-scoop.yml` | `release.published`, dispatch | Hash `dot-VERSION.zip`, rewrite `install/scoop/dot.json` via jq (both 64bit + arm64 point at same zip), PR to `sebastienrousseau/scoop-bucket`. | One PR on the bucket repo. |
62
+ | `release-distribute-aur.yml` | `release.published`, dispatch | Hash `dot-VERSION.tar.gz`, rewrite `pkgver` + `sha256sums` in `install/aur/PKGBUILD`, regenerate `.SRCINFO` via dockerised `makepkg`, push to `ssh://aur@aur.archlinux.org/dotfiles-git.git`. | One commit on AUR. |
63
+ | `release-attestation-check.yml` | weekly cron + dispatch | Verify the latest release carries the full attestation bundle (SBOM + sig + cert + intoto + manifest + sig + cert). | Opens or comments on a tracking issue. |
64
+
65
+ ## Why `created` vs `published`
66
+
67
+ GitHub fires `release.created` the moment a Release record exists.
68
+ That covers SBOM + SLSA + the packaging step: those depend only on
69
+ source bytes at the tag and don't need other assets to be present.
70
+
71
+ `release.published` fires later, when a human flips the Release from
72
+ draft to public (or when a Release is created already-public, the
73
+ events fire together). The manifest job and the three distribution
74
+ jobs wait for that because they enumerate *all* assets on the release;
75
+ running them earlier would miss the manual / docs artefacts uploaded
76
+ by `manual-publish.yml` and the packaging step's tarball + zip.
77
+
78
+ Both arms of `security-release.yml` are idempotent: re-running the
79
+ manifest job after late asset uploads picks up the new state and the
80
+ `--clobber` flag overwrites the previous manifest sig + cert.
81
+
82
+ ## Secrets used
83
+
84
+ | Secret | Used by | Setup |
85
+ |---|---|---|
86
+ | `GITHUB_TOKEN` | every workflow (auto) | n/a |
87
+ | `ACTIONS_BOT_SIGNING_KEY` | distribute-* (signed commits on tap repos), `bump-reusable-pins.yml`, `update-deps.yml` | See `docs/security/AUTOMATION_SECRETS.md`. |
88
+ | `AUR_SSH_KEY` | `release-distribute-aur.yml` only | SSH ED25519 keypair; public key on the `srousseau` AUR profile, private key in this secret. See `memory/reference_aur_account.md` for the AUR Edit-Account form quirk that bit us during setup. |
89
+
90
+ ## Distribution targets
91
+
92
+ | Target | Repo | First-run prereq |
93
+ |---|---|---|
94
+ | Homebrew | `sebastienrousseau/homebrew-tap` | Tap repo exists (currently bare README + LICENSE). Workflow creates the `Formula/dot.rb` path on first publish. |
95
+ | Scoop | `sebastienrousseau/scoop-bucket` | Bucket repo exists (currently bare). Workflow creates `bucket/dot.json` on first publish. |
96
+ | AUR | `ssh://aur@aur.archlinux.org/dotfiles-git.git` | **Manual one-time step**: the maintainer must create the package entry via the AUR web UI before the workflow's `git clone` can succeed. The workflow exits with a clear error message on the first run if the repo doesn't exist. |
97
+
98
+ ## Verifying a release
99
+
100
+ See `docs/security/VERIFY_RELEASE.md` for the consumer-facing
101
+ verification recipe. The pipeline produces four orthogonal
102
+ attestations (SBOM, Cosign signature on SBOM, SLSA provenance,
103
+ unified Cosign-signed manifest) and a verifier can check any of them
104
+ independently.
105
+
106
+ ## Known caveats
107
+
108
+ - **AUR `pkgname=dotfiles-git`**: AUR's `-git` convention means
109
+ "tracks git HEAD", but the workflow publishes tagged stable
110
+ releases. Either rename to plain `dotfiles` in
111
+ `install/aur/PKGBUILD` and register that package, or accept the
112
+ misnomer. Documented in the v0.2.503 PR (#895).
113
+ - **Signed-Releases retroactive**: the unified manifest landed in
114
+ v0.2.503. Releases v0.2.500-502 carry the SBOM bundle only.
115
+ We do not re-tag older releases (would break consumer pins). The
116
+ OSSF Scorecard score climbs naturally as new releases land.
117
+ - **First-tag rehearsal**: tag a `v0.2.503-rc1` once before the real
118
+ v0.2.503 to live-test the full pipeline without burning the final
119
+ release tag. The workflows are idempotent so a real v0.2.503 still
120
+ works after the rc.
121
+
122
+ ## See also
123
+
124
+ - `docs/security/VERIFY_RELEASE.md` — consumer-facing verification.
125
+ - `docs/security/CI_PINNING.md` — reusable workflow pin policy + the
126
+ `bump-reusable-pins.yml` auto-bump bot.
127
+ - `docs/security/AUTOMATION_SECRETS.md` — how each automation secret
128
+ is generated, scoped, and rotated.
129
+ - `docs/operations/ROADMAP_V0_2_503.md` — the 7-workstream plan this
130
+ pipeline executed.
@@ -0,0 +1,280 @@
1
+ ---
2
+ title: "RFC: v0.2.503 Repository Reorganisation"
3
+ status: Accepted — shipping incrementally in this PR
4
+ authors: ['@sebastienrousseau']
5
+ opened: 2026-05-17
6
+ accepted: 2026-05-17
7
+ target: v0.2.503
8
+ ---
9
+
10
+ # RFC: v0.2.503 Repository Reorganisation
11
+
12
+ > **Status: Accepted.** This RFC was opened in this PR and
13
+ > immediately accepted by the maintainer with explicit decision to
14
+ > ship the reorganisation incrementally within v0.2.503 rather
15
+ > than the originally-proposed two-version deprecation window.
16
+ > Phases land as separate commits on `feat/v0.2.503`; each is
17
+ > independently atomic and verified by `dot lint` + the existing
18
+ > test matrix.
19
+
20
+ ## Summary
21
+
22
+ Split the current chezmoi-managed monorepo into a **framework layer**
23
+ (distributable CLI + library) and a **defaults layer** (user-facing
24
+ configuration), with the framework layer publishable as a
25
+ standalone tarball to Homebrew, Scoop, and AUR. Maintain
26
+ backwards-compatible behaviour for existing users via a one-shot
27
+ migration script that runs on first apply after upgrade.
28
+
29
+ ## Motivation
30
+
31
+ R4 hard-audit identified the framework/user-config intermingling
32
+ as the **highest-leverage structural gap** blocking de-facto-
33
+ framework status (`HARD_AUDIT_2026.md` §8.5 Top-5 adoption gaps).
34
+ Concrete symptoms:
35
+
36
+ 1. **Distribution stuck at "curl-pipe-bash".** The Homebrew /
37
+ Scoop / AUR manifests scaffolded in v0.2.503
38
+ (`install/{homebrew,scoop,aur}/`) cannot publish until there's
39
+ a single `bin/dot` tarball — chezmoi's `dot_*` / `executable_*`
40
+ / `private_*` prefixes force the current layout. Until that's
41
+ fixed, downstream distros have nothing to package.
42
+
43
+ 2. **New contributor onboarding cost.** Even with the v0.2.503
44
+ `STRUCTURE.md`, ~20 chezmoi-prefixed root paths require a
45
+ concept (the chezmoi naming contract) to navigate. A
46
+ `bin/` + `lib/` + `defaults/` layout is self-documenting.
47
+
48
+ 3. **Framework forks are blocked.** Anyone wanting to fork the
49
+ *CLI* without the maintainer's personal configs has to
50
+ manually delete 80+ tool-specific directories under
51
+ `dot_config/`. A clean separation makes "fork the framework,
52
+ apply my own defaults" a one-command flow.
53
+
54
+ 4. **Test surface bleed.** CI runs `chezmoi apply --dry-run` on
55
+ every PR, exercising both framework templates AND the
56
+ maintainer's personal defaults. A real consumer running the
57
+ framework will not exercise the maintainer's `dot_config/aider/`
58
+ etc. — and yet a regression there blocks CI.
59
+
60
+ The reorganisation is **breaking** for existing user installs:
61
+ chezmoi tracks deployed files by source path, so moving
62
+ `bin/dot` to `bin/dot` means the old
63
+ `~/.local/bin/dot` would be removed before the new path is
64
+ installed. Mitigation: ship a `migrate-v0.2-to-v0.3.sh` script
65
+ that runs before the first post-upgrade `chezmoi apply`.
66
+
67
+ ## Detailed design
68
+
69
+ ### Target layout
70
+
71
+ Following the [Debian/aws-cli](https://github.com/Debian/aws-cli)
72
+ discipline (every top-level path has a clear purpose; contributor
73
+ orients in <30 seconds):
74
+
75
+ ```
76
+ .
77
+ ├── bin/ # CLI entrypoints
78
+ │ ├── dot # was bin/dot
79
+ │ ├── dot-load-benchmark-pty # was bin/dot-load-benchmark-pty
80
+ │ ├── dot-theme-sync # was bin/dot-theme-sync
81
+ │ ├── dot-bootstrap # was bin/dot-bootstrap
82
+ │ └── dot-update # was dot_local/bin/executable_update (renamed)
83
+ ├── lib/ # Framework library (no chezmoi)
84
+ │ ├── commands/ # was scripts/dot/commands/
85
+ │ ├── ui.sh # was scripts/dot/lib/ui.sh
86
+ │ ├── utils.sh # was scripts/dot/lib/utils.sh
87
+ │ ├── platform.sh # was scripts/dot/lib/platform.sh
88
+ │ ├── log.sh # was scripts/dot/lib/log.sh
89
+ │ ├── bento.sh # was scripts/dot/lib/bento.sh
90
+ │ └── secrets_provider.sh # was scripts/lib/secrets_provider.sh
91
+ ├── share/ # OS-conventional resources
92
+ │ ├── man/man1/dot.1 # was dot_local/share/man/man1/dot.1
93
+ │ ├── completions/ # was dot_local/share/zsh/completions/
94
+ │ └── docs/ # was docs/
95
+ ├── defaults/ # User-facing default config (was dot_config/, etc.)
96
+ │ ├── home/ # dotfiles deployed to $HOME (dot_X → .X)
97
+ │ ├── config/ # dotfiles deployed to $XDG_CONFIG_HOME
98
+ │ └── tools/ # per-tool configs (mise/, npmrc/, ...)
99
+ ├── install/ # Distribution + bootstrap
100
+ │ ├── install.sh # was install.sh (moved one level down)
101
+ │ ├── homebrew/dot.rb # already at install/homebrew/ in v0.2.503
102
+ │ ├── scoop/dot.json # already at install/scoop/ in v0.2.503
103
+ │ ├── aur/PKGBUILD # already at install/aur/ in v0.2.503
104
+ │ ├── provision/ # was install/provision/ (chezmoi run_onchange_ hooks)
105
+ │ └── migrate/ # NEW: migrate-v0_2-to-v0_3.sh + rollback
106
+ ├── tests/ # unchanged
107
+ ├── examples/ # unchanged
108
+ ├── tools/ # NEW: ops scripts not shipped to users
109
+ │ ├── ci/ # was tools/ci/
110
+ │ ├── release/ # was tools/release/
111
+ │ ├── maintenance/ # was tools/maintenance/
112
+ │ ├── docs/ # was tools/docs/
113
+ │ └── version-sync.sh # was scripts/version-sync.sh
114
+ ├── .chezmoiroot # NEW: points at defaults/
115
+ ├── README.md
116
+ ├── LICENSE
117
+ ├── CHANGELOG.md
118
+ ├── CLAUDE.md / AGENTS.md / per-harness renders
119
+ └── (no more dot_X at root)
120
+ ```
121
+
122
+ ### chezmoi adaptation
123
+
124
+ `.chezmoiroot` lets chezmoi treat a subdirectory as the source
125
+ root. With `.chezmoiroot = "defaults"`, chezmoi will look for
126
+ `defaults/home/dot_zshrc`, `defaults/config/dot_starship.toml`,
127
+ etc. — and deploy to the normal `~/.zshrc` / `~/.config/starship.toml`
128
+ paths.
129
+
130
+ This means:
131
+
132
+ - Repo top-level is no longer required to follow chezmoi naming.
133
+ - `bin/dot` is a plain shell script, not `dot_local/bin/executable_dot`.
134
+ - `share/man/man1/dot.1` is a plain file, not chezmoi-deployed.
135
+ - A Homebrew formula can `bin.install 'bin/dot'` directly.
136
+
137
+ ### Migration tool
138
+
139
+ `install/migrate/migrate-v0.2-to-v0.3.sh`:
140
+
141
+ 1. Detect existing chezmoi state at `~/.local/share/chezmoi` /
142
+ `~/.config/chezmoi/chezmoi.toml`.
143
+ 2. Read the user's pinned source repo from chezmoi.toml; if it's
144
+ `sebastienrousseau/dotfiles@<v0.2.x>`, warn and confirm.
145
+ 3. Run `chezmoi diff` and persist the per-file output to
146
+ `~/.local/state/dotfiles/v0_2_to_v0_3_pre_diff.log` so the
147
+ user has a record of pre-migration state.
148
+ 4. Run `chezmoi forget` for paths that are moving (no destructive
149
+ delete — chezmoi forget only un-tracks).
150
+ 5. Update `~/.config/chezmoi/chezmoi.toml` to point at the new
151
+ sourceDir with `.chezmoiroot` honoured.
152
+ 6. Run `chezmoi apply` — picks up the new layout and re-creates
153
+ the user's files at their canonical paths.
154
+ 7. Run `dot doctor` and `dot lint` to verify.
155
+
156
+ The migration is **idempotent** and **safe to abort**: at step 4
157
+ the chezmoi state is removed but no user data is deleted. At step
158
+ 6 chezmoi notices "these files already exist on disk with content
159
+ matching the source" and is a no-op.
160
+
161
+ ### Library bash-source paths
162
+
163
+ Today `scripts/dot/commands/<cmd>.sh` does:
164
+
165
+ ```bash
166
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
167
+ source "$SCRIPT_DIR/../lib/utils.sh"
168
+ ```
169
+
170
+ After reorganisation:
171
+
172
+ ```bash
173
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
174
+ source "$SCRIPT_DIR/../utils.sh" # commands/<cmd>.sh → lib/utils.sh
175
+ ```
176
+
177
+ Or, more robustly, drive lookup from a single env var set by `bin/dot`:
178
+
179
+ ```bash
180
+ : "${DOT_LIB:=$(dirname "$(realpath "$0")")/../lib}"
181
+ source "$DOT_LIB/utils.sh"
182
+ ```
183
+
184
+ The Homebrew formula sets `$DOT_LIB` to `${libexec}/lib` so
185
+ `bin/dot` finds its library wherever the package manager installed
186
+ it.
187
+
188
+ ### Distribution surface
189
+
190
+ Once `bin/dot` is standalone:
191
+
192
+ | Channel | Artefact | Verify command |
193
+ |---------|----------|----------------|
194
+ | Homebrew tap | `dot-${VERSION}-${OS}-${ARCH}.tar.gz` | `brew install sebastienrousseau/tap/dot && dot version` |
195
+ | Scoop bucket | `dot.json` → `dot-${VERSION}-windows-${ARCH}.zip` | `scoop install dot && dot version` |
196
+ | AUR | `dotfiles-git` PKGBUILD building from source | `paru -S dotfiles-git && dot version` |
197
+ | `install.sh` | Same SHA256-verified path as today | `bash install.sh` |
198
+ | Direct tarball | Cosign-signed + SLSA-attested release asset | per `docs/security/VERIFY_RELEASE.md` |
199
+
200
+ The chezmoi-managed `defaults/` subtree is **only** consumed when
201
+ a user wants the maintainer's opinionated config layer. It's a
202
+ strict superset: install `dot` standalone for the CLI; layer
203
+ `defaults/` on top if you want the wallpaper-theming +
204
+ multi-shell setup.
205
+
206
+ ## Backwards compatibility
207
+
208
+ | Surface | v0.2.x behaviour | v0.2.503 behaviour | Breaking? |
209
+ |---------|------------------|------------------|-----------|
210
+ | `~/.local/bin/dot` | Deployed by chezmoi | Replaced by Homebrew/Scoop install, OR symlinked by chezmoi from the new source | Yes — path may move; migration script handles it |
211
+ | `~/.zshrc` etc | Source-pinned at `dot_zshrc` | Source-pinned at `defaults/home/dot_zshrc`, chezmoi reads via `.chezmoiroot` | No — destination path unchanged |
212
+ | `dot <cmd>` API | All subcommands work as documented | Same | No |
213
+ | `scripts/dot/commands/*.sh` consumers | Direct source paths used in user customisations | Path moves to `lib/commands/*.sh` | Yes — affects any user who source'd these directly |
214
+ | `.chezmoidata.toml` | Repo root | Repo root (unchanged for compatibility with old user `chezmoi init` flows) | No |
215
+
216
+ ### Two-version deprecation window
217
+
218
+ v0.2.503 ships with the migration script and a deprecation warning
219
+ in `dot doctor`. v0.4.0 removes any v0.2.x shim code. Users who
220
+ skip v0.2.503 entirely (v0.2.x → v0.4.0) hit a hard error and must
221
+ run the migration tool from a v0.3.x release manually.
222
+
223
+ ## Alternatives considered
224
+
225
+ ### A) Keep the chezmoi monorepo as-is
226
+
227
+ **Pros**: zero migration cost; works today.
228
+ **Rejected**: blocks Homebrew/Scoop/AUR publication permanently. The
229
+ Top-5 adoption gap remains. R4 audit's "9.0/10 internal · 7.5/10
230
+ adoption" plateau persists.
231
+
232
+ ### B) Two-repo split (framework + defaults)
233
+
234
+ Publish `dot` framework at `sebastienrousseau/dot` and the
235
+ maintainer's personal defaults at `sebastienrousseau/dotfiles`.
236
+
237
+ **Pros**: cleanest possible separation. Framework forks trivial.
238
+ **Rejected (for v0.3)**: requires a second repo, doubles the CI
239
+ matrix, and forces users to install from two sources. Defer to
240
+ v0.4 if v0.3 single-repo with `.chezmoiroot` proves insufficient.
241
+
242
+ ### C) Rename current root files only (cosmetic)
243
+
244
+ Just rename `bin/dot` → `bin/executable_dot`
245
+ without `.chezmoiroot`.
246
+
247
+ **Rejected**: chezmoi only resolves the `executable_` /
248
+ `dot_` prefixes for files inside its source root, so moving the
249
+ prefixed file outside breaks chezmoi-driven install entirely
250
+ without giving us a standalone tarball.
251
+
252
+ ## Unresolved questions
253
+
254
+ 1. **How does the `defaults/` subtree behave when a user wants to override one default?** Today they edit `dot_config/X.tmpl` directly. Post-reorg, do they: (a) edit `defaults/config/X.tmpl` and live with merge conflicts on framework updates, or (b) use a chezmoi `data` override + template conditional, or (c) maintain a second repo layered atop `defaults/`?
255
+ 2. **Should `install/migrate/` ship in the regular framework install, or only via a one-shot `https://...migrate.sh` URL?** Bundling it forever increases install size; URL-only requires the user to find and trust the right URL during a stressful upgrade moment.
256
+ 3. **Does `.chezmoiroot` survive existing user customisations in `~/.config/chezmoi/chezmoi.toml`?** Needs verification on a real upgrade test.
257
+ 4. **Windows-native `bin/dot`**: standalone PowerShell rewrite, or wrapper that shells to bash via WSL/git-bash? `POWERSHELL_PARITY.md` documents the current stub state.
258
+
259
+ ## Implementation plan
260
+
261
+ | Phase | Scope | Effort |
262
+ |-------|-------|--------|
263
+ | 1 | Draft + ratify this RFC. Get user OK. | Done (this PR's draft) |
264
+ | 2 | Create `defaults/`, `bin/`, `lib/`, `share/`, `tools/` and copy files. Update bash source paths. Add `.chezmoiroot`. | 1 week |
265
+ | 3 | Write `install/migrate/migrate-v0_2-to-v0_3.sh`. Test against a synthetic v0.2.503-installed environment. | 3 days |
266
+ | 4 | Update CI: every workflow that references `scripts/`, `dot_local/`, `dot_config/` needs path updates. | 3 days |
267
+ | 5 | Update every doc that references the old paths. Most are in `docs/manual/`. | 1 day |
268
+ | 6 | Cut v0.2.999 RC as a deprecation-warning-only release; let real users dry-run the migration. | 1 day + 2-week soak |
269
+ | 7 | Cut v0.2.503 with the actual reorg + migration tool. | 1 day |
270
+ | 8 | Publish to Homebrew/Scoop/AUR using `install/{homebrew,scoop,aur}/` scaffolds. | 1 week |
271
+ | **Total** | | **~5 weeks calendar time** |
272
+
273
+ ## See also
274
+
275
+ - `HARD_AUDIT_2026.md` §8.3 — cross-platform gap analysis.
276
+ - `HARD_AUDIT_2026.md` §8.5 — Top-5 de-facto adoption gaps.
277
+ - `STRUCTURE.md` — today's layout (honest about the chezmoi-prefix forcing function).
278
+ - `GOVERNANCE.md` — RFC process this document follows.
279
+ - `install/README.md` — distribution-channel publication checklist.
280
+ - Reference: [Debian/aws-cli](https://github.com/Debian/aws-cli) — clean top-level discipline.