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