@sebastienrousseau/dotfiles 0.2.519 → 0.2.521
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 +200 -0
- package/LICENSE-APACHE +190 -0
- package/{LICENSE → LICENSE-MIT} +1 -1
- package/README.md +1172 -166
- package/install.sh +77 -11
- package/package.json +8 -8
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -117
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -450
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -155
- package/docs/manual/concept-index.md +0 -168
- package/docs/manual/index.md +0 -66
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -43
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -242
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -114
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -138
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -39
- package/scripts/diagnostics/doctor.sh +0 -751
- package/scripts/diagnostics/drift-dashboard.sh +0 -202
- package/scripts/diagnostics/health.sh +0 -623
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -119
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -187
- package/scripts/dot/commands/agent.sh +0 -485
- package/scripts/dot/commands/agents.sh +0 -336
- package/scripts/dot/commands/ai.sh +0 -587
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -134
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -688
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -333
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -419
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -556
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -185
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -63
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -604
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-version-consistency.sh +0 -124
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -112
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -117
- package/scripts/qa/validate-examples.sh +0 -27
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -335
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -742
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -544
- package/scripts/theme/switch.sh +0 -449
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/version-sync.sh +0 -654
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- package/templates/projects/python/tests/test_basic.py +0 -3
package/README.md
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: Apache-2.0 OR MIT -->
|
|
1
2
|
<p align="center">
|
|
2
3
|
<img src="https://cloudcdn.pro/dotfiles/v2/images/logos/dotfiles.svg" alt="Dotfiles logo" width="128" />
|
|
3
4
|
</p>
|
|
@@ -5,73 +6,163 @@
|
|
|
5
6
|
<h1 align="center">.dotfiles</h1>
|
|
6
7
|
|
|
7
8
|
<p align="center">
|
|
8
|
-
|
|
9
|
+
Declarative dotfiles for macOS, Linux, WSL, and Windows-native
|
|
10
|
+
PowerShell 7.4 LTS / 7.5+. Multi-shell by default. Sub-100ms
|
|
11
|
+
<code>dot</code> cold-start. Wallpaper-driven themes. Signed and
|
|
12
|
+
attested releases. Fleet apply over SSH.
|
|
9
13
|
</p>
|
|
10
14
|
|
|
11
15
|
<p align="center">
|
|
12
16
|
<a href="https://github.com/sebastienrousseau/dotfiles/actions"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/dotfiles/ci.yml?style=for-the-badge&logo=githubactions&logoColor=white" alt="Build" /></a>
|
|
13
|
-
<a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.
|
|
17
|
+
<a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.521-blue?style=for-the-badge&logo=semanticrelease&logoColor=white" alt="Version" /></a>
|
|
18
|
+
<a href="https://www.npmjs.com/package/@sebastienrousseau/dotfiles"><img src="https://img.shields.io/npm/v/@sebastienrousseau/dotfiles?style=for-the-badge&logo=npm&logoColor=white&label=npm" alt="npm" /></a>
|
|
19
|
+
<a href="https://doc.dotfiles.io/"><img src="https://img.shields.io/badge/Manual-doc.dotfiles.io-66c2a5?style=for-the-badge&labelColor=555555&logo=materialformkdocs&logoColor=white" alt="Manual" /></a>
|
|
14
20
|
<a href="https://github.com/sebastienrousseau/dotfiles/releases"><img src="https://img.shields.io/github/downloads/sebastienrousseau/dotfiles/total?style=for-the-badge&logo=github&logoColor=white" alt="Downloads" /></a>
|
|
15
21
|
<a href="https://codespaces.new/sebastienrousseau/dotfiles"><img src="https://img.shields.io/badge/Open%20in-Codespaces-blue?style=for-the-badge&logo=github&logoColor=white" alt="Open in GitHub Codespaces" /></a>
|
|
16
22
|
<a href="https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles"><img src="https://img.shields.io/ossf-scorecard/github.com/sebastienrousseau/dotfiles?style=for-the-badge&logo=linuxfoundation&logoColor=white&label=OpenSSF%20Scorecard" alt="OpenSSF Scorecard" /></a>
|
|
17
23
|
<a href="https://www.bestpractices.dev/projects/12840"><img src="https://img.shields.io/cii/level/12840?style=for-the-badge&logo=linuxfoundation&logoColor=white&label=OpenSSF%20Best%20Practices" alt="OpenSSF Best Practices" /></a>
|
|
18
|
-
<a href="
|
|
24
|
+
<a href="#license"><img src="https://img.shields.io/badge/License-Apache--2.0%20OR%20MIT-green?style=for-the-badge&logo=opensourceinitiative&logoColor=white" alt="License: Apache-2.0 OR MIT" /></a>
|
|
25
|
+
<a href="#requirements"><img src="https://img.shields.io/badge/toolchain-bash%205.0%20%C2%B7%20chezmoi%202.40-93450a?style=for-the-badge&logo=gnubash&logoColor=white" alt="Minimum toolchain: bash 5.0, chezmoi 2.40" /></a>
|
|
19
26
|
</p>
|
|
20
27
|
|
|
21
28
|
---
|
|
22
29
|
|
|
23
|
-
|
|
30
|
+
## Contents
|
|
24
31
|
|
|
25
|
-
|
|
26
|
-
30-second clip covering: install.sh → dot doctor → dot theme rebuild.
|
|
27
|
-
Recording recipe (maintainer):
|
|
32
|
+
**Getting started**
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# in the recording shell:
|
|
33
|
-
# curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh | bash
|
|
34
|
-
# dot doctor
|
|
35
|
-
# dot theme rebuild --force
|
|
36
|
-
# then Ctrl-D to stop
|
|
34
|
+
- [Install](#install) — one-line installer, verified installer, release archive, Homebrew, Scoop, AUR, npm, Nix, chezmoi, source
|
|
35
|
+
- [Requirements](#requirements) — toolchain floor, platforms, shells
|
|
36
|
+
- [Quick Start](#quick-start) — install, verify, switch a theme, apply in six commands
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
resulting `https://asciinema.org/a/<id>` URL, and replace this
|
|
40
|
-
comment with:
|
|
38
|
+
**The dotfiles family** (framework + four in-repo satellites)
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
- [The dotfiles family](#the-dotfiles-family) — `dot`, `dot-ui`, `dot-ai-tui`, `dot mcp`, `dot-mcp`, `dot-sys`, the module registry at a glance
|
|
41
|
+
|
|
42
|
+
**Framework reference**
|
|
43
|
+
|
|
44
|
+
- [One-minute migration from another dotfiles manager](#one-minute-migration-from-another-dotfiles-manager) — yadm, GNU Stow, a bare repository, plain chezmoi
|
|
45
|
+
- [Why this approach?](#why-this-approach) — design rationale
|
|
46
|
+
- [Capabilities at a glance](#capabilities-at-a-glance) — the current surface by theme
|
|
47
|
+
- [Five shells, one alias hub](#five-shells-one-alias-hub) — parity tiers from ADR-007
|
|
48
|
+
- [Comparison](#comparison) — short matrix against chezmoi, holman, nikitabobko
|
|
49
|
+
- [Benchmarks](#benchmarks) — startup budgets and the measurement method
|
|
50
|
+
- [Features](#features) — what is included, by area
|
|
51
|
+
|
|
52
|
+
**What it does**
|
|
53
|
+
|
|
54
|
+
- [Wallpaper-driven themes](#wallpaper-driven-themes) — K-Means in CIELAB, WCAG AAA, 228 generated themes
|
|
55
|
+
- [Agent governance (ask / plan / apply / audit)](#agent-governance-ask--plan--apply--audit) — bounded profiles, MCP policy, attestation
|
|
56
|
+
- [Self-healing and rollback](#self-healing-and-rollback) — `dot doctor`, `dot heal`, `dot chaos`, `dot rollback`
|
|
57
|
+
- [Fleet apply](#fleet-apply) — every host in `fleet.toml` over SSH
|
|
58
|
+
- [The `dot` CLI](#the-dot-cli) — 75 indexed subcommands grouped by intent
|
|
59
|
+
- [Configuration](#configuration) — `.chezmoidata.toml`, profiles, session flags
|
|
60
|
+
- [Examples](#examples) — runnable example index
|
|
61
|
+
|
|
62
|
+
**Operational**
|
|
63
|
+
|
|
64
|
+
- [When not to use .dotfiles](#when-not-to-use-dotfiles) — limitations
|
|
65
|
+
- [Development](#development) — make targets, fuzzing, hardening gates, CI
|
|
66
|
+
- [Security](#security) — reporting, posture, supply chain
|
|
67
|
+
- [Documentation](#documentation) — all reference docs
|
|
68
|
+
- [Acknowledgements](#acknowledgements)
|
|
69
|
+
- [Stability guarantees](#stability-guarantees) — SemVer axis, output stability, toolchain discipline
|
|
70
|
+
- [License](#license)
|
|
71
|
+
|
|
72
|
+
---
|
|
48
73
|
|
|
49
74
|
## Install
|
|
50
75
|
|
|
51
|
-
|
|
76
|
+
### Verified release installer
|
|
77
|
+
|
|
78
|
+
The default installation path is pinned to a release and fails before
|
|
79
|
+
execution if the installer bytes do not match the reviewed SHA256. Never pipe
|
|
80
|
+
the moving `main` branch directly into a shell. The per-release hash and its
|
|
81
|
+
release process are documented in
|
|
82
|
+
[`docs/security/INSTALL_VERIFICATION.md`](docs/security/INSTALL_VERIFICATION.md).
|
|
52
83
|
|
|
53
84
|
```bash
|
|
54
85
|
curl -fsSL -o /tmp/dotfiles-install.sh \
|
|
55
|
-
https://
|
|
56
|
-
|
|
57
|
-
|
|
|
86
|
+
https://github.com/sebastienrousseau/dotfiles/releases/download/v0.2.521/dotfiles-install-0.2.521.sh
|
|
87
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
88
|
+
echo "704e278f970d4aa53362204a89d044caefd64823b7d1cdf3a815c08cac971a89 /tmp/dotfiles-install.sh" | sha256sum -c -
|
|
89
|
+
else
|
|
90
|
+
echo "704e278f970d4aa53362204a89d044caefd64823b7d1cdf3a815c08cac971a89 /tmp/dotfiles-install.sh" | shasum -a 256 -c -
|
|
91
|
+
fi
|
|
58
92
|
bash /tmp/dotfiles-install.sh
|
|
59
93
|
```
|
|
60
94
|
|
|
61
|
-
|
|
95
|
+
The script needs `git`, `curl`, and `sha256sum` or `shasum`. It downloads a
|
|
96
|
+
checksum-verified `chezmoi` binary, clones the pinned release to
|
|
97
|
+
`~/.dotfiles`, applies it, and puts `dot` on `PATH`. The installer is
|
|
98
|
+
idempotent across macOS, Ubuntu, Debian, Arch, WSL2, and GitHub Codespaces.
|
|
99
|
+
|
|
100
|
+
### Pre-built release archive (`dot` CLI only)
|
|
101
|
+
|
|
102
|
+
Every tag publishes `dot-<version>.tar.gz` and `.zip` with the
|
|
103
|
+
dispatcher, `lib/dot`, the man page, zsh / bash / fish completions,
|
|
104
|
+
and a `Makefile` honouring the usual install prefix and staging
|
|
105
|
+
directory. The archive
|
|
106
|
+
carries SLSA build provenance (keyless, via Fulcio + Rekor):
|
|
62
107
|
|
|
63
108
|
```bash
|
|
64
|
-
|
|
109
|
+
gh release download v0.2.521 --repo sebastienrousseau/dotfiles --pattern 'dot-*.tar.gz'
|
|
110
|
+
gh attestation verify dot-0.2.521.tar.gz --repo sebastienrousseau/dotfiles
|
|
111
|
+
tar -xzf dot-0.2.521.tar.gz
|
|
112
|
+
make -C dot-0.2.521 install PREFIX=/usr/local
|
|
65
113
|
```
|
|
66
114
|
|
|
67
|
-
|
|
115
|
+
[`release-install-smoke.yml`](.github/workflows/release-install-smoke.yml)
|
|
116
|
+
repeats exactly this sequence on a clean Ubuntu and macOS runner
|
|
117
|
+
after every release: verify provenance, `make install` into an
|
|
118
|
+
empty staging directory, run `dot version`, `make uninstall`, assert
|
|
119
|
+
nothing is left behind.
|
|
120
|
+
|
|
121
|
+
### Package managers
|
|
122
|
+
|
|
123
|
+
| Channel | Install |
|
|
124
|
+
|---|---|
|
|
125
|
+
| Homebrew (macOS / Linux) | `brew install sebastienrousseau/tap/dot` |
|
|
126
|
+
| Scoop (Windows) | `scoop bucket add sebastienrousseau https://github.com/sebastienrousseau/scoop-bucket && scoop install dot` |
|
|
127
|
+
| AUR (Arch) | `paru -S dot-cli-git` |
|
|
128
|
+
| npm | `npx -p @sebastienrousseau/dotfiles dotfiles-install` (runs the same `install.sh`) |
|
|
129
|
+
| Nix | `nix profile install ~/.dotfiles/nix#dot-utils` after cloning; `nix develop ~/.dotfiles/nix` for the dev shell |
|
|
130
|
+
|
|
131
|
+
The Homebrew formula and Scoop manifest are regenerated per tag by
|
|
132
|
+
[`release-distribute-homebrew.yml`](.github/workflows/release-distribute-homebrew.yml)
|
|
133
|
+
and
|
|
134
|
+
[`release-distribute-scoop.yml`](.github/workflows/release-distribute-scoop.yml)
|
|
135
|
+
from the templates under [`pkg/`](pkg/README.md); the AUR
|
|
136
|
+
package is pushed by
|
|
137
|
+
[`release-distribute-aur.yml`](.github/workflows/release-distribute-aur.yml).
|
|
138
|
+
The per-channel templates and the maintainer runbook are in
|
|
139
|
+
[`pkg/README.md`](pkg/README.md); the end-to-end pipeline is
|
|
140
|
+
[`docs/operations/RELEASE_PIPELINE.md`](docs/operations/RELEASE_PIPELINE.md).
|
|
141
|
+
|
|
142
|
+
### With chezmoi directly
|
|
143
|
+
|
|
144
|
+
The repository is a chezmoi source tree (`.chezmoiroot` points at
|
|
145
|
+
`defaults/`), so chezmoi's own bootstrap works:
|
|
68
146
|
|
|
69
147
|
```bash
|
|
70
|
-
|
|
71
|
-
dot learn # interactive tour
|
|
148
|
+
chezmoi init --apply sebastienrousseau
|
|
72
149
|
```
|
|
73
150
|
|
|
74
|
-
|
|
151
|
+
This is what `install.sh` runs after its preflight checks; you give
|
|
152
|
+
up the verified `chezmoi` download and the `git` / `curl` checks.
|
|
153
|
+
|
|
154
|
+
### Build from source
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
git clone https://github.com/sebastienrousseau/dotfiles.git ~/.dotfiles
|
|
158
|
+
cd ~/.dotfiles
|
|
159
|
+
./install.sh # full install from the local checkout
|
|
160
|
+
make install PREFIX=~/.local # or: stage only the dot CLI
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`./install.sh --minimal` installs shells and core tools only.
|
|
164
|
+
`dot bundle ~/Downloads` builds an offline `.tar.zst` for an
|
|
165
|
+
air-gapped host; unpack it and run `./install.sh --force`.
|
|
75
166
|
|
|
76
167
|
<details>
|
|
77
168
|
<summary>CI/CD and Docker options</summary>
|
|
@@ -79,8 +170,9 @@ The install needs `git` and `curl`. The verified path also needs `shasum` or `sh
|
|
|
79
170
|
Silent install (no prompts):
|
|
80
171
|
|
|
81
172
|
```bash
|
|
173
|
+
# After downloading and verifying /tmp/dotfiles-install.sh as shown above:
|
|
82
174
|
DOTFILES_SILENT=1 DOTFILES_NONINTERACTIVE=1 \
|
|
83
|
-
bash
|
|
175
|
+
bash /tmp/dotfiles-install.sh --force
|
|
84
176
|
```
|
|
85
177
|
|
|
86
178
|
Docker sandbox:
|
|
@@ -94,64 +186,451 @@ docker run --rm -e DOTFILES_NONINTERACTIVE=1 ubuntu:24.04 bash -c \
|
|
|
94
186
|
&& dot doctor'
|
|
95
187
|
```
|
|
96
188
|
|
|
189
|
+
`dot sandbox` launches the same preview through Docker or Podman
|
|
190
|
+
from an installed machine.
|
|
191
|
+
|
|
97
192
|
</details>
|
|
98
193
|
|
|
194
|
+
### Profiles and session flags
|
|
195
|
+
|
|
196
|
+
Everything heavy is off, deferred, or cached by default. Pick a
|
|
197
|
+
profile per machine and flip session flags when you need less.
|
|
198
|
+
|
|
199
|
+
| Switch | Where | Effect | Documented in |
|
|
200
|
+
| :--- | :--- | :--- | :--- |
|
|
201
|
+
| `profile = "laptop"` *(default)* | `~/.config/chezmoi/chezmoi.toml` | All tools, AI CLIs, themes, completions | [`docs/reference/PROFILES.md`](docs/reference/PROFILES.md) |
|
|
202
|
+
| `profile = "minimal"` | same | Core shell, git, basic aliases only | same |
|
|
203
|
+
| `profile = "server"` | same | Shell, git, monitoring tools, no desktop | same |
|
|
204
|
+
| `[features]` flags | `.chezmoidata.toml` | `alias_wrapper`, `dms`, `zellij`, `linux_desktop`, `niri`, `waybar`, `fuzzel`, `mako`, `foot`, `kanshi`, `touch`, `t2`, `surface` — schema-checked in CI | [`docs/reference/FEATURES.md`](docs/reference/FEATURES.md) |
|
|
205
|
+
| `DOTFILES_FAST=1` | environment | Skip heavy layers (zinit, completions, lazy runtime managers) | [Configuration](#configuration) |
|
|
206
|
+
| `DOTFILES_ULTRA_FAST=1` | environment | Bare minimum shell: paths, aliases, prompt | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) |
|
|
207
|
+
| `DOTFILES_DEFER_TOOLS=1` *(default)* | environment | Resolve heavy binaries asynchronously after the first prompt | `defaults/dot_config/zsh/dot_zshrc.tmpl` |
|
|
208
|
+
| `DOTFILES_AI=1` | environment | Enable AI helper scripts | [`docs/reference/PROFILES.md`](docs/reference/PROFILES.md) |
|
|
209
|
+
| `DOTFILES_ARTIFACT_MODE=1` | environment | Minimal prompt plus the async Bento dashboard | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) |
|
|
210
|
+
| `DOTFILES_DEBUG=1` / `DOTFILES_TRACE=1` | environment | Per-stage startup timing / full trace to stderr | [`docs/manual/03-reference/03-environment.md`](docs/manual/03-reference/03-environment.md) |
|
|
211
|
+
| `EVALCACHE_DISABLE=true` | environment | Bypass `_cached_eval` for debugging | [Features](#features) |
|
|
212
|
+
|
|
99
213
|
---
|
|
100
214
|
|
|
101
|
-
##
|
|
215
|
+
## Requirements
|
|
216
|
+
|
|
217
|
+
- **Bash 5.0 or newer, zsh 5.8 or newer.** These are the Tier-1
|
|
218
|
+
shells and the floor the test suite runs on: Ubuntu, macOS (Intel
|
|
219
|
+
and Apple Silicon), and Windows runners on every push. `install.sh`
|
|
220
|
+
and `lib/dot` avoid bash-4-only constructs where macOS's stock
|
|
221
|
+
`/bin/bash` 3.2 has to run them (the notes are in `lib/dot/ui.sh`),
|
|
222
|
+
but 3.2 is not a supported interactive shell.
|
|
223
|
+
|
|
224
|
+
- **chezmoi 2.40 or newer, git 2.35 or newer, curl.** CI pins
|
|
225
|
+
chezmoi `2.47.1` and installs it through a checksum-verified
|
|
226
|
+
fetch; `install.sh` does the same on your machine.
|
|
227
|
+
|
|
228
|
+
- **A supported platform.** macOS 14+ (Apple Silicon and Intel),
|
|
229
|
+
Ubuntu 22.04+, Debian 12+, WSL2, NixOS 23.11+ are CI-tested or
|
|
230
|
+
supported; Fedora and Arch are community-supported. The full
|
|
231
|
+
table, with per-tool floors, is
|
|
232
|
+
[`docs/MINIMUM-TOOLCHAIN.md`](docs/MINIMUM-TOOLCHAIN.md).
|
|
233
|
+
|
|
234
|
+
- **Windows.** PowerShell 7.4 LTS / 7.5+ runs the native
|
|
235
|
+
`dot.ps1` for the daily workflow (apply, status, doctor, mise
|
|
236
|
+
inventory, agent checks, fleet status); the `Test / Windows` job
|
|
237
|
+
exercises the cmdlets on `windows-latest` every push.
|
|
238
|
+
|
|
239
|
+
**Minimum-toolchain policy.** The floor is the version CI
|
|
240
|
+
exercises, not the oldest version that happens to work. It is
|
|
241
|
+
raised only in a release whose `CHANGELOG.md` entry names the new
|
|
242
|
+
floor and the reason, never silently. The version axis on which it
|
|
243
|
+
may move, and the table mapping every supported platform and tool
|
|
244
|
+
to its floor live in
|
|
245
|
+
[`docs/MINIMUM-TOOLCHAIN.md`](docs/MINIMUM-TOOLCHAIN.md);
|
|
246
|
+
this README makes no distro-compatibility claim that table does not
|
|
247
|
+
back.
|
|
102
248
|
|
|
103
|
-
|
|
249
|
+
---
|
|
104
250
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
251
|
+
## Quick Start
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# First download and verify /tmp/dotfiles-install.sh as shown in Install.
|
|
255
|
+
bash /tmp/dotfiles-install.sh
|
|
256
|
+
dot doctor # audit tools, paths, portability, security
|
|
257
|
+
dot learn # interactive tour of shells, secrets, themes, performance
|
|
258
|
+
dot theme rebuild # generate themes from the wallpapers on this machine
|
|
259
|
+
dot theme toggle # swap dark and light within the current family
|
|
260
|
+
dot sync # apply the source tree; the next shell hydrates its caches
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### First 5 Minutes
|
|
264
|
+
|
|
265
|
+
1. **Check** — `dot doctor` validates tools, paths, and security.
|
|
266
|
+
2. **Explore** — `dot learn` walks through shells, secrets, themes,
|
|
267
|
+
and performance.
|
|
268
|
+
3. **Customize** — edit `~/.config/chezmoi/chezmoi.toml` for
|
|
269
|
+
per-machine settings
|
|
270
|
+
([Profiles](docs/reference/PROFILES.md)).
|
|
271
|
+
4. **Toggle features** — flip flags in `.chezmoidata.toml`
|
|
272
|
+
([Feature Flags](docs/reference/FEATURES.md)).
|
|
273
|
+
5. **Apply** — `dot sync` applies the config, and the next
|
|
274
|
+
interactive shell hydrates its caches through `_cached_eval`.
|
|
275
|
+
|
|
276
|
+
Upgrades between versions are covered in
|
|
277
|
+
[`docs/operations/MIGRATION.md`](docs/operations/MIGRATION.md).
|
|
118
278
|
|
|
119
279
|
---
|
|
120
280
|
|
|
121
|
-
##
|
|
281
|
+
## The dotfiles family
|
|
122
282
|
|
|
123
|
-
|
|
283
|
+
One repository, one release train: the `dot` framework plus four
|
|
284
|
+
satellites that ship inside it and version with it. The version
|
|
285
|
+
number in `.chezmoidata.toml` is the compatibility contract — CI's
|
|
286
|
+
`Generators / version-consistency` job checks it against eight
|
|
287
|
+
human-visible surfaces (`package.json`, `bin/dot`, the man page, the
|
|
288
|
+
`bento` banner, this README's badge, `CLAUDE.md`, [`AGENTS.md`](AGENTS.md)) on
|
|
289
|
+
every push.
|
|
124
290
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
291
|
+
| Component | What it is | Use case |
|
|
292
|
+
|---|---|---|
|
|
293
|
+
| **`dot`** ([`bin/dot`](bin/dot) + [`lib/dot`](lib/dot/README.md)) | Bash dispatcher and shared library — lifecycle, diagnostics, themes, secrets, fleet, agents | Everything below; also shipped alone as the release archive. |
|
|
294
|
+
| **`dot-ui`** ([`defaults/dot_local/share/dot-ui`](defaults/dot_local/share/dot-ui)) | Go renderer for tables, pickers, and progress used by `dot` | Consistent terminal UI across every subcommand; built on apply by a `run_onchange` hook. |
|
|
295
|
+
| **`dot-ai-tui`** ([`defaults/dot_local/share/dot-ai-tui`](defaults/dot_local/share/dot-ai-tui)) | Go Bubble Tea cockpit behind `dot ai` | Install, run, chat with, and meter Claude, Codex, Copilot, Aider, OpenCode and friends from one screen. |
|
|
296
|
+
| **`dot mcp`** ([`docs/security/MCP_POLICY.md`](docs/security/MCP_POLICY.md)) | MCP policy, supply-chain, and registry audit over `mcp-policy.json` / `mcp-registry.json` | Keep Model Context Protocol servers inside an allowlist before an agent touches them. |
|
|
297
|
+
| **`dot-mcp`** ([`defaults/dot_local/share/dot-mcp`](defaults/dot_local/share/dot-mcp)) | Go stdio MCP server behind `dot mcp serve` — JSON-RPC 2.0, four read-only tools, five resources | Let an MCP client audit this workstation's policy, agent mode, attestation and drift without being able to change it. |
|
|
298
|
+
| **`dot-sys`** ([`lib/wasm-tools`](lib/wasm-tools/README.md)) | Rust crate built for `wasm32-wasip1` and run under `wasmtime` | `dot attest --verify`: check a workstation evidence record in a sandbox with no filesystem, network or environment, so the verdict does not depend on the machine being reviewed. |
|
|
299
|
+
| **Module registry** ([`docs/operations/REGISTRY.md`](docs/operations/REGISTRY.md)) | JSON index of reusable dotfile modules, schema at [`docs/schema/dot-registry-v1.json`](docs/schema/dot-registry-v1.json) | `dot registry list / search / install` with SHA-256-verified archives and a chezmoi preview before apply. |
|
|
133
300
|
|
|
134
|
-
|
|
135
|
-
F --> I[Wallpaper Discovery<br/>System + Custom]
|
|
136
|
-
I --> J[K-Means CIELAB Engine]
|
|
137
|
-
J --> K[themes.toml<br/>WCAG AAA enforced]
|
|
138
|
-
K --> H
|
|
301
|
+
### Install the pieces
|
|
139
302
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
L --> O[~/.cache/shell Fast Init]
|
|
303
|
+
```bash
|
|
304
|
+
# The framework (everything, chezmoi-managed)
|
|
305
|
+
bash /tmp/dotfiles-install.sh # after the verified download above
|
|
144
306
|
|
|
145
|
-
|
|
307
|
+
# Only the dot CLI, from the attested release archive
|
|
308
|
+
gh release download v0.2.521 --repo sebastienrousseau/dotfiles --pattern 'dot-*.tar.gz'
|
|
309
|
+
|
|
310
|
+
# The Go satellites are (re)built on apply by
|
|
311
|
+
# defaults/run_onchange_24-build-dot-ui.sh.tmpl
|
|
312
|
+
# defaults/run_onchange_25-build-dot-ai-tui.sh.tmpl
|
|
313
|
+
# defaults/run_onchange_26-build-dot-mcp.sh.tmpl
|
|
314
|
+
|
|
315
|
+
# A registry module
|
|
316
|
+
dot registry search fonts && dot registry install <module> --yes
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Per-host quick links
|
|
320
|
+
|
|
321
|
+
| If you use… | Drop-in config |
|
|
322
|
+
|---|---|
|
|
323
|
+
| **Claude Code** | the shipped [`dotfiles-bootstrap` skill](defaults/dot_claude/skills/dotfiles-bootstrap/SKILL.md) — `/skills` discovers it and runs `dot init` with profile-aware safety defaults |
|
|
324
|
+
| **Cursor / Codex / Windsurf / Zed / Roo / Aider / Continue / Jules** | `dot agents render` regenerates every harness stub from [`CLAUDE.md`](CLAUDE.md); `dot agents check` fails when they drift |
|
|
325
|
+
| **A2A-capable agents** | the agent card at [`.well-known/agent.json`](.well-known/agent.json), validated by `dot agent a2a-card` and `dot agent conformance` ([`docs/interop/A2A.md`](docs/interop/A2A.md)) |
|
|
326
|
+
| **Ghostty / Alacritty / Kitty / WezTerm / Warp / iTerm2 / tmux / Neovim / VS Code** | themed on every `dot theme` switch — see [Wallpaper-driven themes](#wallpaper-driven-themes) |
|
|
327
|
+
|
|
328
|
+
### How good is this, really?
|
|
329
|
+
|
|
330
|
+
The rating is a set of programs, and each one prints the command
|
|
331
|
+
next to the number.
|
|
332
|
+
|
|
333
|
+
```sh
|
|
334
|
+
dot score # system health and security scorecard
|
|
335
|
+
dot security-score -j # workstation security posture, JSON
|
|
336
|
+
dot doctor --score # tools, paths, portability, AI analysis
|
|
337
|
+
make test # the reliability audit CI runs
|
|
146
338
|
```
|
|
147
339
|
|
|
340
|
+
What the repository can show today:
|
|
341
|
+
|
|
342
|
+
- **OpenSSF Scorecard 7.6 / 10** at the last recorded snapshot
|
|
343
|
+
(2026-05-17), regenerated weekly and written into
|
|
344
|
+
[`docs/security/SCORECARD.md`](docs/security/SCORECARD.md) with
|
|
345
|
+
the per-check breakdown. The badge above is live.
|
|
346
|
+
- **OpenSSF Best Practices: passing (100%)**, project
|
|
347
|
+
[12840](https://www.bestpractices.dev/projects/12840).
|
|
348
|
+
- **652 unit test files, 14 integration suites, 18 regression
|
|
349
|
+
tests**, a golden-snapshot suite for `dot --help` / `version` /
|
|
350
|
+
`doctor` / `perf` / `health`, and an `install.sh` fuzz harness —
|
|
351
|
+
see [`tests/README.md`](tests/README.md).
|
|
352
|
+
- **Bash line coverage floor 58%** measured by pure `xtrace`, no
|
|
353
|
+
kcov, ratcheted up slice by slice with the history recorded in
|
|
354
|
+
[`coverage.yml`](.github/workflows/coverage.yml).
|
|
355
|
+
- **53 workflows**, every third-party action SHA-pinned, Harden
|
|
356
|
+
Runner in every one of them.
|
|
357
|
+
|
|
358
|
+
The gaps, so nobody has to find them:
|
|
359
|
+
|
|
360
|
+
- Scorecard's `Code-Review` check scores **0**: one maintainer,
|
|
361
|
+
merges gated by CI rather than by a second reviewer.
|
|
362
|
+
- OSS-Fuzz onboarding is prepared under
|
|
363
|
+
[`fuzz/oss-fuzz/`](fuzz/oss-fuzz/project.yaml) but
|
|
364
|
+
**not yet submitted**; ClusterFuzzLite runs in the meantime.
|
|
365
|
+
- Repology tracks one packaging (AUR `dot-cli-git`); Homebrew and
|
|
366
|
+
Scoop go through this project's own tap and bucket.
|
|
367
|
+
- Nushell sits at Tier 3 with under 5% feature parity
|
|
368
|
+
([ADR-011](docs/adr/ADR-011-nushell-tier3-keep.md)).
|
|
369
|
+
|
|
370
|
+
Each number above names the command or the file that produced it.
|
|
371
|
+
The Scorecard breakdown is
|
|
372
|
+
[`docs/security/SCORECARD.md`](docs/security/SCORECARD.md), the
|
|
373
|
+
coverage history is in
|
|
374
|
+
[`coverage.yml`](.github/workflows/coverage.yml), and
|
|
375
|
+
[`docs/STRUCTURE.md`](docs/STRUCTURE.md) maps every top-level path
|
|
376
|
+
to the component that owns it. The rest of this README covers the
|
|
377
|
+
**framework** surface.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## One-minute migration from another dotfiles manager
|
|
382
|
+
|
|
383
|
+
The one-minute version is `dot init`. It clones any GitHub user's
|
|
384
|
+
dotfiles repository through this harness, refuses to clobber an
|
|
385
|
+
existing chezmoi source without `--force`, insists on HTTPS, and
|
|
386
|
+
previews with `--dry-run`:
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
dot init alice --dry-run # preview: what github.com/alice/dotfiles would do
|
|
390
|
+
dot init alice # clone + apply through the dot harness
|
|
391
|
+
dot init https://... --no-apply
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
Coming from a specific tool? The headline mapping is below, and
|
|
395
|
+
`dot init --dry-run` shows what the move would produce on this
|
|
396
|
+
machine before anything is written.
|
|
397
|
+
|
|
398
|
+
| Coming from | What changes |
|
|
399
|
+
|---|---|
|
|
400
|
+
| **yadm** | bare-repo tracking → a chezmoi source tree; `yadm alt` → `.tmpl` files driven by `.chezmoidata.toml`; `yadm encrypt` → age / SOPS through `dot secrets` |
|
|
401
|
+
| **GNU Stow** | one package directory per tool → one `dot_config/<tool>/` tree, deployed by `chezmoi apply` instead of a symlink farm |
|
|
402
|
+
| **bare git repository** (`config` alias) | `$HOME` as work tree → `~/.dotfiles` as source; `config status` → `dot status` / `dot diff` |
|
|
403
|
+
| **plain chezmoi** | keep your source tree as it is; gain `dot doctor` / `heal` / `theme` / `secrets` / `fleet` on top; `chezmoi apply` → `dot sync` |
|
|
404
|
+
|
|
405
|
+
Upgrades between versions of this project are a different document:
|
|
406
|
+
[`docs/operations/MIGRATION.md`](docs/operations/MIGRATION.md).
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Why this approach?
|
|
411
|
+
|
|
412
|
+
Most dotfiles repositories are personal collections. This one is
|
|
413
|
+
built as workstation infrastructure: chezmoi is the templating
|
|
414
|
+
engine ([ADR-005](docs/adr/ADR-005-chezmoi-choice.md)), `dot` is the
|
|
415
|
+
lifecycle CLI on top ([ADR-004](docs/adr/ADR-004-cli-architecture.md)),
|
|
416
|
+
and every claim on this page has a test, a workflow, or a document
|
|
417
|
+
behind it.
|
|
418
|
+
|
|
419
|
+
Three choices you will not find in `mathiasbynens/`, `holman/`, or
|
|
420
|
+
`paulirish/`:
|
|
421
|
+
|
|
422
|
+
1. **Wallpaper-driven terminal themes.** K-Means clustering in
|
|
423
|
+
CIELAB extracts a palette from any wallpaper; the engine enforces
|
|
424
|
+
WCAG AAA (7:1) contrast and writes `themes.toml` itself. 228
|
|
425
|
+
generated themes ship today
|
|
426
|
+
([ADR-009](docs/adr/ADR-009-wallpaper-driven-theming.md)).
|
|
427
|
+
2. **First-class agent governance.** Bounded profiles (`ask` /
|
|
428
|
+
`plan` / `apply` / `audit`), MCP policy enforcement, A2A
|
|
429
|
+
discovery, and signed attestation logs for every agent session
|
|
430
|
+
([`docs/security/MCP_POLICY.md`](docs/security/MCP_POLICY.md),
|
|
431
|
+
[`docs/interop/A2A.md`](docs/interop/A2A.md)).
|
|
432
|
+
3. **Verified multi-shell parity.** One alias and function hub
|
|
433
|
+
feeds zsh, bash, fish, nushell, and PowerShell; a parity contract
|
|
434
|
+
runs the canonical command surface in every available shell on
|
|
435
|
+
every PR ([ADR-007](docs/adr/ADR-007-multi-shell-parity.md)).
|
|
436
|
+
|
|
437
|
+
Two architectural choices make the rest cheap:
|
|
438
|
+
|
|
439
|
+
- **Lazy hydration.** The prompt paints first from static escape
|
|
440
|
+
codes; tool initialisations (`mise`, `atuin`, `zoxide`, `starship`)
|
|
441
|
+
run through `_cached_eval`, which sources cached `init` output and
|
|
442
|
+
invalidates on the binary's mtime and realpath. Heavy binaries
|
|
443
|
+
resolve asynchronously after the first prompt
|
|
444
|
+
([ADR-002](docs/adr/ADR-002-shell-performance.md)).
|
|
445
|
+
- **Idempotent, verifiable apply.** `dot sync` is chezmoi apply plus
|
|
446
|
+
drift detection; `dot heal` repairs tools, symlinks, and missing
|
|
447
|
+
files; `dot rollback` returns to a known-good state; `dot chaos`
|
|
448
|
+
breaks things on purpose to prove the loop closes.
|
|
449
|
+
|
|
450
|
+
The default install is signed (SSH ed25519 commits enforced on
|
|
451
|
+
`main`), attested (SLSA provenance and Cosign-signed SBOM per
|
|
452
|
+
release), multi-platform (macOS, Linux, WSL2, Apple Silicon CI
|
|
453
|
+
runners, Windows PowerShell), and schema-checked (`.chezmoidata.toml`
|
|
454
|
+
against [`config/chezmoidata.schema.json`](config/chezmoidata.schema.json)
|
|
455
|
+
via taplo on every PR).
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## Capabilities at a glance
|
|
460
|
+
|
|
461
|
+
| Theme | Headline deliverables |
|
|
462
|
+
| :--- | :--- |
|
|
463
|
+
| Wallpaper-driven themes | K-Means clustering in CIELAB extracts terminal palettes from any wallpaper; WCAG AAA enforced; Apple-compatible dynamic HEIC dark/light; 228 generated themes; `dot theme rebuild` |
|
|
464
|
+
| AI and MCP native | Agent profiles (`dot mode`), MCP policy and registry audit (`dot mcp`), agent card, checkpoints and conformance (`dot agent`), AI commit messages (`dot commit`), the `dot ai` cockpit and local gateway |
|
|
465
|
+
| Cryptographic attestation | Signed commits and tags, machine-readable workstation evidence (`dot attest`), policy-bundle releases, `dot keys sign-check`, `dot secret-audit` |
|
|
466
|
+
| Fleet management | Multi-node status, drift, events, namespaces and RBAC enforcement mode (`dot fleet`); `dot fleet apply` over SSH; `dot teleport` to bring up a remote host |
|
|
467
|
+
| Self-healing | `dot heal`, `dot chaos`, `dot rollback`, `dot bundle`; chezmoi drift, broken symlinks, missing files, checksum-verified tool recovery |
|
|
468
|
+
| Sub-second startup | Lazy loading, `_cached_eval`, mtime-based cache invalidation, realpath sidecar pins; `dot perf`, `dot benchmark`, `dot health` |
|
|
469
|
+
| Multi-shell parity | Tier 1 (full): zsh, bash. Tier 2 (bridged): fish. Tier 3 (compatible): nushell. PowerShell as a contract-tested parity target ([`tests/integration/test_shell_parity.sh`](tests/integration/test_shell_parity.sh)) |
|
|
470
|
+
| Build artifacts to `/tmp` | Cargo, Go, pip, uv, and Zig caches redirect to `/tmp/builds/` via `~/.config/mise/config.toml` and `~/.cargo/config.toml`; project directories stay clean |
|
|
471
|
+
| Encrypted secrets | age and SOPS at rest; macOS Keychain, `pass`, or age-encrypted store selected by policy; `dot secrets`, `dot secret-audit`, `dot ssh-key`, `dot ssh-cert` |
|
|
472
|
+
| Portable runtimes | mise for managed toolchains with a cross-platform `mise.lock`; Nix flake for strict reproducibility; `dot env`, `dot tools`, `dot upgrade` |
|
|
473
|
+
| Schema-validated config | `.chezmoidata.toml` checked against a JSON Schema in CI; `dot env emit` writes a v1-schema environment manifest; the registry index has its own schema |
|
|
474
|
+
| Supply chain | SHA-pinned actions, Harden Runner, SLSA L3 provenance, Cosign keyless signing, SPDX SBOM, OpenSSF Scorecard and Best Practices, gitleaks + detect-secrets + TruffleHog, dependency review, CodeQL, Checkov |
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## Five shells, one alias hub
|
|
479
|
+
|
|
480
|
+
The dotfiles expose one command surface over five shells through a
|
|
481
|
+
hub-and-spoke bridge ([ADR-007](docs/adr/ADR-007-multi-shell-parity.md)):
|
|
482
|
+
|
|
483
|
+
- **Hub** — canonical aliases and functions live once, in Bash/POSIX,
|
|
484
|
+
under `defaults/.chezmoitemplates/aliases/` and
|
|
485
|
+
`defaults/.chezmoitemplates/functions/`. Adding one propagates to
|
|
486
|
+
every shell.
|
|
487
|
+
- **Tier 1 (full): zsh, bash** — direct inclusion, lazy loading,
|
|
488
|
+
`_cached_eval`, staged `rc.d` modules.
|
|
489
|
+
- **Tier 2 (bridged): fish** — a runtime bash bridge with a cached
|
|
490
|
+
`abbr` table (878 entries source in 34 ms, down from 170 ms when
|
|
491
|
+
they were `alias` functions), plus native `dot` completions.
|
|
492
|
+
- **Tier 3 (compatible): nushell** — simple aliases extracted and
|
|
493
|
+
cached to `~/.cache/nushell/bash-aliases.nu`; functions delegate to
|
|
494
|
+
bash at roughly 5 ms per call
|
|
495
|
+
([ADR-011](docs/adr/ADR-011-nushell-tier3-keep.md) explains why it
|
|
496
|
+
stays).
|
|
497
|
+
- **PowerShell** — a managed profile, the native `dot.ps1` for the
|
|
498
|
+
daily workflow, and a parity contract that runs on every PR
|
|
499
|
+
([`docs/reference/POWERSHELL_PARITY.md`](docs/reference/POWERSHELL_PARITY.md)).
|
|
500
|
+
|
|
501
|
+
[`tests/integration/test_shell_parity.sh`](tests/integration/test_shell_parity.sh)
|
|
502
|
+
verifies the canonical command surface and a runtime smoke in every
|
|
503
|
+
shell present on the runner; the `Reliability Gate` workflow adds
|
|
504
|
+
WSL and PowerShell contract jobs.
|
|
505
|
+
|
|
506
|
+
```bash
|
|
507
|
+
dot completion zsh # completions are generated from the command registry,
|
|
508
|
+
dot completion fish # never hand-maintained — bash, zsh, fish, and nu
|
|
509
|
+
dot aliases tiers # which alias tiers and ecosystems are enabled here
|
|
510
|
+
dot aliases why gco # provenance and deprecation status of one alias
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## Comparison
|
|
516
|
+
|
|
517
|
+
`.dotfiles` is the only dotfiles distribution in this comparison
|
|
518
|
+
that ships wallpaper-derived WCAG-AAA themes, agent governance,
|
|
519
|
+
cryptographic attestation, a self-healing CLI, and fleet apply on
|
|
520
|
+
top of a stock chezmoi source tree.
|
|
521
|
+
|
|
522
|
+
| | This repo | chezmoi | holman/dotfiles | nikitabobko/dotfiles |
|
|
523
|
+
|:---|:---:|:---:|:---:|:---:|
|
|
524
|
+
| Cross-platform (macOS/Linux/WSL) | ✓ | ✓ | macOS-leaning | macOS only |
|
|
525
|
+
| Multi-shell parity (zsh/fish/nu/pwsh) | ✓ | — | bash only | zsh only |
|
|
526
|
+
| Wallpaper-driven themes (K-Means) | ✓ | — | — | — |
|
|
527
|
+
| AI / MCP integration | ✓ | — | — | — |
|
|
528
|
+
| Cryptographic attestation | ✓ | — | — | — |
|
|
529
|
+
| Self-healing CLI | ✓ | — | — | — |
|
|
530
|
+
| Fleet management | ✓ | — | — | — |
|
|
531
|
+
| Encrypted secrets (age/SOPS) | ✓ | ✓ | — | — |
|
|
532
|
+
| Build artifact redirection | ✓ | — | — | — |
|
|
533
|
+
| Schema-validated config | ✓ | — | — | — |
|
|
534
|
+
|
|
535
|
+
`chezmoi` is the underlying templating engine. This repo is the
|
|
536
|
+
opinionated reference implementation on top of it, and
|
|
537
|
+
[plain chezmoi users can adopt it without moving their source tree](#one-minute-migration-from-another-dotfiles-manager).
|
|
538
|
+
|
|
148
539
|
---
|
|
149
540
|
|
|
150
|
-
##
|
|
541
|
+
## Benchmarks
|
|
542
|
+
|
|
543
|
+
Two budgets are enforced in CI, and both state their method.
|
|
544
|
+
|
|
545
|
+
**`dot` cold start** — `tools/ci/dot-cli-startup-bench.sh` runs
|
|
546
|
+
`dot version` eleven times under a clean `env -i` shell and takes
|
|
547
|
+
the median. [`dot-cli-bench.yml`](.github/workflows/dot-cli-bench.yml)
|
|
548
|
+
fails the build above the budget on every push and PR touching
|
|
549
|
+
`bin/dot` or `scripts/dot/`; a median more than 15% over the previous
|
|
550
|
+
baseline is a warning.
|
|
551
|
+
|
|
552
|
+
| Runner | Budget (median of 11) | Observed |
|
|
553
|
+
|---|---:|---:|
|
|
554
|
+
| Linux (`ubuntu-latest`) | 150 ms | within budget on every green run |
|
|
555
|
+
| macOS | 200 ms | within budget on every green run |
|
|
556
|
+
| Windows (PowerShell) | 300 ms | within budget on every green run |
|
|
557
|
+
| Local macOS, bash 5.x | — | **~47 ms** (recorded in the workflow header and `CHANGELOG.md`) |
|
|
558
|
+
|
|
559
|
+
**Interactive shell startup** — `dot perf` (backed by
|
|
560
|
+
`scripts/diagnostics/perf.sh`, `hyperfine`-style warm-up plus three
|
|
561
|
+
runs, mean) measures every installed shell against a per-shell
|
|
562
|
+
target, compares with a recorded baseline in
|
|
563
|
+
`~/.cache/dotfiles/perf-baseline.json`, and flags any shell more
|
|
564
|
+
than 10% slower. [`perf-baseline.yml`](.github/workflows/perf-baseline.yml)
|
|
565
|
+
records the reference weekly on Ubuntu and measures every push to a
|
|
566
|
+
`feat/**` branch that touches shell code.
|
|
567
|
+
|
|
568
|
+
| Shell | Target (mean) | Override |
|
|
569
|
+
|---|---:|---|
|
|
570
|
+
| zsh | 250 ms | `DOTFILES_PERF_TARGET_ZSH_MS` |
|
|
571
|
+
| bash | 60 ms | `DOTFILES_PERF_TARGET_BASH_MS` |
|
|
572
|
+
| fish | 200 ms | `DOTFILES_PERF_TARGET_FISH_MS` |
|
|
573
|
+
| nushell | 500 ms | `DOTFILES_PERF_TARGET_NU_MS` |
|
|
574
|
+
| PowerShell | 600 ms | `DOTFILES_PERF_TARGET_PWSH_MS` |
|
|
575
|
+
|
|
576
|
+
Measured deltas that shipped with their method in `CHANGELOG.md`:
|
|
577
|
+
fish startup **217 ms → 119 ms** by emitting the alias bridge as
|
|
578
|
+
`abbr` instead of `alias` (#963); ~140 ms saved per fish start by
|
|
579
|
+
shadowing Homebrew's eager `direnv` / `mise` `vendor_conf.d` hooks;
|
|
580
|
+
20–50 ms saved per tool by `_cached_eval`
|
|
581
|
+
([`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)).
|
|
582
|
+
The original threshold and the `hyperfine --warmup 3 --runs 10
|
|
583
|
+
"zsh -i -c exit"` recipe are in
|
|
584
|
+
[ADR-002](docs/adr/ADR-002-shell-performance.md).
|
|
585
|
+
|
|
586
|
+
Numbers on your own machine:
|
|
587
|
+
|
|
588
|
+
```bash
|
|
589
|
+
dot perf # every installed shell vs its target
|
|
590
|
+
dot perf --baseline # record this machine's known-good point
|
|
591
|
+
dot benchmark # per-component startup profile
|
|
592
|
+
dot load-bench # time to heavy-layer readiness
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
Budgets, baseline lifecycle, and the regression-issue pipeline are
|
|
596
|
+
documented in
|
|
597
|
+
[`docs/operations/PERFORMANCE.md`](docs/operations/PERFORMANCE.md);
|
|
598
|
+
the harnesses are
|
|
599
|
+
[`tools/ci/dot-cli-startup-bench.sh`](tools/ci/dot-cli-startup-bench.sh)
|
|
600
|
+
and [`benches/`](benches/).
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
## Features
|
|
605
|
+
|
|
606
|
+
| | |
|
|
607
|
+
| :--- | :--- |
|
|
608
|
+
| **Shells and navigation** | Zsh loads in stages through small `rc.d` modules, not one startup script. Fish uses `_cached_eval` and deferred loading. Bash ships full parity with zsh for tooling and aliases. Nushell handles structured workflows (Tier 3). PowerShell keeps cross-platform and WSL sessions on the same baseline with a `pwsh` parity contract in CI. Starship, Zoxide, Atuin, and fzf for navigation and recall. Starship Transient Prompt collapses past prompts to a single glyph on fish; the zsh hook is in place for when upstream lands the matching function ([ADR-010](docs/adr/ADR-010-starship-transient-prompt.md)). |
|
|
609
|
+
| **Development and runtimes** | mise manages language versions in user space with a cross-platform `mise.lock` (Linux, macOS, Windows, exact URLs and SHA-256s). Nix Flakes for strict reproducibility when speed is not the priority. Pueue queues long-running tasks instead of extra tabs. Neovim ships as a full Lua editor, not a starter template. Lazygit for terminal git. Build caches (Cargo, Go, pip, uv, Zig) redirect to `/tmp/builds/` and clear on reboot. `_cached_eval` caches expensive `tool init` output with mtime and realpath invalidation; `EVALCACHE_DISABLE=true` bypasses it. |
|
|
610
|
+
| **AI, agents, and MCP** | Agent profiles (`dot mode`): ask, plan, apply, audit. Pattern library (`dot patterns`): architect, hardener, refactor, bundled in `dot_config/ai/patterns/`. MCP policy enforcement (`dot mcp`). AI commit messages (`dot commit`). The `dot ai` cockpit installs and runs Codex, Copilot, Antigravity, Aider, OpenCode and friends from one Bubble Tea TUI; `dot ai serve` exposes your Claude subscription locally to any Anthropic- or OpenAI-protocol tool ([ADR-012](docs/adr/ADR-012-ai-fleet-local-proxy.md), [`docs/AI.md`](docs/AI.md)). Every agent session is logged with a policy hash and an outcome. |
|
|
611
|
+
| **Security, trust, governance** | age and SOPS keep secrets encrypted at rest and out of history. SSH ed25519 signing plus trust metadata back every commit. Gitleaks, detect-secrets, TruffleHog, policy checks, and compliance workflows. `dot attest` records machine state, policy, prompt, and model metadata in tracked JSON. Telemetry controls and local-first defaults (`dot telemetry`, `dot dns-doh`, `dot firewall`, `dot usb-safety`, `dot lock-screen`, `dot encrypt-check`). SPDX SBOM and Grype CVE scanning in CI. npm releases authenticate through OIDC trusted publishing with provenance, never a long-lived token. |
|
|
612
|
+
| **Themes** | 228 wallpaper-derived themes, dark and light paired; `dot theme`, `dot theme toggle`, `dot theme family`, `dot theme sync` with the OS appearance; `dot wallpaper rotate` and `dot wallpaper sync`. See [Wallpaper-driven themes](#wallpaper-driven-themes). |
|
|
613
|
+
| **Fleet and remote** | `dot fleet` status, drift, events, namespace, RBAC enforce mode; `dot fleet apply` runs `dot sync` (or a custom `--cmd`) on every host in `fleet.toml`; `dot teleport` deploys the environment to a fresh host over SSH; `dot bundle` builds an offline archive. |
|
|
614
|
+
| **Diagnostics** | `dot doctor` (deep audit, `--ai` analysis), `dot health` dashboard, `dot score`, `dot security-score`, `dot fleet drift`, `dot snapshot`, `dot metrics` (JSONL observability), `dot history`, `dot packages`. |
|
|
615
|
+
| **Distribution** | Release archives with a `PREFIX` / `DESTDIR` Makefile, man page (`share/man/man1/dot.1`), generated completions, Homebrew tap, Scoop bucket, AUR, npm, Nix; `dot uninstall` removes the managed environment. |
|
|
616
|
+
|
|
617
|
+
---
|
|
618
|
+
|
|
619
|
+
## Wallpaper-driven themes
|
|
151
620
|
|
|
152
621
|
Drop a wallpaper. Get a theme.
|
|
153
622
|
|
|
154
|
-
`dot theme rebuild` discovers system wallpapers and your custom
|
|
623
|
+
`dot theme rebuild` discovers system wallpapers and your custom
|
|
624
|
+
ones. On macOS it looks in `/System/Library/Desktop Pictures/`. On
|
|
625
|
+
Linux it looks in `/usr/share/backgrounds/`. Custom wallpapers live
|
|
626
|
+
in `~/Pictures/Wallpapers/` (`DOTFILES_WALLPAPER_DIR` overrides).
|
|
627
|
+
K-Means clustering in CIELAB colour space extracts the dominant
|
|
628
|
+
colours; the engine generates a 16-colour terminal palette, enforces
|
|
629
|
+
WCAG AAA contrast (7:1 for fg/bg, accent text on accent, and c15 on
|
|
630
|
+
bg), and assembles `defaults/.chezmoidata/themes.toml` on its own.
|
|
631
|
+
Extraction runs four jobs in parallel, results are cached in
|
|
632
|
+
`~/.cache/dotfiles/themes/`, and only changed wallpapers are
|
|
633
|
+
regenerated.
|
|
155
634
|
|
|
156
635
|
| Tier | Source | Format |
|
|
157
636
|
|:---|:---|:---|
|
|
@@ -160,45 +639,144 @@ Drop a wallpaper. Get a theme.
|
|
|
160
639
|
|
|
161
640
|
```bash
|
|
162
641
|
dot theme # interactive picker (paired themes only)
|
|
642
|
+
dot theme set maui # select a family and follow OS appearance
|
|
643
|
+
dot theme plan maui --mode auto --json # inspect the pure transaction plan
|
|
163
644
|
dot theme tahoe-dark # switch directly
|
|
164
|
-
dot theme toggle # swap dark
|
|
645
|
+
dot theme toggle # swap dark and light within the current family
|
|
646
|
+
dot theme mode light # pin a manual appearance
|
|
647
|
+
dot theme mode auto # resume following the OS appearance
|
|
648
|
+
dot theme family # cycle between theme families
|
|
649
|
+
dot theme sync # enable auto mode and sync immediately
|
|
165
650
|
dot theme rebuild # regenerate from current wallpapers
|
|
166
651
|
```
|
|
167
652
|
|
|
168
|
-
|
|
653
|
+
Maui is the default family. Its dynamic HEIC supplies both wallpaper
|
|
654
|
+
appearances, while the resolved `maui-light` or `maui-dark` palette keeps
|
|
655
|
+
terminals and applications aligned. On macOS, a LaunchAgent watches the
|
|
656
|
+
system appearance preference and reruns the sync automatically. Runtime
|
|
657
|
+
selection is machine-local in `~/.config/chezmoi/chezmoi.toml`, so using the
|
|
658
|
+
picker does not modify the dotfiles checkout.
|
|
659
|
+
|
|
660
|
+
On theme switch, every managed surface updates. Terminals: Ghostty,
|
|
661
|
+
Alacritty, Kitty, WezTerm, Warp, iTerm2, tmux. Editors: Neovim and
|
|
662
|
+
VS Code. The theme also sets GTK and icon themes, the macOS accent
|
|
663
|
+
colour and dark-mode toggle (with a forced UI refresh), the browser
|
|
664
|
+
colour mode, and the wallpaper. On Linux the engine converts HEIC to
|
|
665
|
+
PNG through `magick` or `heif-convert`.
|
|
666
|
+
|
|
667
|
+
Full guide: [`docs/guides/THEMING.md`](docs/guides/THEMING.md).
|
|
668
|
+
Rationale: [ADR-009](docs/adr/ADR-009-wallpaper-driven-theming.md).
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## Agent governance (ask / plan / apply / audit)
|
|
673
|
+
|
|
674
|
+
Agents run under a named profile that bounds what they may do, and
|
|
675
|
+
every run leaves evidence:
|
|
676
|
+
|
|
677
|
+
```bash
|
|
678
|
+
dot mode list # ask / plan / apply / audit
|
|
679
|
+
dot mode set plan # switch the active profile
|
|
680
|
+
dot mode run plan git status # run one command under a profile, with a checkpoint
|
|
681
|
+
dot mode doctor # validate agent-profiles.json and the default
|
|
682
|
+
dot agent log # tail the session audit log
|
|
683
|
+
dot agent checkpoint list # saved run checkpoints (save / list / show / replay)
|
|
684
|
+
dot fleet enforce strict # advisory → strict RBAC for agent profiles
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
The MCP side is policy-first: `dot mcp doctor` audits configured
|
|
688
|
+
Model Context Protocol servers against
|
|
689
|
+
`defaults/dot_config/dotfiles/mcp-policy.json` (allowlist, supply
|
|
690
|
+
chain, config), and `dot mcp registry` shows the registry it was
|
|
691
|
+
checked against. `dot attest` exports the workstation's version,
|
|
692
|
+
platform, signing settings, active profile, and policy hash as
|
|
693
|
+
tracked JSON ([`docs/operations/ATTESTATION.md`](docs/operations/ATTESTATION.md)).
|
|
694
|
+
The A2A agent card and conformance suite are in
|
|
695
|
+
[`docs/interop/A2A.md`](docs/interop/A2A.md); the trust model that
|
|
696
|
+
ties signing, secrets, profiles, and attestation together is
|
|
697
|
+
[`docs/manual/01-concepts/02-trust-model.md`](docs/manual/01-concepts/02-trust-model.md).
|
|
698
|
+
|
|
699
|
+
---
|
|
169
700
|
|
|
170
|
-
|
|
701
|
+
## Self-healing and rollback
|
|
702
|
+
|
|
703
|
+
The CLI is idempotent, and it checks its own work.
|
|
704
|
+
|
|
705
|
+
```bash
|
|
706
|
+
dot doctor # deep audit: tools, paths, portability, AI analysis
|
|
707
|
+
dot heal # auto-fix tools, chezmoi drift, broken symlinks, missing files
|
|
708
|
+
dot chaos --dry-run # simulate config corruption, then prove heal closes the loop
|
|
709
|
+
dot rollback # return to a previous known-good state
|
|
710
|
+
dot snapshot # capture a baseline to compare against later
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
Tool recovery is checksum-verified: Nushell, Pueue, Wasmtime, SOPS,
|
|
714
|
+
Yazi, and Zellij are restored from exact mise / aqua pins, never
|
|
715
|
+
from a mutable release URL. `dot health` renders the cache and tool
|
|
716
|
+
state as a live dashboard (`-j` for JSON); its output, like
|
|
717
|
+
`doctor`, `perf`, `version`, and `--help`, is pinned by golden
|
|
718
|
+
snapshots in [`tests/snapshots/`](tests/snapshots/).
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
722
|
+
## Fleet apply
|
|
723
|
+
|
|
724
|
+
```toml
|
|
725
|
+
# ~/.config/dotfiles/fleet.toml (DOTFILES_FLEET_HOSTS overrides the path)
|
|
726
|
+
[hosts.laptop]
|
|
727
|
+
ssh = "user@laptop.local"
|
|
728
|
+
profile = "workstation"
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
```bash
|
|
732
|
+
dot fleet # this node: id, namespace, version, OS, drift, last apply
|
|
733
|
+
dot fleet drift # configuration drift across managed files
|
|
734
|
+
dot fleet apply # every host runs: dot sync && dot doctor --quiet
|
|
735
|
+
dot fleet apply --cmd uptime # or an arbitrary command — this is the trust boundary
|
|
736
|
+
dot fleet namespace staging # multi-tenant isolation
|
|
737
|
+
dot fleet events # recent fleet events from the local log
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
Hostnames are validated against `[A-Za-z0-9._@:+/-]+` before any SSH
|
|
741
|
+
fan-out; first connections use `StrictHostKeyChecking=accept-new`,
|
|
742
|
+
so pre-populate `~/.ssh/known_hosts` if your threat model allows no
|
|
743
|
+
TOFU window. `dot teleport` brings a fresh machine up over SSH
|
|
744
|
+
before it joins the fleet. The concept chapter is
|
|
745
|
+
[`docs/manual/01-concepts/04-fleet.md`](docs/manual/01-concepts/04-fleet.md).
|
|
171
746
|
|
|
172
747
|
---
|
|
173
748
|
|
|
174
749
|
## The `dot` CLI
|
|
175
750
|
|
|
176
|
-
|
|
751
|
+
75 subcommands, 144 indexed entries, grouped by intent. `dot help`
|
|
752
|
+
shows the overview, `dot help all` the full reference, `dot search
|
|
753
|
+
<keyword>` filters it. The generated
|
|
754
|
+
[command index](docs/manual/command-index.md) is checked against
|
|
755
|
+
`dot help all` on every PR.
|
|
177
756
|
|
|
178
|
-
### Start
|
|
757
|
+
### Start here
|
|
179
758
|
|
|
180
759
|
| | |
|
|
181
760
|
|:---|:---|
|
|
182
|
-
| `dot init <user>` | Bootstrap any GitHub user's dotfiles
|
|
183
|
-
| `dot sync` | Apply dotfiles to this machine |
|
|
761
|
+
| `dot init <user>` | Bootstrap any GitHub user's dotfiles repository through this harness |
|
|
762
|
+
| `dot sync` | Apply dotfiles to this machine (`--pull` to fetch first, `--check` to preview) |
|
|
184
763
|
| `dot doctor` | Check the environment and surface issues |
|
|
185
764
|
| `dot learn` | Open the guided tour |
|
|
186
765
|
| `dot agents render` | Sync `CLAUDE.md` → `AGENTS.md` + Cursor + Codex stubs |
|
|
187
766
|
| `dot fleet apply` | SSH out to every host in `~/.config/dotfiles/fleet.toml` |
|
|
188
767
|
| `dot registry list` | Browse reusable dotfile modules from the registry |
|
|
189
768
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
### Daily Use
|
|
769
|
+
### Daily use
|
|
193
770
|
|
|
194
771
|
| | |
|
|
195
772
|
|:---|:---|
|
|
196
773
|
| `dot status` / `dot diff` | Show local drift; preview pending changes |
|
|
197
|
-
| `dot edit` | Open the source directory |
|
|
198
|
-
| `dot upgrade` | Update
|
|
774
|
+
| `dot edit` / `dot add` | Open the source directory; add a file to the source |
|
|
775
|
+
| `dot upgrade` | Update toolchains, plugins, and dotfiles |
|
|
199
776
|
| `dot commit` | Generate an AI commit message from the staged diff |
|
|
777
|
+
| `dot search` | Find commands by keyword |
|
|
200
778
|
|
|
201
|
-
### Inspect
|
|
779
|
+
### Inspect and repair
|
|
202
780
|
|
|
203
781
|
| | |
|
|
204
782
|
|:---|:---|
|
|
@@ -208,147 +786,575 @@ A [Claude Code skill](defaults/dot_claude/skills/dotfiles-bootstrap/SKILL.md) is
|
|
|
208
786
|
| `dot chaos` | Simulate corruption to test self-healing |
|
|
209
787
|
| `dot bundle` | Create an offline tarball of the dotfiles environment |
|
|
210
788
|
|
|
211
|
-
### AI
|
|
789
|
+
### AI and agents
|
|
212
790
|
|
|
213
791
|
| | |
|
|
214
792
|
|:---|:---|
|
|
215
|
-
| `dot ai` | AI fleet cockpit — run, chat, install, serve a local
|
|
793
|
+
| `dot ai` | AI fleet cockpit — run, chat, install, serve a local gateway, cost |
|
|
216
794
|
| `dot mcp` | Inspect MCP policy and registry |
|
|
217
795
|
| `dot mode` | Show or set the agent profile (ask / plan / apply / audit) |
|
|
218
796
|
| `dot agent` | Agent metadata, logs, checkpoints, conformance |
|
|
219
797
|
| `dot patterns` | List bundled AI patterns (architect, hardener, refactor) |
|
|
220
798
|
|
|
221
|
-
### Configuration
|
|
799
|
+
### Configuration commands
|
|
222
800
|
|
|
223
801
|
| | |
|
|
224
802
|
|:---|:---|
|
|
225
803
|
| `dot theme` / `dot theme rebuild` | Switch theme or regenerate from wallpapers |
|
|
226
|
-
| `dot env` |
|
|
227
|
-
| `dot profile` | Show or switch active profile |
|
|
228
|
-
| `dot secrets` | Edit encrypted secrets |
|
|
229
|
-
| `dot fonts` | Install or
|
|
804
|
+
| `dot env` | Managed tool versions (list, install, use, prune, emit) |
|
|
805
|
+
| `dot profile` | Show or switch the active profile |
|
|
806
|
+
| `dot secrets` | Edit, get, set, list, load encrypted secrets |
|
|
807
|
+
| `dot fonts` | Install or patch Nerd Fonts |
|
|
230
808
|
|
|
231
|
-
### Fleet
|
|
809
|
+
### Fleet and performance
|
|
232
810
|
|
|
233
811
|
| | |
|
|
234
812
|
|:---|:---|
|
|
235
|
-
| `dot fleet` | Multi-node status, drift,
|
|
813
|
+
| `dot fleet` | Multi-node status, drift, events, namespace |
|
|
236
814
|
| `dot perf` | Measure shell startup |
|
|
237
815
|
| `dot score` / `dot security-score` | Health and security scorecards |
|
|
238
816
|
| `dot health` | Live dashboard for caches and tool state |
|
|
239
817
|
|
|
240
|
-
Full reference: [docs/reference/UTILS.md](docs/reference/UTILS.md)
|
|
241
|
-
|
|
242
|
-
|
|
818
|
+
Full reference: [`docs/reference/UTILS.md`](docs/reference/UTILS.md)
|
|
819
|
+
· manual chapter:
|
|
820
|
+
[`docs/manual/03-reference/01-dot-cli.md`](docs/manual/03-reference/01-dot-cli.md)
|
|
821
|
+
· `man dot` after install.
|
|
243
822
|
|
|
244
|
-
|
|
823
|
+
<details>
|
|
824
|
+
<summary><b>Architecture</b></summary>
|
|
245
825
|
|
|
246
|
-
|
|
826
|
+
```mermaid
|
|
827
|
+
graph TD
|
|
828
|
+
A[User Shell] --> B{dot CLI}
|
|
829
|
+
B --> C[Lifecycle: sync / apply / rollback / heal]
|
|
830
|
+
B --> D[Diagnostics: doctor / drift / benchmark / score]
|
|
831
|
+
B --> E[AI & Agents: ai / mcp / agent / mode]
|
|
832
|
+
B --> F[Themes: theme / theme rebuild]
|
|
833
|
+
B --> G[Fleet & Attest: fleet / attest / bundle]
|
|
247
834
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
835
|
+
C --> H[Chezmoi Source]
|
|
836
|
+
F --> I[Wallpaper Discovery<br/>System + Custom]
|
|
837
|
+
I --> J[K-Means CIELAB Engine]
|
|
838
|
+
J --> K[themes.toml<br/>WCAG AAA enforced]
|
|
839
|
+
K --> H
|
|
253
840
|
|
|
254
|
-
|
|
841
|
+
H --> L[Zsh / Fish / Bash / Nushell / PowerShell]
|
|
842
|
+
H --> M[Mise / Nix Toolchains]
|
|
843
|
+
H --> N[MCP Policy / Agent Profiles]
|
|
844
|
+
L --> O[~/.cache/shell Fast Init]
|
|
255
845
|
|
|
256
|
-
|
|
846
|
+
G --> P[Signed Attestation Logs]
|
|
847
|
+
```
|
|
257
848
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
849
|
+
Root layout: `bin/` (dispatcher), `lib/dot/`
|
|
850
|
+
(shared bash library), `defaults/` (the chezmoi source tree, via
|
|
851
|
+
`.chezmoiroot`), `scripts/` (runtime subcommands), `tools/`
|
|
852
|
+
(repo-only ops), `install/` (bootstrap and channel templates). The
|
|
853
|
+
map of every top-level path, with the history of the reorganisation
|
|
854
|
+
that produced it, is [`docs/STRUCTURE.md`](docs/STRUCTURE.md); the
|
|
855
|
+
contributor-facing
|
|
856
|
+
design is
|
|
857
|
+
[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
|
|
263
858
|
|
|
264
|
-
|
|
859
|
+
</details>
|
|
265
860
|
|
|
266
861
|
---
|
|
267
862
|
|
|
268
|
-
##
|
|
863
|
+
## Configuration
|
|
269
864
|
|
|
270
865
|
<details>
|
|
271
|
-
<summary><b>
|
|
866
|
+
<summary><b>Machine data (<code>.chezmoidata.toml</code>)</b></summary>
|
|
272
867
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
- **Nushell** handles structured terminal workflows (Tier-3 compatible)
|
|
277
|
-
- **PowerShell** keeps cross-platform and WSL sessions on the same baseline. A `pwsh` parity contract runs in CI on every PR
|
|
278
|
-
- **Starship**, **Zoxide**, **Atuin**, and **fzf** for navigation and command recall
|
|
279
|
-
- **Starship Transient Prompt** collapses past prompts to a single glyph in scrollback on fish. The zsh hook is in place for when upstream Starship lands the matching function ([ADR-010](docs/adr/ADR-010-starship-transient-prompt.md))
|
|
868
|
+
```toml
|
|
869
|
+
# defaults/.chezmoidata.toml — repo-wide defaults, schema-checked in CI
|
|
870
|
+
dotfiles_version = "0.2.521"
|
|
280
871
|
|
|
281
|
-
|
|
872
|
+
[features]
|
|
873
|
+
alias_wrapper = false # confirm destructive aliases
|
|
874
|
+
dms = true # Dank Material Shell theming for GNOME
|
|
875
|
+
zellij = false
|
|
876
|
+
linux_desktop = false # niri, waybar, fuzzel, mako, foot, kanshi follow it
|
|
282
877
|
|
|
283
|
-
|
|
284
|
-
|
|
878
|
+
[tools]
|
|
879
|
+
node_manager = "mise" # mise | fnm | nvm
|
|
880
|
+
|
|
881
|
+
[secrets.policy]
|
|
882
|
+
provider = "auto" # auto | macos-keychain | pass | plain-enc
|
|
883
|
+
auto_load = true
|
|
884
|
+
```
|
|
285
885
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
- **Neovim** ships as a full Lua-based editor, not a starter template
|
|
290
|
-
- **Lazygit** for terminal git workflow without a GUI
|
|
291
|
-
- **Build caches** (Cargo, Go, pip, uv, Zig) redirect to `/tmp/builds/` and clear on reboot
|
|
292
|
-
- **`_cached_eval`** caches expensive `tool init` output with mtime and realpath invalidation. Set `EVALCACHE_DISABLE=true` to bypass for debugging
|
|
886
|
+
Typos in a flag or profile name fail the `Lint / Chezmoidata Schema`
|
|
887
|
+
job before merge
|
|
888
|
+
([`config/chezmoidata.schema.json`](config/chezmoidata.schema.json)).
|
|
293
889
|
|
|
294
890
|
</details>
|
|
295
891
|
|
|
296
892
|
<details>
|
|
297
|
-
<summary><b>
|
|
893
|
+
<summary><b>Per-machine overrides (<code>~/.config/chezmoi/chezmoi.toml</code>)</b></summary>
|
|
894
|
+
|
|
895
|
+
```toml
|
|
896
|
+
[data]
|
|
897
|
+
profile = "laptop" # laptop | minimal | server
|
|
898
|
+
machine = "work-macbook"
|
|
899
|
+
default_shell = "zsh"
|
|
900
|
+
|
|
901
|
+
[data.features]
|
|
902
|
+
linux_desktop = false
|
|
903
|
+
```
|
|
298
904
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
- **AI commit messages** (`dot commit`) — conventional commits generated from the staged diff
|
|
303
|
-
- **AI fleet cockpit** (`dot ai`) — install and run Codex, Copilot, Antigravity, Aider, OpenCode, and friends from one Bubble Tea TUI; `dot ai serve` serves your Claude subscription locally to any Anthropic/OpenAI-protocol tool. See [docs/AI.md](docs/AI.md)
|
|
304
|
-
- **Attestation logs** — every agent session is logged with a policy hash and an outcome
|
|
905
|
+
Hardware presets (`macbook-t2`, `surface-pro`) live under
|
|
906
|
+
`defaults/.chezmoidata/` and are selected through the `t2` /
|
|
907
|
+
`surface` flags. Run `dot sync` after editing.
|
|
305
908
|
|
|
306
909
|
</details>
|
|
307
910
|
|
|
308
911
|
<details>
|
|
309
|
-
<summary><b>
|
|
912
|
+
<summary><b>Session flags</b></summary>
|
|
913
|
+
|
|
914
|
+
| Variable | Default | Effect |
|
|
915
|
+
|---|---|---|
|
|
916
|
+
| `DOTFILES_FAST=1` | 0 | Skip heavy layers (zinit, completions) |
|
|
917
|
+
| `DOTFILES_ULTRA_FAST=1` | 0 | Bare minimum shell (aliases + prompt) |
|
|
918
|
+
| `DOTFILES_AI=1` | 0 | Enable AI helper scripts |
|
|
919
|
+
| `DOTFILES_PROFILE=custom` | laptop | Override the profile for one session |
|
|
920
|
+
| `DOTFILES_NONINTERACTIVE=1` | unset | Skip prompts (CI) |
|
|
921
|
+
| `DOTFILES_SILENT=1` | unset | Suppress non-error output |
|
|
922
|
+
| `DOTFILES_SOURCE_DIR` | `~/.dotfiles` | Override the source directory |
|
|
923
|
+
| `DOTFILES_CACHE_DIR` | `~/.cache/dotfiles` | Override the cache location |
|
|
924
|
+
| `DOTFILES_WALLPAPER_DIR` | `~/Pictures/Wallpapers` | Custom wallpaper directory |
|
|
925
|
+
| `DOTFILES_DEBUG=1` | unset | Print shell-init timing to stderr |
|
|
926
|
+
|
|
927
|
+
The complete list is
|
|
928
|
+
[`docs/manual/03-reference/03-environment.md`](docs/manual/03-reference/03-environment.md);
|
|
929
|
+
the strategy for choosing chezmoi data over Nix over runtime flags is
|
|
930
|
+
[`docs/CONFIG_STRATEGY.md`](docs/CONFIG_STRATEGY.md).
|
|
931
|
+
|
|
932
|
+
</details>
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
## Examples
|
|
310
937
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
938
|
+
Run all examples (each one is bounded by a 60 s timeout and executed
|
|
939
|
+
in CI by the `Examples Contract` job):
|
|
940
|
+
|
|
941
|
+
```bash
|
|
942
|
+
make examples
|
|
943
|
+
```
|
|
944
|
+
|
|
945
|
+
<details>
|
|
946
|
+
<summary><b>All examples</b></summary>
|
|
947
|
+
|
|
948
|
+
| Category | Example | Purpose |
|
|
949
|
+
| :--- | :--- | :--- |
|
|
950
|
+
| **CLI** | `example-dot-commands` | `dot` CLI command modules |
|
|
951
|
+
| | `example-command-reference` | Complete `dot` command reference, one usage line per public command |
|
|
952
|
+
| | `example-cli-utilities` | CLI utility scripts deployed to `~/.local/bin` |
|
|
953
|
+
| | `example-functions` | Shell function library categories |
|
|
954
|
+
| **Operations** | `example-install-uninstall` | Installation and uninstall scripts |
|
|
955
|
+
| | `example-ops` | Operations and maintenance scripts |
|
|
956
|
+
| | `example-diagnostics` | Diagnostics and health-check utilities |
|
|
957
|
+
| | `example-platform-contract` | `lib/dot/platform.sh`: platform id, host OS, the portability contract |
|
|
958
|
+
| | `example-fleet` | Fleet management (multi-machine dotfiles operations) |
|
|
959
|
+
| **Themes** | `example-theme` | Theme and wallpaper engine |
|
|
960
|
+
| **Security** | `example-secrets` | Encrypted secrets (age) management |
|
|
961
|
+
| | `example-security` | Security operations and hardening scripts |
|
|
962
|
+
| | `example-git-hooks` | The hook installer and the pre-push reliability gate |
|
|
963
|
+
| **AI** | `example-ai-patterns` | The `dot ai` fleet: command surface, steering styles, gateway |
|
|
964
|
+
| **Quality** | `example-test-suite` | Running the unit and integration suites |
|
|
965
|
+
| | `example-testing-framework` | Testing framework capabilities: assertions and mocks |
|
|
966
|
+
| | `example-coverage-gate` | The module coverage gate |
|
|
967
|
+
| | `example-qa` | Quality assurance and validation scripts |
|
|
968
|
+
| **Packaging** | `mise-plugin-dot/` | A mise plugin that installs `dot` |
|
|
319
969
|
|
|
320
970
|
</details>
|
|
321
971
|
|
|
322
|
-
|
|
972
|
+
---
|
|
973
|
+
|
|
974
|
+
## When not to use .dotfiles
|
|
975
|
+
|
|
976
|
+
A few cases where another tool fits better, listed because the
|
|
977
|
+
short answer is "we don't do that" rather than because of a
|
|
978
|
+
disagreement on priorities.
|
|
979
|
+
|
|
980
|
+
- **You want a dependency-free shell config.** The default profile
|
|
981
|
+
brings chezmoi, mise, starship, zoxide, atuin, fzf, and a Go
|
|
982
|
+
toolchain for the TUI satellites. `profile = "minimal"` and
|
|
983
|
+
`DOTFILES_ULTRA_FAST=1` cut that down, but the framework assumes
|
|
984
|
+
it may install things. A single `.zshrc` is lighter.
|
|
985
|
+
|
|
986
|
+
- **You need full parity on nushell.** Nushell is Tier 3: simple
|
|
987
|
+
aliases plus bash-delegated functions, under 5% of the zsh feature
|
|
988
|
+
set, kept deliberately as a reference target
|
|
989
|
+
([ADR-011](docs/adr/ADR-011-nushell-tier3-keep.md)).
|
|
990
|
+
|
|
991
|
+
- **You need Windows without WSL to be first-class.** The native
|
|
992
|
+
`dot.ps1` covers the daily workflow (apply, status, doctor, mise,
|
|
993
|
+
agents, fleet status); themes, `heal`, and most diagnostics still
|
|
994
|
+
need bash. Windows CI verifies the PowerShell surface, not the
|
|
995
|
+
whole CLI.
|
|
996
|
+
|
|
997
|
+
- **You are on Fedora or Arch and need CI-backed support.** Both
|
|
998
|
+
are community-supported: the code is expected to work, but the
|
|
999
|
+
matrix runs Ubuntu, macOS (Intel and Apple Silicon), and Windows
|
|
1000
|
+
([`docs/reference/SUPPORT_MATRIX.md`](docs/reference/SUPPORT_MATRIX.md)).
|
|
1001
|
+
|
|
1002
|
+
- **You do not want `apply` to run scripts.** Provisioning hooks
|
|
1003
|
+
under `install/provision/` (`run_onchange_*`) install packages,
|
|
1004
|
+
fonts, and tmux plugins when their source changes. They are
|
|
1005
|
+
idempotent and previewable with `dot sync --check`, but they are
|
|
1006
|
+
scripts running as you.
|
|
1007
|
+
|
|
1008
|
+
- **You need a second reviewer on every merge.** This is a
|
|
1009
|
+
single-maintainer project gated by CI, DCO, and signed commits,
|
|
1010
|
+
not by code review; the Scorecard `Code-Review` check says so.
|
|
1011
|
+
|
|
1012
|
+
If you hit a case that should be on this list, please open an issue;
|
|
1013
|
+
that is how it gets fixed or moved into the supported set.
|
|
323
1014
|
|
|
324
1015
|
---
|
|
325
1016
|
|
|
326
|
-
##
|
|
1017
|
+
## Development
|
|
327
1018
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
1019
|
+
```bash
|
|
1020
|
+
make # reliability audit: syntax, unit, module coverage, examples, docs + traceability coverage
|
|
1021
|
+
make test-quick # the same, quick mode
|
|
1022
|
+
make test-unit # unit only
|
|
1023
|
+
make test-integration # with integration suites
|
|
1024
|
+
make examples # run every example under a timeout
|
|
1025
|
+
make install # stage the dot CLI under $(DESTDIR)$(PREFIX) (default /usr/local)
|
|
1026
|
+
make uninstall
|
|
1027
|
+
|
|
1028
|
+
./tests/framework/test_runner.sh --jobs auto # unit suite, parallel
|
|
1029
|
+
bash tests/snapshots/test_snapshots.sh # golden CLI output
|
|
1030
|
+
bash fuzz/install/fuzz_install.sh # install.sh under adversarial input
|
|
1031
|
+
bash tools/docs/generate-command-index.sh --check
|
|
1032
|
+
bash scripts/verify-release-versions
|
|
1033
|
+
```
|
|
340
1034
|
|
|
341
|
-
|
|
1035
|
+
Toolchain setup, the task map, and how to reproduce every CI gate
|
|
1036
|
+
locally are in [`DEVELOPMENT.md`](DEVELOPMENT.md) and
|
|
1037
|
+
[`docs/operations/TESTING.md`](docs/operations/TESTING.md). Commit signing,
|
|
1038
|
+
the DCO trailer, branch names, and the regression-test convention
|
|
1039
|
+
are in [`CONTRIBUTING.md`](CONTRIBUTING.md). A
|
|
1040
|
+
[devcontainer](.devcontainer/devcontainer.json) boots to a working
|
|
1041
|
+
`make` for Codespaces.
|
|
1042
|
+
|
|
1043
|
+
### Fuzzing
|
|
1044
|
+
|
|
1045
|
+
Two native Go fuzz harnesses ship under
|
|
1046
|
+
[`fuzz/`](fuzz/) for the
|
|
1047
|
+
user-input surfaces that were ported out of the shell so they could
|
|
1048
|
+
be fuzzed at all: `FuzzValidateName` (the name validator behind
|
|
1049
|
+
`lib/dot/utils.sh`) and `FuzzInitURLResolver` (the URL resolver
|
|
1050
|
+
behind `dot init`). A third harness,
|
|
1051
|
+
[`fuzz/install/fuzz_install.sh`](fuzz/install/fuzz_install.sh), drives
|
|
1052
|
+
`install.sh` itself with unknown flags, garbage positionals, symlink
|
|
1053
|
+
loops in `$HOME`, an empty `PATH`, 4 KB arguments, and NUL bytes in
|
|
1054
|
+
the environment, and asserts every case exits cleanly or fails fast
|
|
1055
|
+
but never hangs. It has already found two real bugs (a missing `-h`
|
|
1056
|
+
alias; unknown positionals triggering a 30 s network fetch).
|
|
1057
|
+
|
|
1058
|
+
- [`fuzz.yml`](.github/workflows/fuzz.yml) runs each Go harness for
|
|
1059
|
+
60 s on every push to `main` and on every PR touching the parsing
|
|
1060
|
+
surfaces. Go replays the committed seed corpus under
|
|
1061
|
+
`testdata/fuzz/` before exploring, so a fixed crash cannot
|
|
1062
|
+
silently return.
|
|
1063
|
+
- [`cflite_pr.yml`](.github/workflows/cflite_pr.yml) runs
|
|
1064
|
+
ClusterFuzzLite in code-change mode (120 s, AddressSanitizer,
|
|
1065
|
+
SARIF upload) on PRs touching the harnesses or
|
|
1066
|
+
[`.clusterfuzzlite/`](.clusterfuzzlite/build.sh).
|
|
1067
|
+
- [`install-fuzz.yml`](.github/workflows/install-fuzz.yml) runs the
|
|
1068
|
+
`install.sh` harness weekly on Ubuntu and macOS, and on every PR
|
|
1069
|
+
touching `install.sh`; a scheduled failure opens a tracking issue.
|
|
1070
|
+
- **OSS-Fuzz:** the project definition is ready in
|
|
1071
|
+
[`fuzz/oss-fuzz/`](fuzz/oss-fuzz/project.yaml)
|
|
1072
|
+
(libFuzzer, ASan + UBSan, x86_64); the upstream submission to
|
|
1073
|
+
`google/oss-fuzz` has not been filed yet.
|
|
1074
|
+
|
|
1075
|
+
```bash
|
|
1076
|
+
cd fuzz
|
|
1077
|
+
go test -run TestNothing -fuzz='^FuzzValidateName$' -fuzztime=60s ./...
|
|
1078
|
+
go test -run TestNothing -fuzz='^FuzzInitURLResolver$' -fuzztime=60s ./...
|
|
1079
|
+
```
|
|
1080
|
+
|
|
1081
|
+
The harness layout and the OSS-Fuzz submission steps are in
|
|
1082
|
+
[`docs/security/FUZZING.md`](docs/security/FUZZING.md); the shared
|
|
1083
|
+
corpus lives beside the harnesses under
|
|
1084
|
+
[`fuzz/testdata/`](fuzz/testdata/).
|
|
1085
|
+
|
|
1086
|
+
### Hardening gates in place of Miri
|
|
1087
|
+
|
|
1088
|
+
- **ShellCheck at severity `error` is a hard gate** on every push
|
|
1089
|
+
(`reusable-shell-lint.yml`, `fail_on_shellcheck: true`), with
|
|
1090
|
+
`shfmt` formatting checked alongside; the same hooks run in
|
|
1091
|
+
pre-commit. Fish and Nushell configs have their own lint jobs.
|
|
1092
|
+
- **Coverage by `xtrace`, not kcov.** `tools/ci/run-coverage.sh`
|
|
1093
|
+
turns on `set -x` through `BASH_ENV` in every bash process the
|
|
1094
|
+
suite spawns and aggregates the lines that executed. The floor is
|
|
1095
|
+
**58%** and rises with each slice; the measured history is in the
|
|
1096
|
+
workflow file. A separate 100% *module-mapping* floor
|
|
1097
|
+
(`tests/framework/module_coverage.sh`) fails the build when an
|
|
1098
|
+
executable module has no test file at all.
|
|
1099
|
+
- **Reliability Gate** runs the audit on `ubuntu-latest`,
|
|
1100
|
+
`macos-latest` (Intel), and `macos-14` (Apple Silicon), then the
|
|
1101
|
+
examples contract, the WSL contract, and the PowerShell contract
|
|
1102
|
+
([`docs/operations/RELIABILITY.md`](docs/operations/RELIABILITY.md)).
|
|
1103
|
+
- **Cross-platform portability scan** rejects GNU-only `sed`,
|
|
1104
|
+
`grep`, and `date` idioms and runs the critical scripts on each OS
|
|
1105
|
+
([`cross-platform-test.yml`](.github/workflows/cross-platform-test.yml)).
|
|
1106
|
+
- **Generators cannot drift:** the command index is regenerated
|
|
1107
|
+
from `dot help all` and diffed; eight version surfaces
|
|
1108
|
+
(`package.json`, `bin/dot` twice, the man page, `lib/dot/bento.sh`,
|
|
1109
|
+
this README's badge, `CLAUDE.md`, [`AGENTS.md`](AGENTS.md)) are checked against
|
|
1110
|
+
`.chezmoidata.toml`; `.chezmoidata.toml` itself is validated
|
|
1111
|
+
against its JSON Schema. `dot agents check` does the same for the
|
|
1112
|
+
AI-harness stubs locally.
|
|
1113
|
+
- **Golden snapshots** pin the user-facing text of `dot --help`,
|
|
1114
|
+
`dot version`, `dot doctor`, `dot perf`, and `dot health` after
|
|
1115
|
+
scrubbing paths, timings, and colours.
|
|
1116
|
+
|
|
1117
|
+
### CI
|
|
1118
|
+
|
|
1119
|
+
| Workflow | Trigger | Purpose |
|
|
1120
|
+
| :--- | :--- | :--- |
|
|
1121
|
+
| `ci.yml` | push, PR, schedule | Shell / Lua / Fish / Nushell / copyright lint, chezmoidata schema, secrets scan, dependency audit, TruffleHog, SBOM + Grype, link check, tests on Linux, macOS, Windows, Docker |
|
|
1122
|
+
| `ci-enforced.yml` | push, PR | The stricter enforced gate reusing the shared lint and test-suite workflows |
|
|
1123
|
+
| `reliability-gate.yml` | push, PR | Reliability audit on three runners + examples, WSL, PowerShell contracts |
|
|
1124
|
+
| `coverage.yml` | push, PR | xtrace line coverage with the 58% floor and delta gate |
|
|
1125
|
+
| `cross-platform-test.yml` | push, PR | Portability scan and runtime checks per OS |
|
|
1126
|
+
| `dot-cli-bench.yml` / `perf-baseline.yml` | push, PR / weekly + `feat/**` | Cold-start budget; shell-startup baseline and regression issues |
|
|
1127
|
+
| `fuzz.yml` / `cflite_pr.yml` / `install-fuzz.yml` | push, PR / PR / weekly + PR | Go harnesses; ClusterFuzzLite; `install.sh` fuzz |
|
|
1128
|
+
| `doc-drift.yml` | push, PR | Command index and version-consistency generators |
|
|
1129
|
+
| `dco.yml` / `pr-signature.yml` / `verify-tag-signature.yml` | PR / PR / tag | DCO trailer, signed PR commits, signed annotated tags |
|
|
1130
|
+
| `scorecard.yml` / `codeql.yml` / `dependency-review.yml` / `security-enhanced.yml` / `deps-dev-validation.yml` | weekly / push, PR | OpenSSF Scorecard, CodeQL, dependency review (`fail-on-severity: high`), Checkov, deps.dev validation |
|
|
1131
|
+
| `release-package-dot.yml` / `security-release.yml` | release | `dot-<v>.tar.gz` + `.zip` with SLSA provenance; SPDX SBOM, Cosign signature, unified `ALL_SHA256SUMS` manifest |
|
|
1132
|
+
| `release-install-smoke.yml` / `release-distribute-*.yml` | release | Clean-install smoke on Ubuntu + macOS; Homebrew, Scoop, AUR fan-out |
|
|
1133
|
+
| `npm-publish.yml` / `manual-publish.yml` / `pages.yml` | release, push | npm via OIDC trusted publishing; the manual in nine formats; the site |
|
|
1134
|
+
|
|
1135
|
+
53 workflows in total; the cadence and the composite actions are
|
|
1136
|
+
documented in
|
|
1137
|
+
[`docs/operations/CI_CADENCE.md`](docs/operations/CI_CADENCE.md) and
|
|
1138
|
+
[`docs/operations/CI_COMPOSITES.md`](docs/operations/CI_COMPOSITES.md).
|
|
342
1139
|
|
|
343
1140
|
---
|
|
344
1141
|
|
|
345
|
-
|
|
346
|
-
|
|
1142
|
+
## Security
|
|
1143
|
+
|
|
1144
|
+
**Reporting:** never open a public issue for a vulnerability — use
|
|
1145
|
+
[GitHub Security Advisories](https://github.com/sebastienrousseau/dotfiles/security/advisories)
|
|
1146
|
+
or <security@sebastienrousseau.com>; see
|
|
1147
|
+
[`SECURITY.md`](SECURITY.md) for the response SLA (Critical: 24 h
|
|
1148
|
+
initial response, 48 h target; High: 72 h / 7 days; Medium: 5 / 30
|
|
1149
|
+
business days; Low: 10 / 90), the supported-version table, and the
|
|
1150
|
+
GPG key for encrypted reports
|
|
1151
|
+
([`docs/security/DISCLOSURE.md`](docs/security/DISCLOSURE.md),
|
|
1152
|
+
[`docs/security/KEYS.md`](docs/security/KEYS.md)).
|
|
1153
|
+
|
|
1154
|
+
A dotfiles framework is code that runs as you, on every login, on
|
|
1155
|
+
every machine you own. The posture below closes the vectors that
|
|
1156
|
+
matter for that shape — remote script execution, secrets at rest,
|
|
1157
|
+
agents with shell access, and the pipeline that ships it — at the
|
|
1158
|
+
architectural level, not behind opt-in flags. The full analysis is
|
|
1159
|
+
[`docs/security/THREAT_MODEL.md`](docs/security/THREAT_MODEL.md).
|
|
1160
|
+
|
|
1161
|
+
### Installer and remote-execution controls
|
|
1162
|
+
|
|
1163
|
+
- **No unverified download runs.** `install.sh` fetches `chezmoi`
|
|
1164
|
+
through `tools/ci/install-chezmoi-verified.sh`, which downloads the
|
|
1165
|
+
release tarball *and* the upstream checksum file and refuses on
|
|
1166
|
+
mismatch. Where that helper is unavailable, the fallback still
|
|
1167
|
+
requires the installer to be under 100 KiB and to begin with
|
|
1168
|
+
`#!/`.
|
|
1169
|
+
- **Every third-party installer the framework can execute is
|
|
1170
|
+
allowlisted by SHA-256** in
|
|
1171
|
+
[`security/remote-installers.sha256`](security/remote-installers.sha256)
|
|
1172
|
+
(Claude, Kimi, Goose, Antigravity, xAI, and the rest). CI rejects
|
|
1173
|
+
any `curl | sh` that bypasses the verifier.
|
|
1174
|
+
- **Size and structure limits.** `lib/dot/verified-download.sh` caps
|
|
1175
|
+
scripts at 512 KiB and archives at 100 MiB by default, caps
|
|
1176
|
+
checksum manifests at 2 MiB, and fails closed on empty files;
|
|
1177
|
+
registry archives are rejected when they contain path traversal
|
|
1178
|
+
or link entries. Fonts, distro signing keys, and binary archives
|
|
1179
|
+
go through the same path.
|
|
1180
|
+
- **`dot init` is HTTPS-only**, refuses to overwrite an existing
|
|
1181
|
+
source directory without `--force`, and prints the source URL it
|
|
1182
|
+
is about to run scripts from.
|
|
1183
|
+
- **Self-healing never fetches mutable URLs.** Tool recovery uses
|
|
1184
|
+
exact mise / aqua pins with checksums.
|
|
1185
|
+
|
|
1186
|
+
### Secrets
|
|
1187
|
+
|
|
1188
|
+
- `dot secrets` selects a provider by policy — macOS Keychain,
|
|
1189
|
+
`pass`, or an age-encrypted local store — and loads buckets into
|
|
1190
|
+
the environment on demand (`eval "$(dot secrets load ai)"`), so
|
|
1191
|
+
keys are never in plaintext files or shell history.
|
|
1192
|
+
- age and SOPS encrypt chezmoi-managed secret files at rest;
|
|
1193
|
+
`dot secrets-init` bootstraps the key, `dot ssh-key` encrypts an
|
|
1194
|
+
SSH key locally, `dot ssh-cert` manages short-lived certificates.
|
|
1195
|
+
- `dot secret-audit` audits hygiene and leakage surface on the
|
|
1196
|
+
workstation; gitleaks, detect-secrets, and TruffleHog run on every
|
|
1197
|
+
push and in pre-commit; the history-filtering procedure is written
|
|
1198
|
+
down in
|
|
1199
|
+
[`docs/security/HISTORY_FILTERING.md`](docs/security/HISTORY_FILTERING.md).
|
|
1200
|
+
|
|
1201
|
+
### Agents and MCP
|
|
1202
|
+
|
|
1203
|
+
- Every agent runs under a bounded profile (`ask` / `plan` /
|
|
1204
|
+
`apply` / `audit`) with checkpoints and a session audit log;
|
|
1205
|
+
`dot fleet enforce strict` turns the profile RBAC from advisory
|
|
1206
|
+
into enforced.
|
|
1207
|
+
- MCP servers must appear in `mcp-policy.json` and pass
|
|
1208
|
+
`dot mcp doctor` (policy, supply chain, config) before use.
|
|
1209
|
+
- `dot attest` records the workstation state with the policy hash so
|
|
1210
|
+
an audit can check what an agent was allowed to do when it ran.
|
|
1211
|
+
|
|
1212
|
+
### Supply chain
|
|
1213
|
+
|
|
1214
|
+
- **Every third-party GitHub Action is pinned to a commit SHA**, and
|
|
1215
|
+
the pins are linted (`Lint / Reusable Workflow Pins`). The one
|
|
1216
|
+
tag reference is the SLSA generator reusable workflow, which its
|
|
1217
|
+
maintainers require to be referenced by release tag
|
|
1218
|
+
([`docs/security/CI_PINNING.md`](docs/security/CI_PINNING.md)).
|
|
1219
|
+
- **Harden Runner in all 53 workflows**, six jobs in egress-block
|
|
1220
|
+
mode with an explicit endpoint list
|
|
1221
|
+
([`docs/security/CI_EGRESS_ALLOWLIST.md`](docs/security/CI_EGRESS_ALLOWLIST.md)).
|
|
1222
|
+
- **Releases carry provenance:** SLSA L3 build attestation on the
|
|
1223
|
+
`dot` archive (`gh attestation verify`), an SPDX SBOM signed with
|
|
1224
|
+
Cosign keyless (Fulcio + Rekor), and one signed `ALL_SHA256SUMS`
|
|
1225
|
+
manifest covering every asset; the verification recipe is
|
|
1226
|
+
[`docs/security/VERIFY_RELEASE.md`](docs/security/VERIFY_RELEASE.md).
|
|
1227
|
+
- **Signed everything:** SSH ed25519 commit signatures enforced on
|
|
1228
|
+
`main`, signed annotated tags verified by workflow, DCO and PR
|
|
1229
|
+
signature checks required, GPG key published over WKD and checked
|
|
1230
|
+
weekly (`verify-gpg-wkd.yml`).
|
|
1231
|
+
- **npm via OIDC trusted publishing** with provenance attached, no
|
|
1232
|
+
long-lived token.
|
|
1233
|
+
- **Scans on every push:** dependency review (`fail-on-severity:
|
|
1234
|
+
high`), CodeQL, Checkov, Grype against the SBOM, Dependabot with
|
|
1235
|
+
grouped updates; OpenSSF Scorecard weekly with the snapshot
|
|
1236
|
+
committed to [`docs/security/SCORECARD.md`](docs/security/SCORECARD.md).
|
|
1237
|
+
- **SPDX headers** on source files, checked by the copyright lint
|
|
1238
|
+
job.
|
|
1239
|
+
|
|
1240
|
+
### Notes
|
|
1241
|
+
|
|
1242
|
+
- Template injection is a real surface for a chezmoi tree: `.tmpl`
|
|
1243
|
+
files render with chezmoi data before deployment, so
|
|
1244
|
+
`.chezmoidata.toml` is schema-validated and the trust boundary is
|
|
1245
|
+
documented per surface in the threat model.
|
|
1246
|
+
- `_cached_eval` output files under `~/.cache/shell/` are sourced on
|
|
1247
|
+
startup; the cache key includes the tool binary's mtime and
|
|
1248
|
+
realpath so a swapped binary invalidates its cache.
|
|
1249
|
+
|
|
1250
|
+
---
|
|
1251
|
+
|
|
1252
|
+
## Documentation
|
|
1253
|
+
|
|
1254
|
+
The four entry points, identical across every repo in the family:
|
|
1255
|
+
|
|
1256
|
+
- **[User Manual](https://doc.dotfiles.io/)** — the rendered book:
|
|
1257
|
+
concepts, tutorials, reference, cookbook, appendices; also
|
|
1258
|
+
`dot manual`, `dot manual pdf`, `dot manual text | less`, and
|
|
1259
|
+
`dot manual --offline` from the bundled snapshot
|
|
1260
|
+
- **[Command reference](docs/manual/command-index.md)** — every
|
|
1261
|
+
`dot` subcommand, generated from `dot help all`; `man dot` after
|
|
1262
|
+
install
|
|
1263
|
+
- **[Developer docs](DEVELOPMENT.md)** — toolchain, task map,
|
|
1264
|
+
reproducing every CI gate locally
|
|
1265
|
+
- **[Family map](docs/ECOSYSTEM.md)** — what lives in-repo, the
|
|
1266
|
+
component that owns it, and where to make which change
|
|
1267
|
+
|
|
1268
|
+
The manual is published in nine formats (single- and multi-page
|
|
1269
|
+
HTML, PDF, EPUB, ASCII text, compressed variants, Markdown source)
|
|
1270
|
+
and rebuilds on every change from [`docs/manual/`](docs/manual/).
|
|
1271
|
+
|
|
1272
|
+
| Document | Covers |
|
|
1273
|
+
|---|---|
|
|
1274
|
+
| [`docs/STRUCTURE.md`](docs/STRUCTURE.md) | Every top-level path, the chezmoi naming contract, where to make which change. |
|
|
1275
|
+
| [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | Startup strategies, `_cached_eval`, lazy hydration, artifact and ultra-fast modes. |
|
|
1276
|
+
| [`docs/adr/`](docs/adr/README.md) | Twelve decision records: CI/CD, shell performance, security-first, CLI architecture, chezmoi, shell selection, multi-shell parity, aliases, wallpaper theming, transient prompt, nushell tier, AI local proxy. |
|
|
1277
|
+
| [`docs/reference/`](docs/reference/) | Aliases, feature flags, fonts, PowerShell parity, profiles, scripts, support matrix, themes, tools, `dot` utilities. |
|
|
1278
|
+
| [`docs/security/`](docs/security/README.md) | Threat model, install verification, fuzzing, secrets, encryption, MCP policy, commit signing, CI pinning, egress allowlist, key rotation, release verification, Scorecard, compliance, incident response. |
|
|
1279
|
+
| [`docs/operations/`](docs/operations/OPERATIONS.md) | Release pipeline, version sync, performance, reliability, coverage, drift, registry, attestation, CI cadence, migration between versions. |
|
|
1280
|
+
| [`docs/guides/`](docs/guides/INSTALL.md) | Install, theming, Neovim IDE, troubleshooting, WSL2 + Nix. |
|
|
1281
|
+
| [`docs/packaging.md`](docs/packaging.md) | For distro maintainers: licence grant, toolchain floors, dependency pin model, offline build/test, signature verification. |
|
|
1282
|
+
| [`SECURITY.md`](SECURITY.md) · [`GOVERNANCE.md`](GOVERNANCE.md) · [`CONTRIBUTING.md`](CONTRIBUTING.md) · [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) | Reporting, decision model, contribution workflow, community expectations. |
|
|
1283
|
+
| [`CHANGELOG.md`](CHANGELOG.md) | Per-release notes. **The complete record** — every release appears here. |
|
|
1284
|
+
| [`AGENTS.md`](AGENTS.md) / [`CLAUDE.md`](CLAUDE.md) | Invariants for AI-assisted contributors; `CLAUDE.md` is canonical, `AGENTS.md` is rendered from it. |
|
|
347
1285
|
|
|
348
1286
|
---
|
|
349
1287
|
|
|
1288
|
+
## Acknowledgements
|
|
1289
|
+
|
|
1290
|
+
This framework stands on tools whose maintainers did the hard part:
|
|
1291
|
+
[chezmoi](https://github.com/twpayne/chezmoi) for the source-tree
|
|
1292
|
+
model that makes every `apply` reproducible, [mise](https://mise.jdx.dev)
|
|
1293
|
+
and [Nix](https://nixos.org) for toolchains that survive a reinstall,
|
|
1294
|
+
[age](https://age-encryption.org) and [SOPS](https://github.com/getsops/sops)
|
|
1295
|
+
for secrets that stay encrypted, and the Charmbracelet libraries
|
|
1296
|
+
behind the Go satellites. The security posture leans on
|
|
1297
|
+
[Sigstore](https://www.sigstore.dev), [SLSA](https://slsa.dev),
|
|
1298
|
+
[OpenSSF Scorecard](https://scorecard.dev), and
|
|
1299
|
+
[StepSecurity Harden Runner](https://github.com/step-security/harden-runner).
|
|
1300
|
+
|
|
1301
|
+
Bug reports with a reproduction and a failing test are the most
|
|
1302
|
+
useful contribution this project receives; the regression-test
|
|
1303
|
+
convention in [`CONTRIBUTING.md`](CONTRIBUTING.md) exists so that
|
|
1304
|
+
every one of them stays fixed.
|
|
1305
|
+
|
|
1306
|
+
## Stability guarantees
|
|
1307
|
+
|
|
1308
|
+
- **Versioning.** [SemVer](https://semver.org) with
|
|
1309
|
+
`defaults/.chezmoidata.toml` as the source of truth, mirrored to
|
|
1310
|
+
eight surfaces by `scripts/version-sync.sh` and checked in CI.
|
|
1311
|
+
During the `0.2.x` series every release is a patch bump; a change
|
|
1312
|
+
that breaks an existing machine (a renamed command, a moved
|
|
1313
|
+
managed path, a changed flag default) is called out in its
|
|
1314
|
+
`CHANGELOG.md` entry and, where relevant, in
|
|
1315
|
+
[`docs/operations/MIGRATION.md`](docs/operations/MIGRATION.md)
|
|
1316
|
+
with a migration or rollback script under `install/migrate/`
|
|
1317
|
+
([`GOVERNANCE.md`](GOVERNANCE.md)).
|
|
1318
|
+
|
|
1319
|
+
- **Output stability.** For a tool that generates files, output *is*
|
|
1320
|
+
API. Machine-readable outputs carry a schema version —
|
|
1321
|
+
`dot env emit` conforms to
|
|
1322
|
+
[`docs/schema/dot-env-v1.json`](docs/schema/dot-env-v1.json), the
|
|
1323
|
+
registry index to
|
|
1324
|
+
[`docs/schema/dot-registry-v1.json`](docs/schema/dot-registry-v1.json) —
|
|
1325
|
+
and a change to their shape is a new schema version, not an edit
|
|
1326
|
+
to `v1`. Generated artefacts that other tools consume
|
|
1327
|
+
(`themes.toml`, shell completions, [`AGENTS.md`](AGENTS.md) and the harness
|
|
1328
|
+
stubs, the command index) are produced by generators whose output
|
|
1329
|
+
is diffed in CI; a behavioural change to what a generator emits is
|
|
1330
|
+
treated as breaking and recorded in the changelog even when no
|
|
1331
|
+
command-line flag moves. The human-facing text of `dot --help`,
|
|
1332
|
+
`version`, `doctor`, `perf`, and `health` is pinned by golden
|
|
1333
|
+
snapshots and changes only with a deliberate snapshot update in
|
|
1334
|
+
the same commit.
|
|
1335
|
+
|
|
1336
|
+
- **Minimum toolchain.** Raised only with the reason recorded in the
|
|
1337
|
+
`CHANGELOG.md` entry, never silently — policy, version axis, and
|
|
1338
|
+
history in
|
|
1339
|
+
[`docs/MINIMUM-TOOLCHAIN.md`](docs/MINIMUM-TOOLCHAIN.md).
|
|
1340
|
+
|
|
1341
|
+
- **Deprecations** are announced before removal with the removal
|
|
1342
|
+
release named up front:
|
|
1343
|
+
[`docs/reference/ALIASES_DEPRECATIONS.md`](docs/reference/ALIASES_DEPRECATIONS.md)
|
|
1344
|
+
records each deprecated alias, its replacement, and its `Remove In`
|
|
1345
|
+
version, and `dot aliases why <alias>` reports the same from the
|
|
1346
|
+
CLI. The deprecation window is the span between the release that
|
|
1347
|
+
adds the row and the release named in `Remove In`.
|
|
1348
|
+
|
|
350
1349
|
## License
|
|
351
1350
|
|
|
352
|
-
|
|
1351
|
+
Dual-licensed under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) or [MIT](https://opensource.org/licenses/MIT), at your option. See [`LICENSE-APACHE`](LICENSE-APACHE) and [`LICENSE-MIT`](LICENSE-MIT).
|
|
1352
|
+
|
|
1353
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
1354
|
+
|
|
1355
|
+
---
|
|
1356
|
+
|
|
1357
|
+
**THE ARCHITECT** ᛫ [Sebastien Rousseau](https://sebastienrousseau.com)
|
|
1358
|
+
**THE ENGINE** ᛞ [EUXIS](https://github.com/sebastienrousseau/euxis) ᛫ Enterprise Unified Execution Intelligence System
|
|
353
1359
|
|
|
354
|
-
<p align="right"><a href="#
|
|
1360
|
+
<p align="right"><a href="#contents">Back to Top</a></p>
|