@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.
Files changed (306) hide show
  1. package/CHANGELOG.md +200 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/{LICENSE → LICENSE-MIT} +1 -1
  4. package/README.md +1172 -166
  5. package/install.sh +77 -11
  6. package/package.json +8 -8
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/CNAME +0 -1
  12. package/docs/CONFIG_STRATEGY.md +0 -124
  13. package/docs/COPYRIGHT +0 -7
  14. package/docs/GOVERNANCE.md +0 -98
  15. package/docs/MAINTAINERS.md +0 -41
  16. package/docs/NAMING_CONVENTIONS.md +0 -102
  17. package/docs/OPENCODE.md +0 -127
  18. package/docs/README.md +0 -84
  19. package/docs/STRUCTURE.md +0 -102
  20. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  21. package/docs/adr/ADR-002-shell-performance.md +0 -130
  22. package/docs/adr/ADR-003-security-first.md +0 -158
  23. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  24. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  25. package/docs/adr/ADR-006-shell-selection.md +0 -124
  26. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  27. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  28. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  29. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  30. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  31. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  32. package/docs/adr/README.md +0 -40
  33. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  34. package/docs/architecture/ARCHITECTURE.md +0 -117
  35. package/docs/architecture/INTEROP.md +0 -44
  36. package/docs/architecture/REPO_LAYOUT.md +0 -241
  37. package/docs/architecture/WALKTHROUGH.md +0 -86
  38. package/docs/architecture/fleet-deployment.md +0 -77
  39. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  40. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  41. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  42. package/docs/archive/PLAN.md +0 -199
  43. package/docs/archive/REPO_AUDIT.md +0 -31
  44. package/docs/articles/.pages +0 -6
  45. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  46. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  47. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  48. package/docs/articles/index.md +0 -36
  49. package/docs/guides/INSTALL.md +0 -144
  50. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  51. package/docs/guides/THEMING.md +0 -230
  52. package/docs/guides/TROUBLESHOOTING.md +0 -176
  53. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  54. package/docs/index.md +0 -132
  55. package/docs/interop/A2A.md +0 -39
  56. package/docs/interop/POWERSHELL.md +0 -102
  57. package/docs/manual/00-introduction.md +0 -89
  58. package/docs/manual/01-concepts/01-architecture.md +0 -138
  59. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  60. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  61. package/docs/manual/01-concepts/04-fleet.md +0 -148
  62. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  63. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  64. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  65. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  66. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  67. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  68. package/docs/manual/03-reference/01-dot-cli.md +0 -450
  69. package/docs/manual/03-reference/02-config-files.md +0 -265
  70. package/docs/manual/03-reference/03-environment.md +0 -124
  71. package/docs/manual/03-reference/04-templates.md +0 -190
  72. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  73. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  74. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  75. package/docs/manual/04-cookbook/03-faq.md +0 -175
  76. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  77. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  78. package/docs/manual/05-appendices/C-glossary.md +0 -40
  79. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  80. package/docs/manual/05-appendices/E-license.md +0 -38
  81. package/docs/manual/_toc.yml +0 -58
  82. package/docs/manual/command-index.md +0 -155
  83. package/docs/manual/concept-index.md +0 -168
  84. package/docs/manual/index.md +0 -66
  85. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  86. package/docs/operations/ATTESTATION.md +0 -44
  87. package/docs/operations/CI_CADENCE.md +0 -107
  88. package/docs/operations/CI_COMPOSITES.md +0 -156
  89. package/docs/operations/COMPLETIONS.md +0 -123
  90. package/docs/operations/COVERAGE.md +0 -204
  91. package/docs/operations/DRIFT.md +0 -107
  92. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  93. package/docs/operations/MAINTENANCE.md +0 -63
  94. package/docs/operations/MANIFEST.md +0 -127
  95. package/docs/operations/MIGRATION.md +0 -109
  96. package/docs/operations/OPERATIONS.md +0 -188
  97. package/docs/operations/PERFORMANCE.md +0 -133
  98. package/docs/operations/REGISTRY.md +0 -90
  99. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  100. package/docs/operations/RELIABILITY.md +0 -122
  101. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  102. package/docs/operations/ROADMAP.md +0 -10
  103. package/docs/operations/ROADMAP_2026.md +0 -7
  104. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  105. package/docs/operations/TESTING.md +0 -216
  106. package/docs/operations/TRACEABILITY.md +0 -43
  107. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  108. package/docs/operations/VERSION_SYNC.md +0 -393
  109. package/docs/reference/ALIASES.md +0 -131
  110. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  111. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  112. package/docs/reference/FEATURES.md +0 -66
  113. package/docs/reference/FONTS.md +0 -112
  114. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  115. package/docs/reference/PROFILES.md +0 -69
  116. package/docs/reference/SCREENSHOTS.md +0 -121
  117. package/docs/reference/SCRIPTS.md +0 -71
  118. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  119. package/docs/reference/THEMES.md +0 -117
  120. package/docs/reference/TOOLS.md +0 -110
  121. package/docs/reference/UTILS.md +0 -242
  122. package/docs/registry.json +0 -6
  123. package/docs/schema/dot-env-v1.json +0 -110
  124. package/docs/schema/dot-registry-v1.json +0 -33
  125. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  126. package/docs/security/AUDIT_BYPASS.md +0 -103
  127. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  128. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  129. package/docs/security/CI_PINNING.md +0 -129
  130. package/docs/security/COMMIT_SIGNING.md +0 -138
  131. package/docs/security/COMPLIANCE.md +0 -458
  132. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  133. package/docs/security/DISCLOSURE.md +0 -130
  134. package/docs/security/ENCRYPTION.md +0 -57
  135. package/docs/security/FMEA.md +0 -159
  136. package/docs/security/FUZZING.md +0 -114
  137. package/docs/security/HISTORY_FILTERING.md +0 -132
  138. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  139. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  140. package/docs/security/KEYS.md +0 -49
  141. package/docs/security/KEY_ROTATION.md +0 -303
  142. package/docs/security/MCP_POLICY.md +0 -78
  143. package/docs/security/POLICY_RELEASES.md +0 -37
  144. package/docs/security/README.md +0 -28
  145. package/docs/security/SCORECARD.md +0 -195
  146. package/docs/security/SECRETS.md +0 -158
  147. package/docs/security/SECURITY.md +0 -45
  148. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  149. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  150. package/docs/security/SOUP_REGISTER.md +0 -36
  151. package/docs/security/THREAT_MODEL.md +0 -130
  152. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  153. package/docs/security/VERIFY_RELEASE.md +0 -201
  154. package/docs/security/security-pubkey.asc +0 -15
  155. package/docs/stylesheets/extra.css +0 -444
  156. package/docs/themes/README.md +0 -10
  157. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  158. package/docs/themes/hero-shot.svg +0 -78
  159. package/scripts/README.md +0 -123
  160. package/scripts/ci/check-copyright-headers.sh +0 -8
  161. package/scripts/ci/check-shell-preamble.sh +0 -8
  162. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  163. package/scripts/demo/record.sh +0 -43
  164. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  165. package/scripts/diagnostics/alias-governance.sh +0 -138
  166. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  167. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  168. package/scripts/diagnostics/benchmark.sh +0 -408
  169. package/scripts/diagnostics/conflicts.sh +0 -73
  170. package/scripts/diagnostics/doctor-unified.sh +0 -39
  171. package/scripts/diagnostics/doctor.sh +0 -751
  172. package/scripts/diagnostics/drift-dashboard.sh +0 -202
  173. package/scripts/diagnostics/health.sh +0 -623
  174. package/scripts/diagnostics/history-analysis.sh +0 -86
  175. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  176. package/scripts/diagnostics/perf.sh +0 -453
  177. package/scripts/diagnostics/scorecard.sh +0 -119
  178. package/scripts/diagnostics/secret-governance.sh +0 -65
  179. package/scripts/diagnostics/security-score.sh +0 -467
  180. package/scripts/diagnostics/smoke-test.sh +0 -88
  181. package/scripts/diagnostics/snapshot.sh +0 -90
  182. package/scripts/diagnostics/verify.sh +0 -108
  183. package/scripts/diagnostics/verify_state.sh +0 -73
  184. package/scripts/diagnostics/version-locks.sh +0 -94
  185. package/scripts/diagnostics/workstation-attestation.sh +0 -187
  186. package/scripts/dot/commands/agent.sh +0 -485
  187. package/scripts/dot/commands/agents.sh +0 -336
  188. package/scripts/dot/commands/ai.sh +0 -587
  189. package/scripts/dot/commands/aliases.sh +0 -277
  190. package/scripts/dot/commands/appearance.sh +0 -110
  191. package/scripts/dot/commands/completion.sh +0 -134
  192. package/scripts/dot/commands/core.sh +0 -217
  193. package/scripts/dot/commands/diagnostics.sh +0 -265
  194. package/scripts/dot/commands/env-emit.sh +0 -203
  195. package/scripts/dot/commands/fleet.sh +0 -688
  196. package/scripts/dot/commands/init.sh +0 -185
  197. package/scripts/dot/commands/lint.sh +0 -208
  198. package/scripts/dot/commands/manual.sh +0 -169
  199. package/scripts/dot/commands/meta.sh +0 -333
  200. package/scripts/dot/commands/patterns.sh +0 -55
  201. package/scripts/dot/commands/registry.sh +0 -419
  202. package/scripts/dot/commands/restore.sh +0 -232
  203. package/scripts/dot/commands/secrets.sh +0 -296
  204. package/scripts/dot/commands/security.sh +0 -102
  205. package/scripts/dot/commands/tools.sh +0 -556
  206. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  207. package/scripts/dot/powershell/Dot.psm1 +0 -319
  208. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  209. package/scripts/fonts/patch-fonts.sh +0 -36
  210. package/scripts/git-hooks/install.sh +0 -12
  211. package/scripts/git-hooks/pre-commit +0 -12
  212. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  213. package/scripts/git-hooks/pre-push +0 -105
  214. package/scripts/git-hooks/prepare-commit-msg +0 -29
  215. package/scripts/lib/secrets_provider.sh +0 -185
  216. package/scripts/ops/ai-setup.sh +0 -71
  217. package/scripts/ops/bundle.sh +0 -104
  218. package/scripts/ops/chaos.sh +0 -50
  219. package/scripts/ops/chezmoi-apply.sh +0 -333
  220. package/scripts/ops/chezmoi-diff.sh +0 -16
  221. package/scripts/ops/chezmoi-remove.sh +0 -46
  222. package/scripts/ops/chezmoi-update.sh +0 -63
  223. package/scripts/ops/heal-chezmoi.sh +0 -87
  224. package/scripts/ops/heal-system.sh +0 -129
  225. package/scripts/ops/heal-tools.sh +0 -297
  226. package/scripts/ops/heal.sh +0 -223
  227. package/scripts/ops/post-apply-repair.sh +0 -107
  228. package/scripts/ops/prewarm.sh +0 -128
  229. package/scripts/ops/release.sh +0 -262
  230. package/scripts/ops/rollback.sh +0 -604
  231. package/scripts/ops/setup.sh +0 -138
  232. package/scripts/ops/teleport.sh +0 -34
  233. package/scripts/qa/check-version-consistency.sh +0 -124
  234. package/scripts/qa/coverage-baseline.sh +0 -61
  235. package/scripts/qa/docs-coverage.sh +0 -112
  236. package/scripts/qa/examples-coverage.sh +0 -94
  237. package/scripts/qa/powershell-contract.ps1 +0 -95
  238. package/scripts/qa/reliability-audit.sh +0 -139
  239. package/scripts/qa/scorecard-snapshot.sh +0 -128
  240. package/scripts/qa/traceability-coverage.sh +0 -117
  241. package/scripts/qa/validate-examples.sh +0 -27
  242. package/scripts/qa/wsl-contract.sh +0 -12
  243. package/scripts/secrets/age-init.sh +0 -82
  244. package/scripts/secrets/create-secrets-file.sh +0 -46
  245. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  246. package/scripts/security/backup.sh +0 -58
  247. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  248. package/scripts/security/dns-doh.sh +0 -52
  249. package/scripts/security/encryption-check.sh +0 -55
  250. package/scripts/security/enforce-policies.sh +0 -335
  251. package/scripts/security/firewall.sh +0 -91
  252. package/scripts/security/lock-configs.sh +0 -67
  253. package/scripts/security/lock-screen.sh +0 -56
  254. package/scripts/security/manage-secrets.sh +0 -429
  255. package/scripts/security/ssh-cert.sh +0 -204
  256. package/scripts/security/telemetry-kill.sh +0 -51
  257. package/scripts/security/usb-safety.sh +0 -52
  258. package/scripts/theme/apply-gnome-theme.sh +0 -333
  259. package/scripts/theme/extract-heic-frames.sh +0 -115
  260. package/scripts/theme/extract-theme.py +0 -742
  261. package/scripts/theme/install-boot-logo.sh +0 -63
  262. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  263. package/scripts/theme/install-cursors.sh +0 -26
  264. package/scripts/theme/install-file-icons.sh +0 -27
  265. package/scripts/theme/install-grub-theme.sh +0 -62
  266. package/scripts/theme/install-lock-icon.sh +0 -31
  267. package/scripts/theme/merge-wallpaper.sh +0 -146
  268. package/scripts/theme/rebuild-themes.sh +0 -544
  269. package/scripts/theme/switch.sh +0 -449
  270. package/scripts/theme/wallpaper-rotate.sh +0 -137
  271. package/scripts/theme/wallpaper-sync.sh +0 -690
  272. package/scripts/tools/cmatrix.sh +0 -22
  273. package/scripts/tools/detect-collisions.py +0 -103
  274. package/scripts/tools/emoji-picker.sh +0 -49
  275. package/scripts/tools/figlet-banner.sh +0 -19
  276. package/scripts/tools/log-rotate.sh +0 -31
  277. package/scripts/tools/lolcat-wrap.sh +0 -20
  278. package/scripts/tools/pipes.sh +0 -49
  279. package/scripts/tuning/linux.sh +0 -186
  280. package/scripts/tuning/macos.sh +0 -56
  281. package/scripts/uninstall.sh +0 -86
  282. package/scripts/version-sync.sh +0 -654
  283. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  284. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  285. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  286. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  287. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  288. package/templates/projects/go/README.md +0 -7
  289. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  290. package/templates/projects/go/go.mod +0 -3
  291. package/templates/projects/go/go.sum +0 -0
  292. package/templates/projects/molecule/README.md +0 -7
  293. package/templates/projects/molecule/converge.yml +0 -7
  294. package/templates/projects/molecule/molecule.yml +0 -16
  295. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  296. package/templates/projects/node/README.md +0 -7
  297. package/templates/projects/node/package-lock.json +0 -12
  298. package/templates/projects/node/package.json +0 -10
  299. package/templates/projects/node/src/index.js +0 -3
  300. package/templates/projects/packer/README.md +0 -15
  301. package/templates/projects/packer/main.pkr.hcl +0 -15
  302. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  303. package/templates/projects/python/README.md +0 -7
  304. package/templates/projects/python/pyproject.toml +0 -25
  305. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  306. 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
- <strong>Declarative dotfiles for macOS, Linux, WSL, and Windows-native PowerShell 7.4 LTS / 7.5+. Multi-shell by default. Sub-100ms CLI cold-start. Wallpaper-driven themes. Signed + attested releases. Fleet apply over SSH.</strong>
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.519-blue?style=for-the-badge&logo=semanticrelease&logoColor=white" alt="Version" /></a>
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="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge&logo=opensourceinitiative&logoColor=white" alt="License: MIT" /></a>
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
- > **Why this is different.** You won't find these three things in `mathiasbynens/`, `holman/`, or `paulirish/`. First, wallpaper-driven terminal themes. We use K-Means clustering in CIELAB and enforce WCAG AAA contrast. Second, first-class agent governance. That covers MCP policy, A2A discovery, signed attestation logs, and bounded profiles (`ask` / `plan` / `apply` / `audit`). Third, verified multi-shell parity across zsh, fish, bash, nushell, and PowerShell. The suite is tested on macOS, Linux, WSL2, and Apple Silicon CI runners. Signed commits are enforced. The installer is idempotent. The CLI heals itself.
30
+ ## Contents
24
31
 
25
- <!-- ASCIINEMA DEMO — closes #874 once recorded.
26
- 30-second clip covering: install.sh → dot doctor → dot theme rebuild.
27
- Recording recipe (maintainer):
32
+ **Getting started**
28
33
 
29
- asciinema rec ~/dotfiles-demo.cast \
30
- --idle-time-limit 1 --rows 30 --cols 100 \
31
- --title "Dotfiles: install doctor theme"
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
- Upload with `asciinema upload ~/dotfiles-demo.cast`, grab the
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
- <p align="center">
43
- <a href="https://asciinema.org/a/<id>">
44
- <img src="https://asciinema.org/a/<id>.svg" alt="install → doctor → theme demo" />
45
- </a>
46
- </p>
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
- **Verified install (recommended).** Pin to a release tag. Download the installer. Check its SHA256 against the value published with the release. Then run it. See [docs/security/INSTALL_VERIFICATION.md](docs/security/INSTALL_VERIFICATION.md) for the per-release hash and how it's generated.
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://raw.githubusercontent.com/sebastienrousseau/dotfiles/v0.2.519/install.sh
56
- echo "3b5d1332fb07a1261da117e53f69acc0097c3d9bd676fc9f53a000257b72978e /tmp/dotfiles-install.sh" \
57
- | shasum -a 256 -c
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
- **Trust-source one-liner** (skips the SHA check — fine for sandboxes and ephemeral CI, not recommended for primary workstations):
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
- bash -c "$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh)"
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
- Then verify and explore:
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
- dot doctor # verify installation
71
- dot learn # interactive tour
148
+ chezmoi init --apply sebastienrousseau
72
149
  ```
73
150
 
74
- The install needs `git` and `curl`. The verified path also needs `shasum` or `sha256sum`. The script runs on macOS, Ubuntu, Debian, Arch, WSL2, and GitHub Codespaces.
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 -c "$(curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh)"
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
- ## Why this repo is different
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
- Most dotfiles repos are personal collections. This one ships as workstation infrastructure. It's signed, attested, multi-platform, AI-aware, and self-healing.
249
+ ---
104
250
 
105
- | Capability | What you get | Where |
106
- |:---|:---|:---|
107
- | **Wallpaper-driven themes** | K-Means clustering in CIELAB extracts terminal palettes from any wallpaper. WCAG AAA enforced. Dynamic HEIC dark/light. | `dot theme rebuild` |
108
- | **AI and MCP native** | Agent profiles, MCP policy enforcement, attestation logs, AI commit messages. | `dot ai`, `dot mcp`, `dot agent`, `dot mode` |
109
- | **Cryptographic attestation** | Signed commits, machine-readable evidence, policy bundle releases. | `dot attest`, `dot secrets verify` |
110
- | **Fleet management** | Multi-node drift dashboard, per-host profiles. | `dot fleet` |
111
- | **Self-healing** | Auto-repair tools, chezmoi drift, broken symlinks, missing files. | `dot heal`, `dot chaos`, `dot rollback`, `dot bundle` |
112
- | **Sub-second startup** | Lazy loading, `_cached_eval` pattern, mtime-based cache invalidation, realpath sidecar pins. | `dot perf`, `dot health` |
113
- | **Multi-shell parity** | Tier-1 (full): zsh, bash. Tier-2 (bridged): fish. Tier-3 (compatible): nushell. PowerShell is supported as a contract-tested parity target. A cross-shell parity contract ([`tests/integration/test_shell_parity.sh`](tests/integration/test_shell_parity.sh)) verifies the canonical command surface and a runtime smoke in every available shell. See [ADR-007](docs/adr/ADR-007-multi-shell-parity.md) and [ADR-011](docs/adr/ADR-011-nushell-tier3-keep.md). | `dot env`, `dot profile` |
114
- | **Build artifacts /tmp** | Cargo, Go, pip, uv, and Zig caches redirect to `/tmp/builds/`. Project dirs stay clean. | `~/.config/mise/config.toml`, `~/.cargo/config.toml` |
115
- | **Encrypted secrets** | Age and SOPS keep per-machine secrets out of plaintext history. | `dot secrets` |
116
- | **Portable runtimes** | Mise for managed toolchains. Nix Flakes for strict reproducibility. | `dot env`, `dot upgrade` |
117
- | **Schema-validated config** | `.chezmoidata.toml` is checked against a JSON Schema in CI via taplo. Typos in feature flags or profile names fail at PR time. | `config/chezmoidata.schema.json` |
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
- ## Architecture
281
+ ## The dotfiles family
122
282
 
123
- The CLI is idempotent. Run it once or a hundred times. Same machine state.
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
- ```mermaid
126
- graph TD
127
- A[User Shell] --> B{dot CLI}
128
- B --> C[Lifecycle: sync / apply / rollback / heal]
129
- B --> D[Diagnostics: doctor / drift / benchmark / score]
130
- B --> E[AI & Agents: ai / mcp / agent / mode]
131
- B --> F[Themes: theme / theme rebuild]
132
- B --> G[Fleet & Attest: fleet / attest / bundle]
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
- C --> H[Chezmoi Source]
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
- H --> L[Zsh / Fish / Bash / Nushell / PowerShell]
141
- H --> M[Mise / Nix Toolchains]
142
- H --> N[MCP Policy / Agent Profiles]
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
- G --> P[Signed Attestation Logs]
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
- ## Wallpaper-Driven Themes
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 ones. On macOS it looks in `/System/Library/Desktop Pictures/`. On Linux it looks in `/usr/share/backgrounds/`. Custom wallpapers live in `~/Pictures/Wallpapers/`. K-Means clustering in CIELAB color space extracts dominant colors. The engine then generates a 16-color terminal palette, enforces WCAG AAA contrast, and assembles `themes.toml` on its own.
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 darklight within current family
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
- On theme switch, every managed surface updates. Terminals: Ghostty, Alacritty, Kitty, WezTerm, Warp, iTerm2, tmux. Editors: Neovim and VS Code. The theme also sets GTK and icon themes, the macOS accent and dark-mode toggle (with a forced UI refresh), the browser color mode, and the wallpaper. On Linux, the engine auto-converts HEIC to PNG via `magick` or `heif-convert`.
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
- Full guide: [docs/guides/THEMING.md](docs/guides/THEMING.md)
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
- Over 80 commands grouped by intent. Run `dot help` for the full reference.
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 Here
757
+ ### Start here
179
758
 
180
759
  | | |
181
760
  |:---|:---|
182
- | `dot init <user>` | Bootstrap any GitHub user's dotfiles repo through this harness |
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
- A [Claude Code skill](defaults/dot_claude/skills/dotfiles-bootstrap/SKILL.md) is also shipped — `/skills` discovers `dotfiles-bootstrap` and runs `dot init` with profile-aware safety defaults.
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 tools and dotfiles |
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 & Repair
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 & Agents
789
+ ### AI and agents
212
790
 
213
791
  | | |
214
792
  |:---|:---|
215
- | `dot ai` | AI fleet cockpit — run, chat, install, serve a local Claude gateway, cost |
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` | Show managed tool versions |
227
- | `dot profile` | Show or switch active profile |
228
- | `dot secrets` | Edit encrypted secrets |
229
- | `dot fonts` | Install or refresh Nerd Fonts |
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 & Performance
809
+ ### Fleet and performance
232
810
 
233
811
  | | |
234
812
  |:---|:---|
235
- | `dot fleet` | Multi-node status, drift, and namespace |
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) · Complete manual: [docs/manual/](docs/manual/) or `dot manual`
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
- ## Documentation
823
+ <details>
824
+ <summary><b>Architecture</b></summary>
245
825
 
246
- The `.dotfiles` Manual is published in nine formats: HTML (single and multi-page), PDF, EPUB, ASCII text, compressed variants, and Markdown source. It auto-builds on every change.
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
- - **Online** <https://sebastienrousseau.github.io/dotfiles/manual/>
249
- - **Terminal** `dot manual text | less`
250
- - **PDF** `dot manual pdf`
251
- - **Offline copy** `dot manual --offline` (uses the bundled snapshot, no network)
252
- - **Sources** — [`docs/manual/`](docs/manual/)
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
- ## First 5 Minutes
846
+ G --> P[Signed Attestation Logs]
847
+ ```
257
848
 
258
- 1. **Check** `dot doctor` validates tools, paths, and security
259
- 2. **Explore** `dot learn` walks through shells, secrets, themes, and performance
260
- 3. **Customize** edit `~/.config/chezmoi/chezmoi.toml` for per-machine settings ([Profiles](docs/reference/PROFILES.md))
261
- 4. **Toggle features** flip features in `.chezmoidata.toml` ([Feature Flags](docs/reference/FEATURES.md))
262
- 5. **Apply** `dot sync` applies the config and the next interactive shell hydrates caches via `_cached_eval`
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
- See the [Migration Guide](docs/operations/MIGRATION.md) for version upgrades.
859
+ </details>
265
860
 
266
861
  ---
267
862
 
268
- ## What's Included
863
+ ## Configuration
269
864
 
270
865
  <details>
271
- <summary><b>Shells and Navigation</b></summary>
866
+ <summary><b>Machine data (<code>.chezmoidata.toml</code>)</b></summary>
272
867
 
273
- - **Zsh** loads in stages through small modules, not one big startup script
274
- - **Fish** uses `_cached_eval` and deferred loading for fast interactive use
275
- - **Bash** ships full parity with zsh for tooling and aliases
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
- </details>
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
- <details>
284
- <summary><b>Development and Runtimes</b></summary>
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
- - **Mise** manages language versions in user space (no system pollution)
287
- - **Nix Flakes** for strict reproducible builds when speed isn't the priority
288
- - **Pueue** queues long-running tasks instead of spawning extra terminal tabs
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>AI, Agents, and MCP</b></summary>
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
- - **Agent profiles** (`dot mode`) switch between ask, plan, apply, and audit
300
- - **Pattern library** (`dot patterns`) — architect, hardener, and refactor patterns bundled in `dot_config/ai/patterns/`
301
- - **MCP policy enforcement** (`dot mcp`) validate the Model Context Protocol registry against policy
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>Security, Trust, and Governance</b></summary>
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
- - **Age and SOPS** keep secrets encrypted at rest and out of plaintext history
312
- - **SSH ED25519 signing** plus trust metadata back signed commits and verifiable changes
313
- - **Gitleaks**, policy checks, and compliance workflows
314
- - **Workstation attestation** (`dot attest`) records machine state, policy, prompt, and model metadata in tracked JSON
315
- - **Telemetry controls** and local-first defaults — you own your data
316
- - **SBOM (CycloneDX)** and Grype CVE scanning in CI
317
- - **JSON Schema for `.chezmoidata.toml`** — taplo runs the schema in CI on every PR, so typos in feature flags or profile names fail before merge
318
- - **OIDC Trusted Publishing** — npm releases authenticate via OIDC, not a long-lived `NPM_TOKEN`. Provenance is attached to every published tarball
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
- For security hardening options, see the [Security docs](docs/security/SECURITY.md).
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
- ## Comparison
1017
+ ## Development
327
1018
 
328
- | | This repo | chezmoi | holman/dotfiles | nikitabobko/dotfiles |
329
- |:---|:---:|:---:|:---:|:---:|
330
- | Cross-platform (macOS/Linux/WSL) | | ✓ | macOS-leaning | macOS only |
331
- | Multi-shell parity (zsh/fish/nu/pwsh) | ✓ | — | bash only | zsh only |
332
- | Wallpaper-driven themes (K-Means) | ✓ | — | — | — |
333
- | AI / MCP integration | | — | — | — |
334
- | Cryptographic attestation | | | | — |
335
- | Self-healing CLI | ✓ | — | — | — |
336
- | Fleet management | ✓ | — | — | — |
337
- | Encrypted secrets (Age/SOPS) | | | — | — |
338
- | Build artifact redirection | ✓ | — | — | — |
339
- | Schema-validated config | | — | — | — |
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
- `chezmoi` is the underlying templating engine. This repo is the opinionated reference implementation.
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
- **THE ARCHITECT** ᛫ [Sebastien Rousseau](https://sebastienrousseau.com)
346
- **THE ENGINE** ᛞ [EUXIS](https://euxis.co) ᛫ Enterprise Unified Execution Intelligence System
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
- Licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
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="#dotfiles">Back to Top</a></p>
1360
+ <p align="right"><a href="#contents">Back to Top</a></p>