@sebastienrousseau/dotfiles 0.2.502 → 0.2.504

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/CHANGELOG.md +109 -9
  2. package/LICENSE +21 -1283
  3. package/README.md +6 -4
  4. package/docs/CONFIG_STRATEGY.md +124 -0
  5. package/docs/COPYRIGHT +1 -1
  6. package/docs/GOVERNANCE.md +98 -0
  7. package/docs/MAINTAINERS.md +41 -0
  8. package/docs/OPENCODE.md +127 -0
  9. package/docs/README.md +2 -0
  10. package/docs/STRUCTURE.md +102 -0
  11. package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
  12. package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
  13. package/docs/architecture/REPO_LAYOUT.md +8 -8
  14. package/docs/archive/MILESTONE_v0.2.493.md +1 -1
  15. package/docs/index.md +2 -2
  16. package/docs/interop/POWERSHELL.md +1 -1
  17. package/docs/manual/00-introduction.md +1 -1
  18. package/docs/manual/01-concepts/02-trust-model.md +1 -1
  19. package/docs/manual/03-reference/02-config-files.md +2 -2
  20. package/docs/manual/_toc.yml +1 -1
  21. package/docs/manual/command-index.md +72 -59
  22. package/docs/operations/CI_COMPOSITES.md +2 -2
  23. package/docs/operations/COMPLETIONS.md +2 -2
  24. package/docs/operations/COVERAGE.md +5 -5
  25. package/docs/operations/HARD_AUDIT_2026.md +11 -11
  26. package/docs/operations/MAINTENANCE.md +3 -3
  27. package/docs/operations/MANIFEST.md +127 -0
  28. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  29. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  30. package/docs/operations/ROADMAP_2026.md +6 -6
  31. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  32. package/docs/operations/TESTING.md +17 -0
  33. package/docs/operations/TRACEABILITY.md +6 -3
  34. package/docs/operations/VERSION_SYNC.md +4 -4
  35. package/docs/reference/POWERSHELL_PARITY.md +8 -7
  36. package/docs/schema/dot-env-v1.json +110 -0
  37. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  38. package/docs/security/CI_PINNING.md +17 -9
  39. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  40. package/docs/security/FUZZING.md +114 -0
  41. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  42. package/docs/security/POLICY_RELEASES.md +2 -2
  43. package/docs/security/SCORECARD.md +58 -3
  44. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  45. package/docs/security/VERIFY_RELEASE.md +201 -0
  46. package/install.sh +118 -5
  47. package/package.json +1 -1
  48. package/scripts/README.md +123 -0
  49. package/scripts/ci/check-copyright-headers.sh +4 -93
  50. package/scripts/ci/check-shell-preamble.sh +4 -103
  51. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  52. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  53. package/scripts/diagnostics/alias-governance.sh +1 -1
  54. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  55. package/scripts/diagnostics/benchmark.sh +5 -5
  56. package/scripts/diagnostics/conflicts.sh +2 -2
  57. package/scripts/diagnostics/doctor-unified.sh +3 -3
  58. package/scripts/diagnostics/doctor.sh +10 -10
  59. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  60. package/scripts/diagnostics/health.sh +4 -4
  61. package/scripts/diagnostics/history-analysis.sh +2 -2
  62. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  63. package/scripts/diagnostics/perf.sh +5 -5
  64. package/scripts/diagnostics/scorecard.sh +4 -4
  65. package/scripts/diagnostics/security-score.sh +25 -6
  66. package/scripts/diagnostics/smoke-test.sh +2 -2
  67. package/scripts/diagnostics/snapshot.sh +2 -2
  68. package/scripts/diagnostics/verify.sh +4 -4
  69. package/scripts/diagnostics/version-locks.sh +13 -3
  70. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  71. package/scripts/dot/commands/agent.sh +8 -0
  72. package/scripts/dot/commands/agents.sh +14 -4
  73. package/scripts/dot/commands/ai.sh +156 -37
  74. package/scripts/dot/commands/appearance.sh +2 -2
  75. package/scripts/dot/commands/core.sh +2 -2
  76. package/scripts/dot/commands/diagnostics.sh +5 -5
  77. package/scripts/dot/commands/env-emit.sh +202 -0
  78. package/scripts/dot/commands/fleet.sh +22 -16
  79. package/scripts/dot/commands/init.sh +4 -4
  80. package/scripts/dot/commands/lint.sh +9 -4
  81. package/scripts/dot/commands/manual.sh +3 -3
  82. package/scripts/dot/commands/meta.sh +12 -6
  83. package/scripts/dot/commands/patterns.sh +2 -2
  84. package/scripts/dot/commands/registry.sh +4 -4
  85. package/scripts/dot/commands/restore.sh +4 -4
  86. package/scripts/dot/commands/secrets.sh +4 -3
  87. package/scripts/dot/commands/security.sh +2 -2
  88. package/scripts/dot/commands/tools.sh +13 -3
  89. package/scripts/dot/powershell/Dot.psm1 +199 -0
  90. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  91. package/scripts/git-hooks/pre-commit-audit.sh +3 -3
  92. package/scripts/git-hooks/pre-push +13 -0
  93. package/scripts/ops/ai-setup.sh +1 -1
  94. package/scripts/ops/bundle.sh +3 -3
  95. package/scripts/ops/chaos.sh +2 -2
  96. package/scripts/ops/chezmoi-apply.sh +12 -6
  97. package/scripts/ops/heal.sh +4 -4
  98. package/scripts/ops/post-apply-repair.sh +2 -2
  99. package/scripts/ops/prewarm.sh +2 -2
  100. package/scripts/ops/release.sh +4 -4
  101. package/scripts/ops/rollback.sh +4 -4
  102. package/scripts/ops/setup.sh +2 -2
  103. package/scripts/qa/check-version-consistency.sh +123 -0
  104. package/scripts/qa/coverage-baseline.sh +1 -1
  105. package/scripts/qa/docs-coverage.sh +2 -2
  106. package/scripts/qa/powershell-contract.ps1 +1 -1
  107. package/scripts/qa/scorecard-snapshot.sh +127 -0
  108. package/scripts/security/backup.sh +2 -2
  109. package/scripts/security/dns-doh.sh +4 -4
  110. package/scripts/security/encryption-check.sh +4 -4
  111. package/scripts/security/enforce-policies.sh +2 -2
  112. package/scripts/security/firewall.sh +4 -4
  113. package/scripts/security/lock-screen.sh +4 -4
  114. package/scripts/security/manage-secrets.sh +2 -2
  115. package/scripts/security/ssh-cert.sh +2 -2
  116. package/scripts/security/telemetry-kill.sh +4 -4
  117. package/scripts/security/usb-safety.sh +4 -4
  118. package/scripts/theme/extract-heic-frames.sh +114 -0
  119. package/scripts/theme/rebuild-themes.sh +31 -2
  120. package/scripts/theme/switch.sh +13 -6
  121. package/scripts/theme/wallpaper-sync.sh +297 -93
  122. package/scripts/tuning/linux.sh +2 -2
  123. package/scripts/tuning/macos.sh +2 -2
  124. package/scripts/version-sync.sh +74 -10
  125. package/dot_config/.module-manifest.json +0 -69
  126. package/dot_config/ai/identity.md +0 -23
  127. package/dot_config/ai/patterns/architect.md +0 -16
  128. package/dot_config/ai/patterns/hardener.md +0 -15
  129. package/dot_config/ai/patterns/refactor.md +0 -15
  130. package/dot_config/aider/aider.conf.yml +0 -32
  131. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  132. package/dot_config/ansible/ansible.cfg +0 -11
  133. package/dot_config/atuin/config.toml.tmpl +0 -47
  134. package/dot_config/bat/config +0 -23
  135. package/dot_config/brave-flags.conf.tmpl +0 -7
  136. package/dot_config/btop/btop.conf +0 -16
  137. package/dot_config/btop/themes/tokyonight.theme +0 -34
  138. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  139. package/dot_config/claude/mcp_servers.json +0 -20
  140. package/dot_config/containers/containers.conf +0 -14
  141. package/dot_config/curl/dot_curlrc +0 -18
  142. package/dot_config/dlv/config.yml +0 -39
  143. package/dot_config/docker/config.json +0 -15
  144. package/dot_config/dotfiles/agent-card.json +0 -29
  145. package/dot_config/dotfiles/agent-profiles.json +0 -92
  146. package/dot_config/dotfiles/boot/README.md +0 -13
  147. package/dot_config/dotfiles/grub/README.md +0 -13
  148. package/dot_config/dotfiles/lock/README.md +0 -13
  149. package/dot_config/dotfiles/mcp-lock.json +0 -33
  150. package/dot_config/dotfiles/mcp-policy.json +0 -52
  151. package/dot_config/dotfiles/mcp-registry.json +0 -47
  152. package/dot_config/dotfiles/model-registry.json +0 -20
  153. package/dot_config/dotfiles/policy-bundles.json +0 -38
  154. package/dot_config/dotfiles/prompt-registry.json +0 -16
  155. package/dot_config/dotfiles/versions.env +0 -18
  156. package/dot_config/duf/duf.conf +0 -6
  157. package/dot_config/duti/defaults.duti +0 -5
  158. package/dot_config/emoji/emoji.txt +0 -34
  159. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  160. package/dot_config/environment.d/90-wayland.conf +0 -19
  161. package/dot_config/fastfetch/config.jsonc +0 -28
  162. package/dot_config/firefox/user.js.tmpl +0 -58
  163. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  164. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  165. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  166. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  167. package/dot_config/fish/conf.d/direnv.fish +0 -4
  168. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  169. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  170. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  171. package/dot_config/fish/conf.d/mise-activate.fish +0 -5
  172. package/dot_config/fish/config.fish.tmpl +0 -44
  173. package/dot_config/fish/fish_plugins +0 -1
  174. package/dot_config/fish/functions/_.fish +0 -3
  175. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  176. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  177. package/dot_config/fish/functions/als.fish +0 -46
  178. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  179. package/dot_config/fish/functions/c.fish +0 -3
  180. package/dot_config/fish/functions/cat.fish +0 -9
  181. package/dot_config/fish/functions/d.fish +0 -7
  182. package/dot_config/fish/functions/dot.fish +0 -34
  183. package/dot_config/fish/functions/h.fish +0 -3
  184. package/dot_config/fish/functions/l.fish +0 -7
  185. package/dot_config/fish/functions/la.fish +0 -7
  186. package/dot_config/fish/functions/ll.fish +0 -7
  187. package/dot_config/fish/functions/log_error.fish +0 -13
  188. package/dot_config/fish/functions/log_info.fish +0 -13
  189. package/dot_config/fish/functions/lr.fish +0 -7
  190. package/dot_config/fish/functions/lra.fish +0 -7
  191. package/dot_config/fish/functions/ls.fish +0 -7
  192. package/dot_config/fish/functions/lt.fish +0 -7
  193. package/dot_config/fish/functions/lta.fish +0 -7
  194. package/dot_config/fish/functions/notify-run.fish +0 -11
  195. package/dot_config/fish/functions/q.fish +0 -3
  196. package/dot_config/fish/functions/silent-run.fish +0 -7
  197. package/dot_config/fish/functions/yy.fish +0 -8
  198. package/dot_config/flatpak/flatpak.list +0 -4
  199. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  200. package/dot_config/foot/foot.ini.tmpl +0 -33
  201. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  202. package/dot_config/fzf/fzf.zsh +0 -48
  203. package/dot_config/gem/gemrc +0 -9
  204. package/dot_config/gh/config.yml +0 -12
  205. package/dot_config/ghostty/config.tmpl +0 -165
  206. package/dot_config/git/allowed_signers.tmpl +0 -18
  207. package/dot_config/git/attributes +0 -12
  208. package/dot_config/git/commit-template +0 -10
  209. package/dot_config/git/hooks/executable_commit-msg +0 -146
  210. package/dot_config/git/ignore +0 -27
  211. package/dot_config/gnupg/gpg-agent.conf +0 -11
  212. package/dot_config/go/golangci.yml +0 -118
  213. package/dot_config/go/gopls.json +0 -30
  214. package/dot_config/goose/config.yaml +0 -29
  215. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  216. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  217. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  218. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  219. package/dot_config/htop/htoprc +0 -20
  220. package/dot_config/inputrc +0 -2
  221. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  222. package/dot_config/just/justfile +0 -122
  223. package/dot_config/k9s/config.yaml +0 -65
  224. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  225. package/dot_config/kanshi/config.tmpl +0 -22
  226. package/dot_config/karabiner/karabiner.json +0 -14
  227. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  228. package/dot_config/lazydocker/config.yml +0 -186
  229. package/dot_config/lazygit/config.yml +0 -35
  230. package/dot_config/mako/config +0 -47
  231. package/dot_config/mas/masapps.txt +0 -5
  232. package/dot_config/micro/settings.json +0 -3
  233. package/dot_config/mimeapps.list +0 -77
  234. package/dot_config/minikube/config.json +0 -13
  235. package/dot_config/mise/config.toml +0 -99
  236. package/dot_config/mongosh/mongoshrc.js +0 -68
  237. package/dot_config/mpv/input.conf +0 -47
  238. package/dot_config/mpv/mpv.conf +0 -47
  239. package/dot_config/mycli/myclirc +0 -67
  240. package/dot_config/nano/nanorc +0 -28
  241. package/dot_config/ncdu/config +0 -12
  242. package/dot_config/niri/config.kdl.tmpl +0 -327
  243. package/dot_config/nushell/aliases.nu +0 -18
  244. package/dot_config/nushell/cached_eval.nu +0 -80
  245. package/dot_config/nushell/completions.nu.tmpl +0 -52
  246. package/dot_config/nushell/config.nu.tmpl +0 -86
  247. package/dot_config/nushell/env.nu.tmpl +0 -102
  248. package/dot_config/nushell/functions.nu.tmpl +0 -17
  249. package/dot_config/nvim/init.lua +0 -18
  250. package/dot_config/nvim/lazy-lock.json +0 -58
  251. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  252. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  253. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  254. package/dot_config/nvim/lua/config/options.lua +0 -49
  255. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  256. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  257. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  258. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  259. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  260. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  261. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  262. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  263. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  264. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  265. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  266. package/dot_config/paru/paru.conf +0 -10
  267. package/dot_config/pip/pip.conf.tmpl +0 -32
  268. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  269. package/dot_config/pueue/pueue.yml +0 -34
  270. package/dot_config/pypoetry/config.toml +0 -6
  271. package/dot_config/pyrightconfig.json +0 -5
  272. package/dot_config/raycast/README.md +0 -13
  273. package/dot_config/redis/redisclirc +0 -41
  274. package/dot_config/ripgrep/ripgreprc +0 -21
  275. package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
  276. package/dot_config/shell/05-core-safety.sh +0 -48
  277. package/dot_config/shell/10-secrets.sh +0 -41
  278. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  279. package/dot_config/shell/40-ls-colors.sh +0 -49
  280. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  281. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  282. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  283. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  284. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  285. package/dot_config/shell/Brewfile +0 -207
  286. package/dot_config/shell/Brewfile.cask +0 -92
  287. package/dot_config/shell/Brewfile.cli +0 -127
  288. package/dot_config/shell/README.md +0 -284
  289. package/dot_config/shell/als_data.txt.tmpl +0 -65
  290. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  291. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  292. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  293. package/dot_config/sops/dot_sops.yaml +0 -23
  294. package/dot_config/starship.toml.tmpl +0 -202
  295. package/dot_config/swaylock/config +0 -43
  296. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  297. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  298. package/dot_config/systemd/user/pueued.service +0 -12
  299. package/dot_config/systemd/user/ssh-agent.service +0 -12
  300. package/dot_config/task/Taskfile.yml +0 -86
  301. package/dot_config/tflint/tflint.hcl +0 -9
  302. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  303. package/dot_config/topgrade.toml.tmpl +0 -54
  304. package/dot_config/user-dirs.dirs +0 -10
  305. package/dot_config/vscode/extensions.txt +0 -11
  306. package/dot_config/vscode/settings.json.tmpl +0 -82
  307. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  308. package/dot_config/waybar/style.css.tmpl +0 -211
  309. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  310. package/dot_config/wget/wgetrc +0 -12
  311. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  312. package/dot_config/yarn/yarnrc.yml +0 -36
  313. package/dot_config/yazi/keymap.toml +0 -67
  314. package/dot_config/yazi/theme.toml +0 -102
  315. package/dot_config/yazi/yazi.toml +0 -40
  316. package/dot_config/zathura/zathurarc +0 -52
  317. package/dot_config/zellij/config.kdl.tmpl +0 -79
  318. package/dot_config/zsh/dot_zprofile +0 -7
  319. package/dot_config/zsh/dot_zshenv +0 -5
  320. package/dot_config/zsh/dot_zshrc.tmpl +0 -688
  321. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  322. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  323. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  324. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  325. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  326. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  327. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  328. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  329. package/dot_local/bin/executable_ai-update +0 -195
  330. package/dot_local/bin/executable_ai_core +0 -152
  331. package/dot_local/bin/executable_antigravity +0 -11
  332. package/dot_local/bin/executable_b64 +0 -84
  333. package/dot_local/bin/executable_bm +0 -79
  334. package/dot_local/bin/executable_cb +0 -39
  335. package/dot_local/bin/executable_dot +0 -636
  336. package/dot_local/bin/executable_dot-ai +0 -36
  337. package/dot_local/bin/executable_dot-bootstrap +0 -76
  338. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  339. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  340. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  341. package/dot_local/bin/executable_dot-theme-sync +0 -952
  342. package/dot_local/bin/executable_dot_completion +0 -57
  343. package/dot_local/bin/executable_dtags +0 -28
  344. package/dot_local/bin/executable_epoch +0 -67
  345. package/dot_local/bin/executable_extract +0 -41
  346. package/dot_local/bin/executable_gbd +0 -52
  347. package/dot_local/bin/executable_gd +0 -42
  348. package/dot_local/bin/executable_git-ai-commit +0 -175
  349. package/dot_local/bin/executable_git-ai-diff +0 -169
  350. package/dot_local/bin/executable_gl +0 -101
  351. package/dot_local/bin/executable_hash +0 -161
  352. package/dot_local/bin/executable_hashsum +0 -160
  353. package/dot_local/bin/executable_hex +0 -115
  354. package/dot_local/bin/executable_jsonv +0 -78
  355. package/dot_local/bin/executable_jwt +0 -94
  356. package/dot_local/bin/executable_kill-port +0 -75
  357. package/dot_local/bin/executable_lorem +0 -118
  358. package/dot_local/bin/executable_mkscript +0 -35
  359. package/dot_local/bin/executable_monitor +0 -56
  360. package/dot_local/bin/executable_myip +0 -51
  361. package/dot_local/bin/executable_notify +0 -24
  362. package/dot_local/bin/executable_open +0 -38
  363. package/dot_local/bin/executable_pw +0 -27
  364. package/dot_local/bin/executable_rec-start +0 -46
  365. package/dot_local/bin/executable_rec-stop +0 -35
  366. package/dot_local/bin/executable_regex +0 -132
  367. package/dot_local/bin/executable_start-niri +0 -8
  368. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  369. package/dot_local/bin/executable_tour +0 -177
  370. package/dot_local/bin/executable_up +0 -23
  371. package/dot_local/bin/executable_update +0 -142
  372. package/dot_local/bin/executable_uuid +0 -87
  373. package/dot_local/bin/executable_win +0 -32
  374. package/dot_local/bin/executable_yamlv +0 -57
  375. package/dot_local/share/bash-completion/completions/dot +0 -72
  376. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  377. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  378. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  379. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  380. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  381. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  382. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  383. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  384. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  385. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  386. package/dot_local/share/man/man1/dot.1 +0 -149
  387. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  388. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  389. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  390. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  391. package/dot_local/share/zsh/completions/.keep +0 -0
  392. package/dot_local/share/zsh/completions/_dot +0 -287
  393. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  394. package/scripts/ci/check-deps-dev.sh +0 -236
  395. package/scripts/ci/check-insecure-tls.sh +0 -61
  396. package/scripts/ci/check-regression-traceability.sh +0 -67
  397. package/scripts/ci/dot-cli-startup-bench.sh +0 -126
  398. package/scripts/ci/install-chezmoi-verified.sh +0 -67
  399. package/scripts/ci/lint-reusable-pins.sh +0 -78
  400. package/scripts/ci/run-coverage.sh +0 -451
  401. package/scripts/ci/validate-chezmoidata.sh +0 -25
  402. package/scripts/ci/validate-ci-config.sh +0 -224
  403. package/scripts/ci/windows-smoke-test.ps1 +0 -136
  404. package/scripts/docs/build-manual.sh +0 -883
  405. package/scripts/docs/check-manual.sh +0 -213
  406. package/scripts/dot/lib/bento.sh +0 -50
  407. package/scripts/dot/lib/log.sh +0 -200
  408. package/scripts/dot/lib/platform.sh +0 -112
  409. package/scripts/dot/lib/ui.sh +0 -650
  410. package/scripts/dot/lib/utils.sh +0 -377
  411. package/scripts/maintenance/check-updates.sh +0 -131
  412. package/scripts/release/package-policy-bundles.sh +0 -125
@@ -1,883 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
- # build-manual.sh — Generate dotfiles documentation in 9 formats.
4
- #
5
- # Produces from docs/manual/ Markdown sources:
6
- # HTML (single page) with search, skip-links, ARIA
7
- # HTML (multi-page tree) with edit-this-page + last-modified
8
- # HTML gzipped (single)
9
- # HTML gzipped (tar.gz, multi-page)
10
- # EPUB 3
11
- # PDF (if xelatex available) with cover page and metadata
12
- # ASCII text
13
- # ASCII gzipped
14
- # Markdown source (tar.gz)
15
- # SHA256SUMS
16
- # Landing page with FAQ JSON-LD, Open Graph, search
17
- # search-index.json client-side search index
18
- #
19
- # Usage:
20
- # bash scripts/docs/build-manual.sh # full build
21
- # bash scripts/docs/build-manual.sh --fast # skip PDF
22
- # bash scripts/docs/build-manual.sh --clean # remove _build/manual first
23
- set -euo pipefail
24
-
25
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
26
- SOURCE_DIR="$REPO_ROOT/docs/manual"
27
- BUILD_DIR="$REPO_ROOT/_build/manual"
28
- HTML_DIR="$BUILD_DIR/html"
29
- VERSION="$(awk -F'"' '/^dotfiles_version/ {print $2; exit}' "$REPO_ROOT/.chezmoidata.toml")"
30
- TITLE=".dotfiles Manual"
31
- SUBTITLE="A Trusted Agent Workstation for macOS, Linux, and WSL"
32
- REPO_URL="https://github.com/sebastienrousseau/dotfiles"
33
- MANUAL_URL="https://sebastienrousseau.github.io/dotfiles/manual"
34
- BUILD_DATE="$(date +%Y-%m-%d)"
35
-
36
- FAST=false
37
- CLEAN=false
38
- for arg in "$@"; do
39
- case "$arg" in
40
- --fast) FAST=true ;;
41
- --clean) CLEAN=true ;;
42
- --help | -h)
43
- grep '^#' "$0" | sed 's/^# //; s/^#//'
44
- exit 0
45
- ;;
46
- esac
47
- done
48
-
49
- # -----------------------------------------------------------------------------
50
- # Utilities
51
- # -----------------------------------------------------------------------------
52
-
53
- log() { printf '[manual] %s\n' "$*"; }
54
- warn() { printf '[manual] WARN: %s\n' "$*" >&2; }
55
- die() {
56
- printf '[manual] ERROR: %s\n' "$*" >&2
57
- exit 1
58
- }
59
-
60
- have() { command -v "$1" >/dev/null 2>&1; }
61
-
62
- human_size() {
63
- local bytes="$1"
64
- if [[ $bytes -lt 1024 ]]; then
65
- echo "${bytes}B"
66
- elif [[ $bytes -lt 1048576 ]]; then
67
- echo "$((bytes / 1024))K"
68
- else
69
- echo "$((bytes / 1048576))M"
70
- fi
71
- }
72
-
73
- file_size() {
74
- [[ -f "$1" ]] || return 1
75
- stat -f%z "$1" 2>/dev/null || stat -c%s "$1" 2>/dev/null
76
- }
77
-
78
- # -----------------------------------------------------------------------------
79
- # Prerequisites
80
- # -----------------------------------------------------------------------------
81
-
82
- have pandoc || die "pandoc is required. Install via: brew install pandoc (or apt/dnf)"
83
- have gzip || die "gzip is required"
84
- have tar || die "tar is required"
85
-
86
- PDF_SUPPORT=false
87
- if have xelatex || have tectonic; then
88
- PDF_SUPPORT=true
89
- fi
90
-
91
- # -----------------------------------------------------------------------------
92
- # Clean
93
- # -----------------------------------------------------------------------------
94
-
95
- if $CLEAN; then
96
- log "cleaning $BUILD_DIR"
97
- rm -rf "$BUILD_DIR"
98
- fi
99
- mkdir -p "$BUILD_DIR" "$HTML_DIR"
100
-
101
- # -----------------------------------------------------------------------------
102
- # File discovery
103
- # -----------------------------------------------------------------------------
104
-
105
- collect_files() {
106
- local files=()
107
- [[ -f "$SOURCE_DIR/00-introduction.md" ]] && files+=("$SOURCE_DIR/00-introduction.md")
108
- for dir in 01-concepts 02-tutorials 03-reference 04-cookbook 05-appendices; do
109
- if [[ -d "$SOURCE_DIR/$dir" ]]; then
110
- while IFS= read -r f; do files+=("$f"); done < <(find "$SOURCE_DIR/$dir" -maxdepth 1 -name '*.md' -type f | sort)
111
- fi
112
- done
113
- [[ -f "$SOURCE_DIR/concept-index.md" ]] && files+=("$SOURCE_DIR/concept-index.md")
114
- [[ -f "$SOURCE_DIR/command-index.md" ]] && files+=("$SOURCE_DIR/command-index.md")
115
- printf '%s\n' "${files[@]}"
116
- }
117
-
118
- FILES_LIST="$(collect_files)"
119
- TOTAL_FILES=$(echo "$FILES_LIST" | wc -l | tr -d ' ')
120
- log "found $TOTAL_FILES manual files"
121
-
122
- # -----------------------------------------------------------------------------
123
- # Auto-generate concept + command indexes
124
- # -----------------------------------------------------------------------------
125
-
126
- build_indexes() {
127
- log "generating concept-index"
128
- {
129
- echo "# Concept Index"
130
- echo ""
131
- echo "Alphabetical list of concepts covered in the manual."
132
- echo ""
133
- grep -rhE '^## [A-Z]' "$SOURCE_DIR"/{01-concepts,02-tutorials,03-reference,04-cookbook,05-appendices}/*.md 2>/dev/null |
134
- sed 's/^## //' |
135
- sort -u |
136
- awk '{ print "- " $0 }'
137
- } >"$SOURCE_DIR/concept-index.md.gen"
138
- mv "$SOURCE_DIR/concept-index.md.gen" "$SOURCE_DIR/concept-index.md"
139
-
140
- log "generating command-index"
141
- {
142
- echo "# Command Index"
143
- echo ""
144
- echo "Alphabetical list of \`dot\` subcommands referenced in the manual."
145
- echo ""
146
- # shellcheck disable=SC2016 # literal grep pattern; single quotes intentional
147
- grep -rhoE '`dot [a-z][a-z-]+( [a-z-]+)?`' "$SOURCE_DIR"/*.md "$SOURCE_DIR"/*/*.md 2>/dev/null |
148
- sort -u |
149
- awk '{ print "- " $0 }'
150
- } >"$SOURCE_DIR/command-index.md.gen"
151
- mv "$SOURCE_DIR/command-index.md.gen" "$SOURCE_DIR/command-index.md"
152
- }
153
-
154
- build_indexes
155
-
156
- # -----------------------------------------------------------------------------
157
- # Assemble master Markdown
158
- # -----------------------------------------------------------------------------
159
-
160
- MASTER_MD="$BUILD_DIR/_master.md"
161
- {
162
- echo "---"
163
- echo "title: $TITLE"
164
- echo "subtitle: $SUBTITLE"
165
- echo "version: $VERSION"
166
- echo "date: $BUILD_DATE"
167
- echo "lang: en"
168
- echo "author: Sebastien Rousseau"
169
- echo "publisher: EUXIS"
170
- echo "rights: MIT License"
171
- echo "---"
172
- echo ""
173
- echo "$FILES_LIST" | while IFS= read -r f; do
174
- [[ -f "$f" ]] || continue
175
- sed -E '
176
- s|\[([^]]+)\]\(\.\./?([0-9]+-[a-z]+/[0-9A-Z]+-[a-z-]+)\.md(#[a-z0-9-]+)?\)|[\1](\3)|g
177
- s|\[([^]]+)\]\(([0-9A-Z]+-[a-z-]+)\.md(#[a-z0-9-]+)?\)|[\1](\3)|g
178
- ' "$f"
179
- echo ""
180
- echo ""
181
- done
182
- } >"$MASTER_MD"
183
-
184
- MASTER_SIZE=$(wc -c <"$MASTER_MD")
185
- log "master markdown: $(human_size "$MASTER_SIZE")"
186
-
187
- # -----------------------------------------------------------------------------
188
- # Enhanced CSS with accessibility + search
189
- # -----------------------------------------------------------------------------
190
-
191
- write_css() {
192
- cat >"$BUILD_DIR/style.css" <<'CSSEOF'
193
- :root {
194
- --fg: #1c1c1e;
195
- --bg: #fff;
196
- --accent: #2d538e;
197
- --accent-text: #fff;
198
- --border: #e5e5ea;
199
- --code-bg: #f5f5f7;
200
- --muted: #6d6d72;
201
- --focus-ring: #0066cc;
202
- }
203
- @media (prefers-color-scheme: dark) {
204
- :root {
205
- --fg: #f2f2f7;
206
- --bg: #111;
207
- --accent: #64a0e4;
208
- --accent-text: #111;
209
- --border: #2c2c2e;
210
- --code-bg: #1c1c1e;
211
- --muted: #9b9ba0;
212
- --focus-ring: #5ac8fa;
213
- }
214
- }
215
-
216
- /* Skip link for keyboard users */
217
- .skip-link {
218
- position: absolute;
219
- left: -9999px;
220
- top: 0;
221
- background: var(--accent);
222
- color: var(--accent-text);
223
- padding: 0.5rem 1rem;
224
- z-index: 1000;
225
- text-decoration: none;
226
- }
227
- .skip-link:focus { left: 0; }
228
-
229
- *:focus-visible {
230
- outline: 2px solid var(--focus-ring);
231
- outline-offset: 2px;
232
- border-radius: 2px;
233
- }
234
-
235
- body {
236
- font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
237
- max-width: 820px;
238
- margin: 2rem auto;
239
- padding: 0 1rem;
240
- color: var(--fg);
241
- background: var(--bg);
242
- line-height: 1.6;
243
- }
244
-
245
- h1, h2, h3 { color: var(--accent); margin-top: 2rem; line-height: 1.3; }
246
- h1 { border-bottom: 2px solid var(--accent); padding-bottom: 0.3rem; }
247
- h2 { margin-top: 2.5rem; }
248
-
249
- code {
250
- background: var(--code-bg);
251
- padding: 0.1rem 0.3rem;
252
- border-radius: 3px;
253
- font-family: "JetBrains Mono", "SF Mono", Menlo, monospace;
254
- font-size: 0.9em;
255
- }
256
- pre {
257
- background: var(--code-bg);
258
- padding: 1rem;
259
- border-radius: 6px;
260
- overflow-x: auto;
261
- border: 1px solid var(--border);
262
- }
263
- pre code { background: transparent; padding: 0; }
264
-
265
- table { border-collapse: collapse; margin: 1rem 0; width: 100%; }
266
- th, td { border: 1px solid var(--border); padding: 0.4rem 0.8rem; text-align: left; }
267
- th { background: var(--code-bg); font-weight: 600; }
268
-
269
- a { color: var(--accent); }
270
- a:hover { text-decoration: underline; }
271
-
272
- nav ol, nav ul { padding-left: 1.2rem; }
273
- blockquote {
274
- border-left: 3px solid var(--accent);
275
- padding-left: 1rem;
276
- color: var(--muted);
277
- margin: 1rem 0;
278
- }
279
-
280
- /* Search box */
281
- .search-widget {
282
- margin: 1rem 0 2rem;
283
- padding: 0.8rem 1rem;
284
- background: var(--code-bg);
285
- border: 1px solid var(--border);
286
- border-radius: 6px;
287
- }
288
- .search-widget input {
289
- width: 100%;
290
- padding: 0.5rem 0.8rem;
291
- font-size: 1rem;
292
- border: 1px solid var(--border);
293
- border-radius: 4px;
294
- background: var(--bg);
295
- color: var(--fg);
296
- font-family: inherit;
297
- }
298
- .search-results {
299
- margin-top: 0.8rem;
300
- max-height: 300px;
301
- overflow-y: auto;
302
- }
303
- .search-results li {
304
- list-style: none;
305
- padding: 0.4rem 0;
306
- border-bottom: 1px solid var(--border);
307
- }
308
- .search-results li:last-child { border-bottom: none; }
309
- .search-results a { text-decoration: none; display: block; }
310
- .search-results .hit-section { font-size: 0.85em; color: var(--muted); }
311
-
312
- /* Page footer / edit link */
313
- .page-footer {
314
- margin-top: 3rem;
315
- padding-top: 1rem;
316
- border-top: 1px solid var(--border);
317
- font-size: 0.9em;
318
- color: var(--muted);
319
- }
320
- .page-footer a { color: var(--muted); }
321
-
322
- /* Formats list on landing */
323
- .formats { margin: 2rem 0; }
324
- .formats li { margin: 0.4rem 0; }
325
- .size { color: var(--muted); font-size: 0.9em; }
326
-
327
- /* Version badge */
328
- .version-badge {
329
- display: inline-block;
330
- background: var(--accent);
331
- color: var(--accent-text);
332
- padding: 0.15rem 0.6rem;
333
- border-radius: 12px;
334
- font-size: 0.8em;
335
- font-weight: 600;
336
- margin-left: 0.5rem;
337
- }
338
- CSSEOF
339
- }
340
-
341
- # -----------------------------------------------------------------------------
342
- # Client-side search index + script
343
- # -----------------------------------------------------------------------------
344
-
345
- build_search_index() {
346
- log "building search index"
347
- local idx="$BUILD_DIR/search-index.json"
348
-
349
- # Extract headings + surrounding text from each manual file
350
- python3 - <<PYEOF >"$idx"
351
- import json, os, re
352
- SOURCE_DIR = "$SOURCE_DIR"
353
- REPO_ROOT = "$REPO_ROOT"
354
- entries = []
355
- files = []
356
- for dirpath, _, filenames in os.walk(SOURCE_DIR):
357
- for f in filenames:
358
- if f.endswith('.md'):
359
- files.append(os.path.join(dirpath, f))
360
- files.sort()
361
-
362
- for path in files:
363
- rel = os.path.relpath(path, SOURCE_DIR)
364
- html_path = rel.replace('.md', '.html')
365
- with open(path) as fh:
366
- lines = fh.readlines()
367
- title = ''
368
- for line in lines:
369
- if line.startswith('# '):
370
- title = line[2:].strip()
371
- break
372
- current_section = title
373
- buf = []
374
- for line in lines:
375
- if line.startswith('## '):
376
- if buf:
377
- entries.append({
378
- 'file': html_path,
379
- 'title': title,
380
- 'section': current_section,
381
- 'text': ' '.join(buf)[:500],
382
- })
383
- current_section = line[3:].strip()
384
- buf = []
385
- elif line.startswith('### '):
386
- if buf:
387
- entries.append({
388
- 'file': html_path,
389
- 'title': title,
390
- 'section': current_section,
391
- 'text': ' '.join(buf)[:500],
392
- })
393
- current_section = line[4:].strip()
394
- buf = []
395
- elif line.strip() and not line.startswith('#'):
396
- buf.append(line.strip())
397
- if buf:
398
- entries.append({
399
- 'file': html_path,
400
- 'title': title,
401
- 'section': current_section,
402
- 'text': ' '.join(buf)[:500],
403
- })
404
-
405
- print(json.dumps(entries))
406
- PYEOF
407
-
408
- local sz
409
- sz=$(file_size "$idx")
410
- log " → search-index.json ($(human_size "$sz"), $(python3 -c "import json; print(len(json.load(open('$idx'))))") entries)"
411
-
412
- # Search widget JS
413
- cat >"$BUILD_DIR/search.js" <<'JSEOF'
414
- (function() {
415
- const input = document.getElementById('manual-search');
416
- const results = document.getElementById('manual-search-results');
417
- if (!input || !results) return;
418
-
419
- let index = [];
420
- fetch('search-index.json').then(r => r.json()).then(data => { index = data; });
421
-
422
- let debounce;
423
- input.addEventListener('input', () => {
424
- clearTimeout(debounce);
425
- debounce = setTimeout(() => {
426
- const q = input.value.trim().toLowerCase();
427
- if (q.length < 2) { results.innerHTML = ''; return; }
428
- const terms = q.split(/\s+/);
429
- const hits = index.filter(e => {
430
- const haystack = (e.title + ' ' + e.section + ' ' + e.text).toLowerCase();
431
- return terms.every(t => haystack.includes(t));
432
- }).slice(0, 10);
433
- results.innerHTML = hits.length
434
- ? '<ul class="search-results">' + hits.map(h =>
435
- `<li><a href="${h.file}"><strong>${h.title}</strong> <span class="hit-section">— ${h.section}</span></a></li>`
436
- ).join('') + '</ul>'
437
- : '<p class="search-results">No results.</p>';
438
- }, 150);
439
- });
440
- })();
441
- JSEOF
442
- log " → search.js"
443
- }
444
-
445
- # -----------------------------------------------------------------------------
446
- # HTML single page
447
- # -----------------------------------------------------------------------------
448
-
449
- build_html_single() {
450
- local out="$BUILD_DIR/dotfiles.html"
451
- log "building HTML single page"
452
- write_css
453
- pandoc "$MASTER_MD" \
454
- -f markdown \
455
- -t html5 \
456
- --standalone \
457
- --toc \
458
- --toc-depth=3 \
459
- --section-divs \
460
- --metadata lang=en \
461
- --metadata title="$TITLE" \
462
- --metadata subtitle="$SUBTITLE — v$VERSION" \
463
- --css=style.css \
464
- -o "$out"
465
-
466
- # Inject skip link + ARIA landmarks
467
- sed -i.bak '
468
- s|<body>|<body>\n<a href="#main" class="skip-link">Skip to main content</a>\n<main id="main" role="main">|
469
- s|</body>|</main>\n</body>|
470
- ' "$out" && rm -f "$out.bak"
471
-
472
- local sz
473
- sz=$(file_size "$out")
474
- log " → dotfiles.html ($(human_size "$sz"))"
475
- }
476
-
477
- # -----------------------------------------------------------------------------
478
- # HTML multi-page (one HTML per source file) with edit links + last-modified
479
- # -----------------------------------------------------------------------------
480
-
481
- build_html_multi() {
482
- log "building HTML multi-page"
483
- write_css
484
- echo "$FILES_LIST" | while IFS= read -r f; do
485
- local rel_src="${f#$SOURCE_DIR/}"
486
- local basename
487
- basename="$(basename "$f" .md)"
488
- local outpath="$HTML_DIR/${rel_src%.md}.html"
489
- mkdir -p "$(dirname "$outpath")"
490
-
491
- # Compute edit URL + last-modified date
492
- local edit_url="$REPO_URL/edit/master/docs/manual/$rel_src"
493
- local last_modified
494
- last_modified="$(cd "$REPO_ROOT" && git log -1 --format='%ai' -- "docs/manual/$rel_src" 2>/dev/null | cut -d' ' -f1)"
495
- [[ -z "$last_modified" ]] && last_modified="$BUILD_DATE"
496
-
497
- # Footer with edit link + last-modified
498
- local footer
499
- footer=$(
500
- cat <<FOOT
501
- <div class="page-footer">
502
- <p>Last updated: $last_modified · <a href="$edit_url">Edit this page on GitHub</a></p>
503
- <p><a href="../index.html">← Manual home</a></p>
504
- </div>
505
- FOOT
506
- )
507
-
508
- pandoc "$f" \
509
- -f markdown \
510
- -t html5 \
511
- --standalone \
512
- --toc \
513
- --toc-depth=3 \
514
- --metadata lang=en \
515
- --metadata title="$basename" \
516
- --css=../style.css \
517
- --include-after-body=<(echo "$footer") \
518
- -o "$outpath"
519
-
520
- # Inject skip link + ARIA
521
- sed -i.bak '
522
- s|<body>|<body>\n<a href="#main" class="skip-link">Skip to main content</a>\n<main id="main" role="main">|
523
- s|</body>|</main>\n</body>|
524
- ' "$outpath" && rm -f "$outpath.bak"
525
- done
526
-
527
- cp "$BUILD_DIR/style.css" "$HTML_DIR/style.css"
528
-
529
- # Multi-page index with search
530
- {
531
- echo '<!DOCTYPE html>'
532
- echo '<html lang="en">'
533
- echo '<head><meta charset="UTF-8">'
534
- echo '<meta name="viewport" content="width=device-width, initial-scale=1">'
535
- echo "<title>$TITLE — v$VERSION</title>"
536
- echo '<link rel="stylesheet" href="style.css">'
537
- echo '</head>'
538
- echo '<body>'
539
- echo '<a href="#main" class="skip-link">Skip to main content</a>'
540
- echo '<main id="main" role="main">'
541
- echo "<h1>$TITLE <span class=\"version-badge\">v$VERSION</span></h1>"
542
- echo "<p><em>$SUBTITLE</em></p>"
543
- echo '<div class="search-widget" role="search">'
544
- echo ' <label for="manual-search" style="font-weight: 600;">Search the manual</label>'
545
- echo ' <input type="search" id="manual-search" placeholder="Type at least 2 characters..." aria-label="Search the manual" autocomplete="off">'
546
- echo ' <div id="manual-search-results" aria-live="polite"></div>'
547
- echo '</div>'
548
- echo '<nav aria-label="Manual table of contents"><ul>'
549
- echo "$FILES_LIST" | while IFS= read -r f; do
550
- local rel_src="${f#$SOURCE_DIR/}"
551
- local html_link="${rel_src%.md}.html"
552
- local basename
553
- basename="$(basename "$f" .md)"
554
- local title
555
- title="$(head -1 "$f" | sed 's/^#\+ *//')"
556
- printf ' <li><a href="%s">%s</a></li>\n' "$html_link" "${title:-$basename}"
557
- done
558
- echo '</ul></nav>'
559
- echo '</main>'
560
- echo '<script src="../search.js" defer></script>'
561
- echo '</body></html>'
562
- } >"$HTML_DIR/index.html"
563
-
564
- local count
565
- count=$(find "$HTML_DIR" -name '*.html' | wc -l | tr -d ' ')
566
- log " → html/index.html + $count pages"
567
- }
568
-
569
- # -----------------------------------------------------------------------------
570
- # EPUB
571
- # -----------------------------------------------------------------------------
572
-
573
- build_epub() {
574
- local out="$BUILD_DIR/dotfiles.epub"
575
- log "building EPUB"
576
- pandoc "$MASTER_MD" \
577
- -f markdown \
578
- -t epub3 \
579
- --metadata title="$TITLE" \
580
- --metadata author="Sebastien Rousseau" \
581
- --metadata date="$BUILD_DATE" \
582
- --metadata publisher="EUXIS" \
583
- --metadata rights="MIT License" \
584
- --metadata lang="en" \
585
- --toc \
586
- --toc-depth=3 \
587
- -o "$out"
588
- local sz
589
- sz=$(file_size "$out")
590
- log " → dotfiles.epub ($(human_size "$sz"))"
591
- }
592
-
593
- # -----------------------------------------------------------------------------
594
- # PDF with cover page
595
- # -----------------------------------------------------------------------------
596
-
597
- build_pdf() {
598
- if ! $PDF_SUPPORT; then
599
- warn "skipping PDF (xelatex/tectonic not available)"
600
- return
601
- fi
602
- if $FAST; then
603
- warn "skipping PDF (--fast mode)"
604
- return
605
- fi
606
- local out="$BUILD_DIR/dotfiles.pdf"
607
- log "building PDF with cover"
608
- local engine="xelatex"
609
- have tectonic && engine="tectonic"
610
-
611
- pandoc "$MASTER_MD" \
612
- -f markdown \
613
- -t pdf \
614
- --pdf-engine="$engine" \
615
- --toc \
616
- --toc-depth=3 \
617
- --variable geometry:margin=1in \
618
- --variable fontsize=10pt \
619
- --variable colorlinks=true \
620
- --variable linkcolor=blue \
621
- --variable documentclass=report \
622
- --variable title-meta="$TITLE" \
623
- --variable author-meta="Sebastien Rousseau" \
624
- --variable subject-meta="$SUBTITLE" \
625
- --variable keywords="dotfiles,chezmoi,macOS,Linux,WSL,AI,MCP" \
626
- --metadata title="$TITLE" \
627
- --metadata subtitle="$SUBTITLE" \
628
- --metadata author="Sebastien Rousseau" \
629
- --metadata date="$BUILD_DATE — v$VERSION" \
630
- --metadata lang="en" \
631
- -o "$out" 2>/dev/null || warn "PDF build failed — continuing"
632
- [[ -f "$out" ]] && log " → dotfiles.pdf ($(human_size "$(file_size "$out")"))"
633
- }
634
-
635
- # -----------------------------------------------------------------------------
636
- # ASCII text
637
- # -----------------------------------------------------------------------------
638
-
639
- build_text() {
640
- local out="$BUILD_DIR/dotfiles.txt"
641
- log "building ASCII text"
642
- pandoc "$MASTER_MD" \
643
- -f markdown \
644
- -t plain \
645
- --toc \
646
- --toc-depth=3 \
647
- -o "$out"
648
- local sz
649
- sz=$(file_size "$out")
650
- log " → dotfiles.txt ($(human_size "$sz"))"
651
- }
652
-
653
- # -----------------------------------------------------------------------------
654
- # Compressed archives
655
- # -----------------------------------------------------------------------------
656
-
657
- build_archives() {
658
- log "compressing archives"
659
-
660
- if [[ -f "$BUILD_DIR/dotfiles.html" ]]; then
661
- gzip -c "$BUILD_DIR/dotfiles.html" >"$BUILD_DIR/dotfiles.html.gz"
662
- log " → dotfiles.html.gz ($(human_size "$(file_size "$BUILD_DIR/dotfiles.html.gz")"))"
663
- fi
664
-
665
- if [[ -d "$HTML_DIR" ]]; then
666
- tar -czf "$BUILD_DIR/html.tar.gz" -C "$BUILD_DIR" html
667
- log " → html.tar.gz ($(human_size "$(file_size "$BUILD_DIR/html.tar.gz")"))"
668
- fi
669
-
670
- if [[ -f "$BUILD_DIR/dotfiles.txt" ]]; then
671
- gzip -c "$BUILD_DIR/dotfiles.txt" >"$BUILD_DIR/dotfiles.txt.gz"
672
- log " → dotfiles.txt.gz ($(human_size "$(file_size "$BUILD_DIR/dotfiles.txt.gz")"))"
673
- fi
674
-
675
- tar -czf "$BUILD_DIR/dotfiles-md.tar.gz" -C "$REPO_ROOT/docs" manual
676
- log " → dotfiles-md.tar.gz ($(human_size "$(file_size "$BUILD_DIR/dotfiles-md.tar.gz")"))"
677
- }
678
-
679
- # -----------------------------------------------------------------------------
680
- # SHA256SUMS
681
- # -----------------------------------------------------------------------------
682
-
683
- build_checksums() {
684
- log "computing SHA256SUMS"
685
- (cd "$BUILD_DIR" && (sha256sum dotfiles.* html.tar.gz search-index.json 2>/dev/null ||
686
- shasum -a 256 dotfiles.* html.tar.gz search-index.json 2>/dev/null) >SHA256SUMS)
687
- log " → SHA256SUMS"
688
- }
689
-
690
- # -----------------------------------------------------------------------------
691
- # Landing page — Stow-style with FAQ JSON-LD + Open Graph + search
692
- # -----------------------------------------------------------------------------
693
-
694
- build_landing() {
695
- log "building landing page"
696
- local out="$BUILD_DIR/index.html"
697
-
698
- local html_size="" html_gz_size="" html_tar_size=""
699
- local epub_size="" pdf_size="" txt_size="" txt_gz_size="" md_size=""
700
-
701
- [[ -f "$BUILD_DIR/dotfiles.html" ]] && html_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.html")")"
702
- [[ -f "$BUILD_DIR/dotfiles.html.gz" ]] && html_gz_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.html.gz")")"
703
- [[ -f "$BUILD_DIR/html.tar.gz" ]] && html_tar_size="$(human_size "$(file_size "$BUILD_DIR/html.tar.gz")")"
704
- [[ -f "$BUILD_DIR/dotfiles.epub" ]] && epub_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.epub")")"
705
- [[ -f "$BUILD_DIR/dotfiles.pdf" ]] && pdf_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.pdf")")"
706
- [[ -f "$BUILD_DIR/dotfiles.txt" ]] && txt_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.txt")")"
707
- [[ -f "$BUILD_DIR/dotfiles.txt.gz" ]] && txt_gz_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles.txt.gz")")"
708
- [[ -f "$BUILD_DIR/dotfiles-md.tar.gz" ]] && md_size="$(human_size "$(file_size "$BUILD_DIR/dotfiles-md.tar.gz")")"
709
-
710
- cat >"$out" <<HTML
711
- <!DOCTYPE html>
712
- <html lang="en">
713
- <head>
714
- <meta charset="UTF-8">
715
- <meta name="viewport" content="width=device-width, initial-scale=1">
716
- <title>The .dotfiles Manual — v$VERSION</title>
717
- <meta name="description" content="Declarative dotfiles for macOS, Linux, and WSL. Multi-shell by default, with sub-second startup, wallpaper-driven themes, and signed releases.">
718
- <meta name="author" content="Sebastien Rousseau">
719
- <meta name="keywords" content="dotfiles, chezmoi, workstation, multi-shell, fish, zsh, nushell, macOS, Linux, WSL, themes, secrets, attestation">
720
-
721
- <!-- Open Graph -->
722
- <meta property="og:type" content="website">
723
- <meta property="og:title" content="The .dotfiles Manual — v$VERSION">
724
- <meta property="og:description" content="Declarative dotfiles for macOS, Linux, and WSL. Multi-shell by default, with sub-second startup, wallpaper-driven themes, and signed releases.">
725
- <meta property="og:url" content="$MANUAL_URL/">
726
- <meta property="og:site_name" content=".dotfiles">
727
- <meta property="og:locale" content="en_US">
728
-
729
- <!-- Twitter Card -->
730
- <meta name="twitter:card" content="summary_large_image">
731
- <meta name="twitter:title" content="The .dotfiles Manual — v$VERSION">
732
- <meta name="twitter:description" content="Declarative dotfiles for macOS, Linux, and WSL. Multi-shell by default, with sub-second startup, wallpaper-driven themes, and signed releases.">
733
-
734
- <link rel="canonical" href="$MANUAL_URL/">
735
- <link rel="stylesheet" href="style.css">
736
-
737
- <!-- FAQ JSON-LD for SGE / Perplexity / Gemini capture -->
738
- <script type="application/ld+json">
739
- {
740
- "@context": "https://schema.org",
741
- "@type": "TechArticle",
742
- "headline": "The .dotfiles Manual",
743
- "description": "Declarative dotfiles for macOS, Linux, and WSL — multi-shell, fast-startup, signed",
744
- "author": {"@type": "Person", "name": "Sebastien Rousseau", "url": "https://sebastienrousseau.com"},
745
- "datePublished": "$BUILD_DATE",
746
- "dateModified": "$BUILD_DATE",
747
- "version": "$VERSION",
748
- "license": "https://opensource.org/licenses/MIT",
749
- "codeRepository": "$REPO_URL",
750
- "programmingLanguage": "Shell"
751
- }
752
- </script>
753
- <script type="application/ld+json">
754
- {
755
- "@context": "https://schema.org",
756
- "@type": "FAQPage",
757
- "mainEntity": [
758
- {
759
- "@type": "Question",
760
- "name": "What is .dotfiles?",
761
- "acceptedAnswer": {"@type": "Answer", "text": "Declarative, chezmoi-managed dotfiles for macOS, Linux, and WSL. Multi-shell by default (fish, zsh, nushell, PowerShell), with sub-second startup, wallpaper-driven themes, encrypted secrets, and signed releases."}
762
- },
763
- {
764
- "@type": "Question",
765
- "name": "How do I install .dotfiles?",
766
- "acceptedAnswer": {"@type": "Answer", "text": "Run: bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh)\" — then verify with 'dot doctor'."}
767
- },
768
- {
769
- "@type": "Question",
770
- "name": "What platforms are supported?",
771
- "acceptedAnswer": {"@type": "Answer", "text": "macOS 14+, Ubuntu/Debian, Arch/CachyOS, Fedora, openSUSE, WSL2. PowerShell 7.5+ for baseline parity on Windows."}
772
- },
773
- {
774
- "@type": "Question",
775
- "name": "How are terminal themes generated?",
776
- "acceptedAnswer": {"@type": "Answer", "text": "K-Means clustering in CIELAB color space extracts dominant colors from wallpaper images and generates WCAG AAA-compliant palettes — no hand-crafted themes."}
777
- },
778
- {
779
- "@type": "Question",
780
- "name": "How do I switch themes?",
781
- "acceptedAnswer": {"@type": "Answer", "text": "Run 'dot theme' for an interactive picker, 'dot theme <name>' to switch directly, or 'dot theme toggle' to swap dark/light."}
782
- },
783
- {
784
- "@type": "Question",
785
- "name": "How are secrets managed?",
786
- "acceptedAnswer": {"@type": "Answer", "text": "Age encryption for individual files and SOPS for YAML/JSON. Encrypted at rest in the repository, decrypted on 'dot apply' using the local private key."}
787
- }
788
- ]
789
- }
790
- </script>
791
- </head>
792
- <body>
793
- <a href="#main" class="skip-link">Skip to main content</a>
794
- <main id="main" role="main">
795
- <header>
796
- <h1>The .dotfiles Manual <span class="version-badge">v$VERSION</span></h1>
797
- <p><em>$SUBTITLE</em></p>
798
- </header>
799
-
800
- <div class="search-widget" role="search">
801
- <label for="manual-search" style="font-weight: 600;">Search the manual</label>
802
- <input type="search" id="manual-search" placeholder="Type at least 2 characters..." aria-label="Search the manual" autocomplete="off">
803
- <div id="manual-search-results" aria-live="polite"></div>
804
- </div>
805
-
806
- <h2>Available formats</h2>
807
- <p>This manual is published from a single Markdown source in the following formats:</p>
808
- <ul class="formats">
809
- <li><a href="html/index.html">HTML</a> — one page per chapter, with search</li>
810
- <li><a href="dotfiles.html">HTML single page</a> <span class="size">($html_size)</span></li>
811
- <li><a href="html.tar.gz">HTML compressed</a> <span class="size">($html_tar_size gzipped tar, multi-page)</span></li>
812
- <li><a href="dotfiles.html.gz">HTML compressed</a> <span class="size">($html_gz_size gzipped, single page)</span></li>
813
- <li><a href="dotfiles.epub">EPUB</a> <span class="size">($epub_size)</span></li>
814
- HTML
815
-
816
- if [[ -n "$pdf_size" ]]; then
817
- echo " <li><a href=\"dotfiles.pdf\">PDF</a> <span class=\"size\">($pdf_size, with cover page)</span></li>" >>"$out"
818
- fi
819
-
820
- cat >>"$out" <<HTML
821
- <li><a href="dotfiles.txt">ASCII text</a> <span class="size">($txt_size)</span></li>
822
- <li><a href="dotfiles.txt.gz">ASCII text compressed</a> <span class="size">($txt_gz_size gzipped)</span></li>
823
- <li><a href="dotfiles-md.tar.gz">Markdown source</a> <span class="size">($md_size gzipped tar)</span></li>
824
- </ul>
825
-
826
- <p>Integrity: <a href="SHA256SUMS">SHA256SUMS</a> · Version history: <a href="$REPO_URL/releases">GitHub Releases</a></p>
827
-
828
- <h2>About this manual</h2>
829
- <p><code>.dotfiles</code> is workstation infrastructure: signed, attested, multi-platform, AI-aware, and self-healing.
830
- Install with one command; get terminal themes generated from wallpapers, encrypted secrets, agent policy enforcement,
831
- and cross-host attestation.</p>
832
-
833
- <h2>Quick start</h2>
834
- <pre><code>bash -c "\$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh)"
835
- dot doctor
836
- dot learn</code></pre>
837
-
838
- <h2>Source code</h2>
839
- <p>Repository: <a href="$REPO_URL">sebastienrousseau/dotfiles</a> · License: <a href="$REPO_URL/blob/master/LICENSE">MIT</a></p>
840
-
841
- <div class="page-footer">
842
- <p>Generated $BUILD_DATE from <a href="dotfiles-md.tar.gz">docs/manual/</a> via <code>scripts/docs/build-manual.sh</code>.</p>
843
- <p>Questions? <a href="$REPO_URL/issues">Open an issue</a> or <a href="$REPO_URL/discussions">start a discussion</a>.</p>
844
- </div>
845
- </main>
846
- <script src="search.js" defer></script>
847
- </body>
848
- </html>
849
- HTML
850
-
851
- log " → index.html"
852
- }
853
-
854
- # -----------------------------------------------------------------------------
855
- # Main
856
- # -----------------------------------------------------------------------------
857
-
858
- main() {
859
- log "building .dotfiles manual v$VERSION"
860
- log "source: $SOURCE_DIR"
861
- log "output: $BUILD_DIR"
862
-
863
- build_search_index
864
- build_html_single
865
- build_html_multi
866
- build_epub
867
- build_pdf
868
- build_text
869
- build_archives
870
- build_checksums
871
- build_landing
872
-
873
- rm -f "$MASTER_MD"
874
-
875
- log ""
876
- log "build complete"
877
- log " landing: $BUILD_DIR/index.html"
878
- log " formats: $(ls "$BUILD_DIR" | wc -l | tr -d ' ') files"
879
- log ""
880
- log "open locally: /usr/bin/open $BUILD_DIR/index.html"
881
- }
882
-
883
- main