@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.
- package/CHANGELOG.md +83 -9
- package/LICENSE +21 -1283
- package/README.md +5 -3
- package/docs/CONFIG_STRATEGY.md +124 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/GOVERNANCE.md +98 -0
- package/docs/MAINTAINERS.md +41 -0
- package/docs/OPENCODE.md +127 -0
- package/docs/README.md +2 -0
- package/docs/STRUCTURE.md +102 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
- package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
- package/docs/architecture/REPO_LAYOUT.md +8 -8
- package/docs/archive/MILESTONE_v0.2.493.md +1 -1
- package/docs/index.md +2 -2
- package/docs/interop/POWERSHELL.md +1 -1
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/01-concepts/02-trust-model.md +1 -1
- package/docs/manual/03-reference/02-config-files.md +2 -2
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +72 -59
- package/docs/operations/CI_COMPOSITES.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +5 -5
- package/docs/operations/HARD_AUDIT_2026.md +11 -11
- package/docs/operations/MAINTENANCE.md +3 -3
- package/docs/operations/MANIFEST.md +127 -0
- package/docs/operations/RELEASE_PIPELINE.md +130 -0
- package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
- package/docs/operations/ROADMAP_2026.md +6 -6
- package/docs/operations/ROADMAP_V0_2_503.md +134 -0
- package/docs/operations/TESTING.md +17 -0
- package/docs/operations/TRACEABILITY.md +6 -3
- package/docs/operations/VERSION_SYNC.md +4 -4
- package/docs/reference/POWERSHELL_PARITY.md +8 -7
- package/docs/schema/dot-env-v1.json +110 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
- package/docs/security/CI_PINNING.md +17 -9
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
- package/docs/security/FUZZING.md +114 -0
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/POLICY_RELEASES.md +2 -2
- package/docs/security/SCORECARD.md +58 -3
- package/docs/security/SHELL_EXEMPTIONS.md +4 -4
- package/docs/security/VERIFY_RELEASE.md +201 -0
- package/install.sh +27 -5
- package/package.json +1 -1
- package/scripts/README.md +123 -0
- package/scripts/ci/check-copyright-headers.sh +4 -93
- package/scripts/ci/check-shell-preamble.sh +4 -103
- package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
- package/scripts/diagnostics/a2a-conformance.sh +4 -4
- package/scripts/diagnostics/alias-governance.sh +1 -1
- package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
- package/scripts/diagnostics/benchmark.sh +4 -4
- package/scripts/diagnostics/conflicts.sh +2 -2
- package/scripts/diagnostics/doctor-unified.sh +2 -2
- package/scripts/diagnostics/doctor.sh +10 -10
- package/scripts/diagnostics/drift-dashboard.sh +2 -2
- package/scripts/diagnostics/health.sh +4 -4
- package/scripts/diagnostics/history-analysis.sh +2 -2
- package/scripts/diagnostics/mcp-doctor.sh +10 -7
- package/scripts/diagnostics/perf.sh +4 -4
- package/scripts/diagnostics/scorecard.sh +4 -4
- package/scripts/diagnostics/security-score.sh +2 -2
- package/scripts/diagnostics/smoke-test.sh +2 -2
- package/scripts/diagnostics/snapshot.sh +2 -2
- package/scripts/diagnostics/verify.sh +4 -4
- package/scripts/diagnostics/version-locks.sh +2 -2
- package/scripts/diagnostics/workstation-attestation.sh +14 -14
- package/scripts/dot/commands/agent.sh +8 -0
- package/scripts/dot/commands/agents.sh +14 -4
- package/scripts/dot/commands/ai.sh +144 -25
- package/scripts/dot/commands/appearance.sh +2 -2
- package/scripts/dot/commands/core.sh +2 -2
- package/scripts/dot/commands/diagnostics.sh +5 -5
- package/scripts/dot/commands/env-emit.sh +202 -0
- package/scripts/dot/commands/fleet.sh +12 -11
- package/scripts/dot/commands/init.sh +4 -4
- package/scripts/dot/commands/lint.sh +9 -4
- package/scripts/dot/commands/manual.sh +3 -3
- package/scripts/dot/commands/meta.sh +12 -6
- package/scripts/dot/commands/patterns.sh +2 -2
- package/scripts/dot/commands/registry.sh +4 -4
- package/scripts/dot/commands/restore.sh +4 -4
- package/scripts/dot/commands/secrets.sh +4 -3
- package/scripts/dot/commands/security.sh +2 -2
- package/scripts/dot/commands/tools.sh +13 -3
- package/scripts/dot/powershell/Dot.psm1 +199 -0
- package/scripts/fonts/install-nerd-fonts.sh +2 -2
- package/scripts/git-hooks/pre-commit-audit.sh +2 -2
- package/scripts/git-hooks/pre-push +13 -0
- package/scripts/ops/ai-setup.sh +1 -1
- package/scripts/ops/bundle.sh +2 -2
- package/scripts/ops/chaos.sh +2 -2
- package/scripts/ops/chezmoi-apply.sh +4 -4
- package/scripts/ops/heal.sh +4 -4
- package/scripts/ops/post-apply-repair.sh +2 -2
- package/scripts/ops/prewarm.sh +2 -2
- package/scripts/ops/release.sh +4 -4
- package/scripts/ops/rollback.sh +4 -4
- package/scripts/ops/setup.sh +2 -2
- package/scripts/qa/check-version-consistency.sh +123 -0
- package/scripts/qa/coverage-baseline.sh +1 -1
- package/scripts/qa/docs-coverage.sh +2 -2
- package/scripts/qa/powershell-contract.ps1 +1 -1
- package/scripts/qa/scorecard-snapshot.sh +127 -0
- package/scripts/security/backup.sh +2 -2
- package/scripts/security/dns-doh.sh +4 -4
- package/scripts/security/encryption-check.sh +4 -4
- package/scripts/security/enforce-policies.sh +2 -2
- package/scripts/security/firewall.sh +4 -4
- package/scripts/security/lock-screen.sh +4 -4
- package/scripts/security/manage-secrets.sh +2 -2
- package/scripts/security/ssh-cert.sh +2 -2
- package/scripts/security/telemetry-kill.sh +4 -4
- package/scripts/security/usb-safety.sh +4 -4
- package/scripts/theme/extract-heic-frames.sh +114 -0
- package/scripts/theme/rebuild-themes.sh +8 -1
- package/scripts/theme/switch.sh +13 -6
- package/scripts/theme/wallpaper-sync.sh +297 -93
- package/scripts/tuning/linux.sh +2 -2
- package/scripts/tuning/macos.sh +2 -2
- package/scripts/version-sync.sh +55 -7
- package/dot_config/.module-manifest.json +0 -69
- package/dot_config/ai/identity.md +0 -23
- package/dot_config/ai/patterns/architect.md +0 -16
- package/dot_config/ai/patterns/hardener.md +0 -15
- package/dot_config/ai/patterns/refactor.md +0 -15
- package/dot_config/aider/aider.conf.yml +0 -32
- package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
- package/dot_config/ansible/ansible.cfg +0 -11
- package/dot_config/atuin/config.toml.tmpl +0 -47
- package/dot_config/bat/config +0 -23
- package/dot_config/brave-flags.conf.tmpl +0 -7
- package/dot_config/btop/btop.conf +0 -16
- package/dot_config/btop/themes/tokyonight.theme +0 -34
- package/dot_config/bun/bunfig.toml.tmpl +0 -33
- package/dot_config/claude/mcp_servers.json +0 -20
- package/dot_config/containers/containers.conf +0 -14
- package/dot_config/curl/dot_curlrc +0 -18
- package/dot_config/dlv/config.yml +0 -39
- package/dot_config/docker/config.json +0 -15
- package/dot_config/dotfiles/agent-card.json +0 -29
- package/dot_config/dotfiles/agent-profiles.json +0 -92
- package/dot_config/dotfiles/boot/README.md +0 -13
- package/dot_config/dotfiles/grub/README.md +0 -13
- package/dot_config/dotfiles/lock/README.md +0 -13
- package/dot_config/dotfiles/mcp-lock.json +0 -33
- package/dot_config/dotfiles/mcp-policy.json +0 -52
- package/dot_config/dotfiles/mcp-registry.json +0 -47
- package/dot_config/dotfiles/model-registry.json +0 -20
- package/dot_config/dotfiles/policy-bundles.json +0 -38
- package/dot_config/dotfiles/prompt-registry.json +0 -16
- package/dot_config/dotfiles/versions.env +0 -18
- package/dot_config/duf/duf.conf +0 -6
- package/dot_config/duti/defaults.duti +0 -5
- package/dot_config/emoji/emoji.txt +0 -34
- package/dot_config/environment.d/50-ssh-agent.conf +0 -2
- package/dot_config/environment.d/90-wayland.conf +0 -19
- package/dot_config/fastfetch/config.jsonc +0 -28
- package/dot_config/firefox/user.js.tmpl +0 -58
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
- package/dot_config/fish/completions/dot.fish.tmpl +0 -115
- package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
- package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
- package/dot_config/fish/conf.d/direnv.fish +0 -4
- package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
- package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
- package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
- package/dot_config/fish/conf.d/mise-activate.fish +0 -5
- package/dot_config/fish/config.fish.tmpl +0 -44
- package/dot_config/fish/fish_plugins +0 -1
- package/dot_config/fish/functions/_.fish +0 -3
- package/dot_config/fish/functions/_cached_eval.fish +0 -131
- package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
- package/dot_config/fish/functions/als.fish +0 -46
- package/dot_config/fish/functions/bg-upgrade.fish +0 -7
- package/dot_config/fish/functions/c.fish +0 -3
- package/dot_config/fish/functions/cat.fish +0 -9
- package/dot_config/fish/functions/d.fish +0 -7
- package/dot_config/fish/functions/dot.fish +0 -34
- package/dot_config/fish/functions/h.fish +0 -3
- package/dot_config/fish/functions/l.fish +0 -7
- package/dot_config/fish/functions/la.fish +0 -7
- package/dot_config/fish/functions/ll.fish +0 -7
- package/dot_config/fish/functions/log_error.fish +0 -13
- package/dot_config/fish/functions/log_info.fish +0 -13
- package/dot_config/fish/functions/lr.fish +0 -7
- package/dot_config/fish/functions/lra.fish +0 -7
- package/dot_config/fish/functions/ls.fish +0 -7
- package/dot_config/fish/functions/lt.fish +0 -7
- package/dot_config/fish/functions/lta.fish +0 -7
- package/dot_config/fish/functions/notify-run.fish +0 -11
- package/dot_config/fish/functions/q.fish +0 -3
- package/dot_config/fish/functions/silent-run.fish +0 -7
- package/dot_config/fish/functions/yy.fish +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
- package/dot_config/foot/foot.ini.tmpl +0 -33
- package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
- package/dot_config/fzf/fzf.zsh +0 -48
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -165
- package/dot_config/git/allowed_signers.tmpl +0 -18
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/commit-template +0 -10
- package/dot_config/git/hooks/executable_commit-msg +0 -146
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf +0 -11
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py +0 -19
- package/dot_config/just/justfile +0 -122
- package/dot_config/k9s/config.yaml +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/kanshi/config.tmpl +0 -22
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -53
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -35
- package/dot_config/mako/config +0 -47
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/micro/settings.json +0 -3
- package/dot_config/mimeapps.list +0 -77
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -99
- package/dot_config/mongosh/mongoshrc.js +0 -68
- package/dot_config/mpv/input.conf +0 -47
- package/dot_config/mpv/mpv.conf +0 -47
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/niri/config.kdl.tmpl +0 -327
- package/dot_config/nushell/aliases.nu +0 -18
- package/dot_config/nushell/cached_eval.nu +0 -80
- package/dot_config/nushell/completions.nu.tmpl +0 -52
- package/dot_config/nushell/config.nu.tmpl +0 -86
- package/dot_config/nushell/env.nu.tmpl +0 -102
- package/dot_config/nushell/functions.nu.tmpl +0 -17
- package/dot_config/nvim/init.lua +0 -18
- package/dot_config/nvim/lazy-lock.json +0 -58
- package/dot_config/nvim/lua/config/autocmds.lua +0 -107
- package/dot_config/nvim/lua/config/keymaps.lua +0 -92
- package/dot_config/nvim/lua/config/lazy.lua +0 -44
- package/dot_config/nvim/lua/config/options.lua +0 -49
- package/dot_config/nvim/lua/plugins/ai.lua +0 -75
- package/dot_config/nvim/lua/plugins/coding.lua +0 -216
- package/dot_config/nvim/lua/plugins/completion.lua +0 -60
- package/dot_config/nvim/lua/plugins/dap.lua +0 -412
- package/dot_config/nvim/lua/plugins/editor.lua +0 -55
- package/dot_config/nvim/lua/plugins/git.lua +0 -10
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
- package/dot_config/nvim/lua/plugins/rust.lua +0 -34
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
- package/dot_config/nvim/lua/plugins/ui.lua +0 -509
- package/dot_config/paru/paru.conf +0 -10
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
- package/dot_config/pueue/pueue.yml +0 -34
- package/dot_config/pypoetry/config.toml +0 -6
- package/dot_config/pyrightconfig.json +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/ripgrep/ripgreprc +0 -21
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
- package/dot_config/shell/05-core-safety.sh +0 -48
- package/dot_config/shell/10-secrets.sh +0 -41
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
- package/dot_config/shell/40-ls-colors.sh +0 -49
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -127
- package/dot_config/shell/README.md +0 -284
- package/dot_config/shell/als_data.txt.tmpl +0 -65
- package/dot_config/shell/custom/auto_ls.zsh +0 -20
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -202
- package/dot_config/swaylock/config +0 -43
- package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
- package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
- package/dot_config/systemd/user/pueued.service +0 -12
- package/dot_config/systemd/user/ssh-agent.service +0 -12
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -223
- package/dot_config/topgrade.toml.tmpl +0 -54
- package/dot_config/user-dirs.dirs +0 -10
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -82
- package/dot_config/waybar/config.jsonc.tmpl +0 -90
- package/dot_config/waybar/style.css.tmpl +0 -211
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
- package/dot_config/yarn/yarnrc.yml +0 -36
- package/dot_config/yazi/keymap.toml +0 -67
- package/dot_config/yazi/theme.toml +0 -102
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zathura/zathurarc +0 -52
- package/dot_config/zellij/config.kdl.tmpl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -7
- package/dot_config/zsh/dot_zshenv +0 -5
- package/dot_config/zsh/dot_zshrc.tmpl +0 -688
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
- package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
- package/dot_local/bin/executable_ai-update +0 -195
- package/dot_local/bin/executable_ai_core +0 -152
- package/dot_local/bin/executable_antigravity +0 -11
- package/dot_local/bin/executable_b64 +0 -84
- package/dot_local/bin/executable_bm +0 -79
- package/dot_local/bin/executable_cb +0 -39
- package/dot_local/bin/executable_dot +0 -636
- package/dot_local/bin/executable_dot-ai +0 -36
- package/dot_local/bin/executable_dot-bootstrap +0 -76
- package/dot_local/bin/executable_dot-launch-or-focus +0 -52
- package/dot_local/bin/executable_dot-load-benchmark +0 -31
- package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
- package/dot_local/bin/executable_dot-theme-sync +0 -952
- package/dot_local/bin/executable_dot_completion +0 -57
- package/dot_local/bin/executable_dtags +0 -28
- package/dot_local/bin/executable_epoch +0 -67
- package/dot_local/bin/executable_extract +0 -41
- package/dot_local/bin/executable_gbd +0 -52
- package/dot_local/bin/executable_gd +0 -42
- package/dot_local/bin/executable_git-ai-commit +0 -175
- package/dot_local/bin/executable_git-ai-diff +0 -169
- package/dot_local/bin/executable_gl +0 -101
- package/dot_local/bin/executable_hash +0 -161
- package/dot_local/bin/executable_hashsum +0 -160
- package/dot_local/bin/executable_hex +0 -115
- package/dot_local/bin/executable_jsonv +0 -78
- package/dot_local/bin/executable_jwt +0 -94
- package/dot_local/bin/executable_kill-port +0 -75
- package/dot_local/bin/executable_lorem +0 -118
- package/dot_local/bin/executable_mkscript +0 -35
- package/dot_local/bin/executable_monitor +0 -56
- package/dot_local/bin/executable_myip +0 -51
- package/dot_local/bin/executable_notify +0 -24
- package/dot_local/bin/executable_open +0 -38
- package/dot_local/bin/executable_pw +0 -27
- package/dot_local/bin/executable_rec-start +0 -46
- package/dot_local/bin/executable_rec-stop +0 -35
- package/dot_local/bin/executable_regex +0 -132
- package/dot_local/bin/executable_start-niri +0 -8
- package/dot_local/bin/executable_tmux-sessionizer +0 -314
- package/dot_local/bin/executable_tour +0 -177
- package/dot_local/bin/executable_up +0 -23
- package/dot_local/bin/executable_update +0 -142
- package/dot_local/bin/executable_uuid +0 -87
- package/dot_local/bin/executable_win +0 -32
- package/dot_local/bin/executable_yamlv +0 -57
- package/dot_local/share/bash-completion/completions/dot +0 -72
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +0 -149
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +0 -287
- package/scripts/ci/check-dangerous-chmod.sh +0 -19
- package/scripts/ci/check-deps-dev.sh +0 -236
- package/scripts/ci/check-insecure-tls.sh +0 -61
- package/scripts/ci/check-regression-traceability.sh +0 -67
- package/scripts/ci/dot-cli-startup-bench.sh +0 -126
- package/scripts/ci/install-chezmoi-verified.sh +0 -67
- package/scripts/ci/lint-reusable-pins.sh +0 -78
- package/scripts/ci/run-coverage.sh +0 -451
- package/scripts/ci/validate-chezmoidata.sh +0 -25
- package/scripts/ci/validate-ci-config.sh +0 -224
- package/scripts/ci/windows-smoke-test.ps1 +0 -136
- package/scripts/docs/build-manual.sh +0 -883
- package/scripts/docs/check-manual.sh +0 -213
- package/scripts/dot/lib/bento.sh +0 -50
- package/scripts/dot/lib/log.sh +0 -200
- package/scripts/dot/lib/platform.sh +0 -112
- package/scripts/dot/lib/ui.sh +0 -650
- package/scripts/dot/lib/utils.sh +0 -377
- package/scripts/maintenance/check-updates.sh +0 -131
- 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
|