@sebastienrousseau/dotfiles 0.2.502 → 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 (412) hide show
  1. package/CHANGELOG.md +83 -9
  2. package/LICENSE +21 -1283
  3. package/README.md +5 -3
  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 +27 -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 +4 -4
  56. package/scripts/diagnostics/conflicts.sh +2 -2
  57. package/scripts/diagnostics/doctor-unified.sh +2 -2
  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 +4 -4
  64. package/scripts/diagnostics/scorecard.sh +4 -4
  65. package/scripts/diagnostics/security-score.sh +2 -2
  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 +2 -2
  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 +144 -25
  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 +12 -11
  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 +2 -2
  92. package/scripts/git-hooks/pre-push +13 -0
  93. package/scripts/ops/ai-setup.sh +1 -1
  94. package/scripts/ops/bundle.sh +2 -2
  95. package/scripts/ops/chaos.sh +2 -2
  96. package/scripts/ops/chezmoi-apply.sh +4 -4
  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 +8 -1
  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 +55 -7
  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
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ #
4
+ # Verify that every "live" version reference matches the canonical
5
+ # version in .chezmoidata.toml. The intent is to catch drift between
6
+ # the source-of-truth and the human-visible surfaces (CLI banner, man
7
+ # page, badge URL, etc.) BEFORE it ships.
8
+ #
9
+ # Historical references (CHANGELOG entries, audit-doc closed-cycle
10
+ # tables, roadmap docs that mention previous versions) are NOT
11
+ # checked — they are intentionally pinned to the version they
12
+ # describe.
13
+ #
14
+ # Usage:
15
+ # scripts/qa/check-version-consistency.sh # verify
16
+ # scripts/qa/check-version-consistency.sh --fix # auto-fix
17
+ # scripts/qa/check-version-consistency.sh --quiet # rc-only
18
+ #
19
+ # Exit codes:
20
+ # 0 every live reference matches
21
+ # 1 drift detected (with diff printed unless --quiet)
22
+ # 2 bad usage / missing canonical version
23
+
24
+ set -euo pipefail
25
+
26
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
27
+ cd "$REPO_ROOT"
28
+
29
+ # ── Parse flags ─────────────────────────────────────────────────────────
30
+ fix=0
31
+ quiet=0
32
+ for arg in "$@"; do
33
+ case "$arg" in
34
+ --fix) fix=1 ;;
35
+ --quiet | -q) quiet=1 ;;
36
+ -h | --help)
37
+ sed -n '2,21p' "$0"
38
+ exit 0
39
+ ;;
40
+ *)
41
+ echo "unknown flag: $arg" >&2
42
+ exit 2
43
+ ;;
44
+ esac
45
+ done
46
+
47
+ _log() { ((quiet)) || printf '%s\n' "$*"; }
48
+ _err() { printf 'check-version-consistency: %s\n' "$*" >&2; }
49
+
50
+ # ── Canonical version ──────────────────────────────────────────────────
51
+ canonical="$(grep -E '^dotfiles_version[[:space:]]*=' defaults/.chezmoidata.toml |
52
+ head -1 | sed -E 's/.*"([^"]+)".*/\1/')"
53
+
54
+ if [[ -z "$canonical" ]]; then
55
+ _err 'failed to read dotfiles_version from defaults/.chezmoidata.toml'
56
+ exit 2
57
+ fi
58
+ _log "canonical: $canonical (defaults/.chezmoidata.toml)"
59
+
60
+ # ── Per-file expected-substring map ────────────────────────────────────
61
+ # Each entry: PATH|MATCH_PATTERN|EXPECTED_STRING
62
+ # MATCH_PATTERN is a fixed substring to grep for on the file to
63
+ # locate the version-bearing line; we then verify it contains the
64
+ # expected substring rendered with $canonical. version-sync.sh
65
+ # already handles many files (it reads package.json as source);
66
+ # this list captures the surfaces version-sync.sh historically
67
+ # missed — bento.sh banner, man-page header, dispatcher header.
68
+ specs=(
69
+ "package.json|\"version\"|\"version\": \"${canonical}\""
70
+ "bin/dot|^VERSION=|VERSION=\"${canonical}\""
71
+ "bin/dot|^# Dotfiles CLI Entry Point - v|# Dotfiles CLI Entry Point - v${canonical}"
72
+ "share/man/man1/dot.1|^.TH DOT 1|dotfiles v${canonical}"
73
+ "lib/dot/bento.sh|D O T F I L E S|[v${canonical}]"
74
+ "README.md|img.shields.io/badge/Version|Version-v${canonical}-blue"
75
+ "CLAUDE.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
76
+ "AGENTS.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
77
+ )
78
+
79
+ drift=0
80
+ for spec in "${specs[@]}"; do
81
+ IFS='|' read -r path pattern expected <<<"$spec"
82
+ if [[ ! -f "$path" ]]; then
83
+ _err "MISSING: $path (declared in spec list)"
84
+ drift=$((drift + 1))
85
+ continue
86
+ fi
87
+ line="$(grep -E "$pattern" "$path" | head -1 || true)"
88
+ if [[ -z "$line" ]]; then
89
+ _err "PATTERN NOT FOUND: '$pattern' in $path"
90
+ drift=$((drift + 1))
91
+ continue
92
+ fi
93
+ if [[ "$line" != *"$expected"* ]]; then
94
+ _err "DRIFT in $path"
95
+ _err " found: $line"
96
+ _err " expected: contains '$expected'"
97
+ drift=$((drift + 1))
98
+ if ((fix)); then
99
+ # Auto-fix: only safe when the file contains a previous v0.X.YYY
100
+ # we can sed-replace. Skip otherwise.
101
+ old="$(printf '%s' "$line" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
102
+ if [[ -n "$old" ]] && [[ "$old" != "v${canonical}" ]]; then
103
+ sed -i.bak "s|${old}|v${canonical}|g" "$path" && rm -f "$path.bak"
104
+ _log " fixed: $path ($old → v${canonical})"
105
+ fi
106
+ fi
107
+ fi
108
+ done
109
+
110
+ if ((drift > 0)); then
111
+ if ((fix)); then
112
+ _log ""
113
+ _log "Auto-fixed where safe. Re-run without --fix to verify."
114
+ else
115
+ _log ""
116
+ _log "Tip: rerun with --fix to auto-correct (only safe substitutions)."
117
+ _log " For non-trivial drift, edit the file manually then re-run."
118
+ fi
119
+ exit 1
120
+ fi
121
+
122
+ _log "all $((${#specs[@]})) live version surfaces match $canonical"
123
+ exit 0
@@ -43,7 +43,7 @@ integration_tests="$(find "$REPO_ROOT/tests/integration" -name 'test_*.sh' | wc
43
43
  total_tests="$(find "$REPO_ROOT/tests" -path '*/framework/*' -prune -o -name 'test_*.sh' -print | wc -l | tr -d ' ')"
44
44
  named_tests="$(rg -o '\btest_start\b' "$REPO_ROOT/tests/unit" "$REPO_ROOT/tests/integration" -g 'test_*.sh' | wc -l | tr -d ' ')"
45
45
  docs_files="$(find "$REPO_ROOT/docs" -type f \( -name '*.md' -o -name '*.md.tmpl' \) | wc -l | tr -d ' ')"
46
- shell_surfaces="$(find "$REPO_ROOT/scripts" "$REPO_ROOT/dot_local/bin" "$REPO_ROOT/.chezmoitemplates/functions" -type f \( -name '*.sh' -o -name 'executable_*' \) | wc -l | tr -d ' ')"
46
+ shell_surfaces="$(find "$REPO_ROOT/scripts" "$REPO_ROOT/defaults/dot_local/bin" "$REPO_ROOT/defaults/.chezmoitemplates/functions" -type f \( -name '*.sh' -o -name 'executable_*' \) | wc -l | tr -d ' ')"
47
47
 
48
48
  printf 'Coverage Baseline\n'
49
49
  printf 'Repository: %s\n' "$REPO_ROOT"
@@ -5,12 +5,12 @@ set -euo pipefail
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
6
  REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
7
7
 
8
- DOT_CLI="$REPO_ROOT/dot_local/bin/executable_dot"
8
+ DOT_CLI="$REPO_ROOT/bin/dot"
9
9
  UTILS_DOC="$REPO_ROOT/docs/reference/UTILS.md"
10
10
  AI_DOC="$REPO_ROOT/docs/AI.md"
11
11
  SCRIPTS_DOC="$REPO_ROOT/docs/reference/SCRIPTS.md"
12
12
  ARCH_DOC="$REPO_ROOT/docs/architecture/ARCHITECTURE.md"
13
- FUNCTION_GROUPS_JSON="$REPO_ROOT/.chezmoitemplates/functions/groups.json"
13
+ FUNCTION_GROUPS_JSON="$REPO_ROOT/defaults/.chezmoitemplates/functions/groups.json"
14
14
  MIN_DOCS_COVERAGE="${MIN_DOCS_COVERAGE:-100}"
15
15
 
16
16
  TOTAL_CHECKS=0
@@ -16,7 +16,7 @@ $ErrorActionPreference = 'Stop'
16
16
  $Failures = New-Object System.Collections.Generic.List[string]
17
17
 
18
18
  $RepoRoot = if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { (Get-Location).Path }
19
- $ProfileSrc = Join-Path $RepoRoot 'dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl'
19
+ $ProfileSrc = Join-Path $RepoRoot 'defaults/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl'
20
20
 
21
21
  if (-not (Test-Path $ProfileSrc)) {
22
22
  Write-Output "FAIL: profile source not found at $ProfileSrc"
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ #
4
+ # Fetch the current OpenSSF Scorecard result and refresh the
5
+ # per-check posture table in docs/security/SCORECARD.md.
6
+ #
7
+ # The narrative sections (open findings, exceptions, closed-this-
8
+ # cycle log) are preserved as-is — only the auto-generated
9
+ # baseline block between the BEGIN/END markers is rewritten.
10
+ #
11
+ # Usage:
12
+ # scripts/qa/scorecard-snapshot.sh # refresh
13
+ # scripts/qa/scorecard-snapshot.sh --check # exit 1 if stale
14
+ #
15
+ # Exit codes:
16
+ # 0 snapshot up-to-date / written
17
+ # 1 --check mode and content drifted
18
+ # 2 bad usage / Scorecard API unreachable
19
+
20
+ set -euo pipefail
21
+
22
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
23
+ cd "$REPO_ROOT"
24
+
25
+ mode="write"
26
+ for arg in "$@"; do
27
+ case "$arg" in
28
+ --check) mode="check" ;;
29
+ -h | --help)
30
+ sed -n '2,16p' "$0"
31
+ exit 0
32
+ ;;
33
+ *)
34
+ echo "unknown flag: $arg" >&2
35
+ exit 2
36
+ ;;
37
+ esac
38
+ done
39
+
40
+ api='https://api.scorecard.dev/projects/github.com/sebastienrousseau/dotfiles'
41
+ target='docs/security/SCORECARD.md'
42
+
43
+ [[ -f "$target" ]] || {
44
+ echo "target not found: $target" >&2
45
+ exit 2
46
+ }
47
+
48
+ if ! command -v jq >/dev/null 2>&1; then
49
+ echo "jq required" >&2
50
+ exit 2
51
+ fi
52
+
53
+ payload="$(curl -sSfL "$api")" || {
54
+ echo "Scorecard API unreachable: $api" >&2
55
+ exit 2
56
+ }
57
+
58
+ aggregate="$(printf '%s' "$payload" | jq -r '.score')"
59
+ date="$(printf '%s' "$payload" | jq -r '.date')"
60
+
61
+ # Build the auto-block: per-check status + score, one row each.
62
+ block="$(mktemp)"
63
+ trap 'rm -f "$block"' EXIT
64
+
65
+ {
66
+ printf '<!-- BEGIN scorecard-snapshot (auto-generated, do not edit by hand) -->\n'
67
+ printf 'Aggregate score **%s / 10** at %s.\n\n' "$aggregate" "$date"
68
+ printf '| Check | Score | Reason |\n'
69
+ printf '|---|---:|---|\n'
70
+ printf '%s' "$payload" |
71
+ jq -r '.checks
72
+ | sort_by(.name)
73
+ | .[]
74
+ | [.name, (.score|tostring), ((.reason // "") | gsub("\\|"; "\\|") | .[0:100])]
75
+ | "| " + (. | join(" | ")) + " |"'
76
+ # shellcheck disable=SC2016 # backticks here are markdown code-spans, not subshells
77
+ printf '\n_Refresh: `scripts/qa/scorecard-snapshot.sh` · CI check: `lint/scorecard-snapshot` (planned)._\n'
78
+ printf '<!-- END scorecard-snapshot -->\n'
79
+ } >"$block"
80
+
81
+ # Splice the block into the target. Find the BEGIN/END markers; if
82
+ # they're not yet present, append the block after the "## Live
83
+ # score" section header.
84
+ out="$(mktemp)"
85
+ trap 'rm -f "$block" "$out"' EXIT
86
+
87
+ if grep -q '<!-- BEGIN scorecard-snapshot' "$target"; then
88
+ awk -v blockfile="$block" '
89
+ BEGIN { skip = 0 }
90
+ /<!-- BEGIN scorecard-snapshot/ {
91
+ skip = 1
92
+ while ((getline line < blockfile) > 0) print line
93
+ close(blockfile)
94
+ next
95
+ }
96
+ /<!-- END scorecard-snapshot -->/ {
97
+ skip = 0
98
+ next
99
+ }
100
+ skip == 0 { print }
101
+ ' "$target" >"$out"
102
+ else
103
+ # First run — inject right after the "## Live score" h2.
104
+ awk -v blockfile="$block" '
105
+ { print }
106
+ /^## Live score$/ && !inserted {
107
+ print ""
108
+ while ((getline line < blockfile) > 0) print line
109
+ close(blockfile)
110
+ inserted = 1
111
+ }
112
+ ' "$target" >"$out"
113
+ fi
114
+
115
+ if [[ "$mode" == "check" ]]; then
116
+ if ! diff -q "$target" "$out" >/dev/null 2>&1; then
117
+ echo "SCORECARD.md snapshot is stale (live score: $aggregate)." >&2
118
+ diff -u "$target" "$out" | head -50 >&2
119
+ exit 1
120
+ fi
121
+ echo "SCORECARD.md snapshot is in sync (aggregate: $aggregate)"
122
+ exit 0
123
+ fi
124
+
125
+ mv "$out" "$target"
126
+ trap - EXIT
127
+ echo "Refreshed $target (aggregate: $aggregate as of $date)"
@@ -34,9 +34,9 @@
34
34
  set -euo pipefail
35
35
 
36
36
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
37
- # shellcheck source=../dot/lib/ui.sh
37
+ # shellcheck source=../../lib/dot/ui.sh
38
38
  # shellcheck disable=SC1091
39
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
39
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
40
40
 
41
41
  ui_init
42
42
  ui_header "Backup"
@@ -3,12 +3,12 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
- # shellcheck source=../dot/lib/platform.sh
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
+ # shellcheck source=../../lib/dot/platform.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
12
12
 
13
13
  DRY_RUN=0
14
14
  for arg in "$@"; do
@@ -3,12 +3,12 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
- # shellcheck source=../dot/lib/platform.sh
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
+ # shellcheck source=../../lib/dot/platform.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
12
12
 
13
13
  ui_init
14
14
  ui_header "Encryption Check"
@@ -13,9 +13,9 @@ readonly REPO_ROOT
13
13
  readonly POLICIES_DIR="${REPO_ROOT}/.github/security-policies"
14
14
  readonly LOG_FILE="${REPO_ROOT}/.security-audit.log"
15
15
 
16
- # shellcheck source=../dot/lib/ui.sh
16
+ # shellcheck source=../../lib/dot/ui.sh
17
17
  # shellcheck disable=SC1091
18
- source "${SCRIPT_DIR}/../dot/lib/ui.sh"
18
+ source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
19
19
  ui_init
20
20
 
21
21
  # Logging function (also writes to log file)
@@ -37,12 +37,12 @@
37
37
  set -euo pipefail
38
38
 
39
39
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
40
- # shellcheck source=../dot/lib/ui.sh
40
+ # shellcheck source=../../lib/dot/ui.sh
41
41
  # shellcheck disable=SC1091
42
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
43
- # shellcheck source=../dot/lib/platform.sh
42
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
43
+ # shellcheck source=../../lib/dot/platform.sh
44
44
  # shellcheck disable=SC1091
45
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
45
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
46
46
 
47
47
  DRY_RUN=0
48
48
  for arg in "$@"; do
@@ -3,12 +3,12 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
- # shellcheck source=../dot/lib/platform.sh
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
+ # shellcheck source=../../lib/dot/platform.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
12
12
 
13
13
  DRY_RUN=0
14
14
  for arg in "$@"; do
@@ -39,9 +39,9 @@ readonly REPO_ROOT
39
39
  readonly ENV_TEMPLATE="${REPO_ROOT}/.github/security-policies/environment-template.env"
40
40
  readonly ENV_LOCAL="${REPO_ROOT}/.env.local"
41
41
 
42
- # shellcheck source=../dot/lib/ui.sh
42
+ # shellcheck source=../../lib/dot/ui.sh
43
43
  # shellcheck disable=SC1091
44
- source "${SCRIPT_DIR}/../dot/lib/ui.sh"
44
+ source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
45
45
  ui_init
46
46
 
47
47
  # Help text
@@ -27,9 +27,9 @@ CA_PROVISIONER="${SSH_CERT_CA_PROVISIONER:-}"
27
27
  # ---------- helpers -------------------------------------------------------- #
28
28
 
29
29
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
- # shellcheck source=../dot/lib/ui.sh
30
+ # shellcheck source=../../lib/dot/ui.sh
31
31
  # shellcheck disable=SC1091
32
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
32
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
33
33
  ui_init
34
34
 
35
35
  info() { ui_info "ssh-cert" "$*"; }
@@ -3,12 +3,12 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
- # shellcheck source=../dot/lib/platform.sh
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
+ # shellcheck source=../../lib/dot/platform.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
12
12
 
13
13
  DRY_RUN=0
14
14
  for arg in "$@"; do
@@ -3,12 +3,12 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
9
- # shellcheck source=../dot/lib/platform.sh
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
+ # shellcheck source=../../lib/dot/platform.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
12
12
 
13
13
  DRY_RUN=0
14
14
  for arg in "$@"; do
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # extract-heic-frames.sh — extract per-frame PNGs from dynamic HEIC wallpapers.
4
+ #
5
+ # Apple's dynamic HEIC format packs two images (frame 0 = light, frame 1 =
6
+ # dark) in one container. DMS's matugen worker reads the wallpaper path from
7
+ # ~/.local/state/DankMaterialShell/session.json and feeds it to matugen,
8
+ # which calls ImageMagick's heif decoder. On many systems (Arch Linux's
9
+ # libheif 1.23 + libde265 1.1 is one) that decoder fails to decompress
10
+ # Apple's dynamic HEIC with:
11
+ #
12
+ # Decoder plugin generated an error: Unspecified: Decoding the input
13
+ # data did not give a decompressed image.
14
+ #
15
+ # Symptom: every `dot theme <family>` for a HEIC-only family produces
16
+ # a matugen "Theme worker FATAL" in the dms journal and the dynamic
17
+ # color scheme stops regenerating.
18
+ #
19
+ # Workaround: pre-extract `{family}-0.png` (light) and `{family}-1.png`
20
+ # (dark) PNG frames next to each HEIC. wallpaper-sync.sh's resolver
21
+ # prefers `{family}-{0,1}.png` over `{family}.heic`, so DMS gets the
22
+ # decodable PNG instead of the broken HEIC.
23
+ #
24
+ # We use libheif's `heif-dec -d ffmpeg` because libde265 fails where
25
+ # the bundled ffmpeg decoder succeeds for the same input.
26
+ #
27
+ # Usage:
28
+ # bash scripts/theme/extract-heic-frames.sh # all HEICs in default dir
29
+ # bash scripts/theme/extract-heic-frames.sh --force # re-extract even if PNGs exist
30
+ # bash scripts/theme/extract-heic-frames.sh --dry-run # show what would extract
31
+ # DOTFILES_WALLPAPER_DIR=/path bash scripts/.../extract-heic-frames.sh
32
+
33
+ set -euo pipefail
34
+
35
+ WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
36
+ FORCE=0
37
+ DRY_RUN=0
38
+
39
+ for arg in "$@"; do
40
+ case "$arg" in
41
+ --force | -f) FORCE=1 ;;
42
+ --dry-run | -n) DRY_RUN=1 ;;
43
+ --help | -h)
44
+ sed -n '4,30p' "${BASH_SOURCE[0]}"
45
+ exit 0
46
+ ;;
47
+ *)
48
+ echo "Unknown option: $arg" >&2
49
+ exit 1
50
+ ;;
51
+ esac
52
+ done
53
+
54
+ if [[ ! -d "$WALLPAPER_DIR" ]]; then
55
+ echo "Wallpaper dir not found: $WALLPAPER_DIR" >&2
56
+ exit 1
57
+ fi
58
+
59
+ for cmd in magick heif-dec; do
60
+ if ! command -v "$cmd" >/dev/null 2>&1; then
61
+ echo "Required: $cmd (install ImageMagick + libheif-tools)" >&2
62
+ exit 1
63
+ fi
64
+ done
65
+
66
+ cd "$WALLPAPER_DIR"
67
+
68
+ extracted=0
69
+ skipped=0
70
+ single=0
71
+ failed=()
72
+ tmp_prefix="$(mktemp -d)/heic"
73
+
74
+ trap 'rm -rf "$(dirname "$tmp_prefix")"' EXIT
75
+
76
+ for f in *.heic; do
77
+ [[ -e "$f" ]] || continue
78
+ name="${f%.heic}"
79
+
80
+ if [[ $FORCE -eq 0 && -f "${name}-0.png" && -f "${name}-1.png" ]]; then
81
+ ((skipped++)) || true
82
+ continue
83
+ fi
84
+
85
+ frames=$(magick identify "$f" 2>/dev/null | wc -l | tr -d ' ')
86
+ if [[ "$frames" -lt 2 ]]; then
87
+ ((single++)) || true
88
+ continue
89
+ fi
90
+
91
+ if [[ $DRY_RUN -eq 1 ]]; then
92
+ echo "would extract: $name (frames=$frames)"
93
+ continue
94
+ fi
95
+
96
+ if heif-dec -d ffmpeg "$f" "${tmp_prefix}-${name}.png" >/dev/null 2>&1 &&
97
+ [[ -f "${tmp_prefix}-${name}-1.png" && -f "${tmp_prefix}-${name}-2.png" ]]; then
98
+ # heif-dec writes 1-indexed (-1, -2). Our convention is 0-indexed:
99
+ # light = frame 0, dark = frame 1.
100
+ mv "${tmp_prefix}-${name}-1.png" "${name}-0.png"
101
+ mv "${tmp_prefix}-${name}-2.png" "${name}-1.png"
102
+ ((extracted++)) || true
103
+ echo " + $name"
104
+ else
105
+ failed+=("$name")
106
+ fi
107
+ done
108
+
109
+ echo "---"
110
+ echo "extracted: $extracted skipped (already have PNGs): $skipped single-frame: $single failed: ${#failed[@]}"
111
+ if [[ ${#failed[@]} -gt 0 ]]; then
112
+ printf ' ! %s\n' "${failed[@]}"
113
+ exit 1
114
+ fi
@@ -15,7 +15,14 @@ set -euo pipefail
15
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  EXTRACT_SCRIPT="$SCRIPT_DIR/extract-theme.py"
17
17
  DOTFILES_DIR="${HOME}/.dotfiles"
18
- THEMES_FILE="$DOTFILES_DIR/.chezmoidata/themes.toml"
18
+
19
+ # Descend into the chezmoi source subdir when .chezmoiroot is present (v0.2.503+)
20
+ CHEZMOI_SRC="$DOTFILES_DIR"
21
+ if [[ -f "$DOTFILES_DIR/.chezmoiroot" ]]; then
22
+ _sub="$(head -1 "$DOTFILES_DIR/.chezmoiroot" | tr -d '[:space:]')"
23
+ [[ -n "$_sub" && -d "$DOTFILES_DIR/$_sub" ]] && CHEZMOI_SRC="$DOTFILES_DIR/$_sub"
24
+ fi
25
+ THEMES_FILE="$CHEZMOI_SRC/.chezmoidata/themes.toml"
19
26
  CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/themes"
20
27
  CUSTOM_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
21
28
 
@@ -30,9 +30,9 @@ cleanup() {
30
30
  trap cleanup EXIT
31
31
 
32
32
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
- # shellcheck source=../dot/lib/ui.sh
33
+ # shellcheck source=../../lib/dot/ui.sh
34
34
  # shellcheck disable=SC1091
35
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
35
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
36
36
 
37
37
  ui_init
38
38
 
@@ -58,8 +58,15 @@ if [ -z "$SRC_DIR" ]; then
58
58
  exit 1
59
59
  fi
60
60
 
61
- DATA_FILE="$SRC_DIR/.chezmoidata.toml"
62
- THEMES_FILE="$SRC_DIR/.chezmoidata/themes.toml"
61
+ # Descend into the chezmoi source subdir when .chezmoiroot is present (v0.2.503+)
62
+ CHEZMOI_SRC="$SRC_DIR"
63
+ if [[ -f "$SRC_DIR/.chezmoiroot" ]]; then
64
+ _sub="$(head -1 "$SRC_DIR/.chezmoiroot" | tr -d '[:space:]')"
65
+ [[ -n "$_sub" && -d "$SRC_DIR/$_sub" ]] && CHEZMOI_SRC="$SRC_DIR/$_sub"
66
+ fi
67
+
68
+ DATA_FILE="$CHEZMOI_SRC/.chezmoidata.toml"
69
+ THEMES_FILE="$CHEZMOI_SRC/.chezmoidata/themes.toml"
63
70
  WALLPAPER_DIR="${DOTFILES_WALLPAPER_DIR:-$HOME/Pictures/Wallpapers}"
64
71
  if [ ! -f "$DATA_FILE" ]; then
65
72
  ui_err "Missing" "$DATA_FILE"
@@ -124,8 +131,8 @@ paired_families() {
124
131
  wallpaper_source() {
125
132
  local family="${1:-}"
126
133
  # Check for custom wallpapers: dynamic (family.heic) or split (family-dark/light.ext)
127
- for ext in heic jpg png; do
128
- if [[ -f "$WALLPAPER_DIR/${family}.${ext}" || -f "$WALLPAPER_DIR/${family}-dark.${ext}" || -f "$WALLPAPER_DIR/${family}-light.${ext}" ]]; then
134
+ for ext in heic jpg png webp; do
135
+ if [[ -f "$WALLPAPER_DIR/${family}.${ext}" || -f "$WALLPAPER_DIR/${family}-dark.${ext}" || -f "$WALLPAPER_DIR/${family}-light.${ext}" || -f "$WALLPAPER_DIR/${family}-0.${ext}" ]]; then
129
136
  echo "Custom"
130
137
  return
131
138
  fi