@sebastienrousseau/dotfiles 0.2.520 → 0.2.522

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 (323) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +43 -37
  5. package/install.sh +76 -10
  6. package/package.json +7 -7
  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/ARCHITECTURE.md +0 -117
  12. package/docs/CNAME +0 -1
  13. package/docs/CONFIG_STRATEGY.md +0 -124
  14. package/docs/COPYRIGHT +0 -7
  15. package/docs/ECOSYSTEM.md +0 -220
  16. package/docs/GOLD-STANDARD-AUDIT.md +0 -352
  17. package/docs/GOVERNANCE.md +0 -98
  18. package/docs/MAINTAINERS.md +0 -41
  19. package/docs/MINIMUM-TOOLCHAIN.md +0 -100
  20. package/docs/NAMING_CONVENTIONS.md +0 -102
  21. package/docs/OPENCODE.md +0 -127
  22. package/docs/README.md +0 -84
  23. package/docs/STRUCTURE.md +0 -102
  24. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  25. package/docs/adr/ADR-002-shell-performance.md +0 -130
  26. package/docs/adr/ADR-003-security-first.md +0 -158
  27. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  28. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  29. package/docs/adr/ADR-006-shell-selection.md +0 -124
  30. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  31. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  32. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  33. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  34. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  35. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  36. package/docs/adr/README.md +0 -40
  37. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  38. package/docs/architecture/ARCHITECTURE.md +0 -20
  39. package/docs/architecture/INTEROP.md +0 -44
  40. package/docs/architecture/REPO_LAYOUT.md +0 -241
  41. package/docs/architecture/WALKTHROUGH.md +0 -86
  42. package/docs/architecture/fleet-deployment.md +0 -77
  43. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  44. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  45. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  46. package/docs/archive/PLAN.md +0 -199
  47. package/docs/archive/REPO_AUDIT.md +0 -31
  48. package/docs/articles/.pages +0 -6
  49. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  50. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  51. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  52. package/docs/articles/index.md +0 -36
  53. package/docs/guides/INSTALL.md +0 -144
  54. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
  55. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  56. package/docs/guides/THEMING.md +0 -230
  57. package/docs/guides/TROUBLESHOOTING.md +0 -176
  58. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  59. package/docs/index.md +0 -132
  60. package/docs/interop/A2A.md +0 -39
  61. package/docs/interop/POWERSHELL.md +0 -102
  62. package/docs/manual/00-introduction.md +0 -89
  63. package/docs/manual/01-concepts/01-architecture.md +0 -138
  64. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  65. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  66. package/docs/manual/01-concepts/04-fleet.md +0 -148
  67. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  68. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  69. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  70. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  71. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  72. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  73. package/docs/manual/03-reference/01-dot-cli.md +0 -475
  74. package/docs/manual/03-reference/02-config-files.md +0 -265
  75. package/docs/manual/03-reference/03-environment.md +0 -124
  76. package/docs/manual/03-reference/04-templates.md +0 -190
  77. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  78. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  79. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  80. package/docs/manual/04-cookbook/03-faq.md +0 -175
  81. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  82. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  83. package/docs/manual/05-appendices/C-glossary.md +0 -40
  84. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  85. package/docs/manual/05-appendices/E-license.md +0 -38
  86. package/docs/manual/_toc.yml +0 -58
  87. package/docs/manual/command-index.md +0 -175
  88. package/docs/manual/concept-index.md +0 -170
  89. package/docs/manual/index.md +0 -66
  90. package/docs/migration/README.md +0 -81
  91. package/docs/migration/from-bare-git-repo.md +0 -156
  92. package/docs/migration/from-gnu-stow.md +0 -165
  93. package/docs/migration/from-plain-chezmoi.md +0 -148
  94. package/docs/migration/from-yadm.md +0 -187
  95. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  96. package/docs/operations/ATTESTATION.md +0 -44
  97. package/docs/operations/CI_CADENCE.md +0 -107
  98. package/docs/operations/CI_COMPOSITES.md +0 -156
  99. package/docs/operations/COMPLETIONS.md +0 -123
  100. package/docs/operations/COVERAGE.md +0 -204
  101. package/docs/operations/DRIFT.md +0 -107
  102. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  103. package/docs/operations/MAINTENANCE.md +0 -63
  104. package/docs/operations/MANIFEST.md +0 -127
  105. package/docs/operations/MIGRATION.md +0 -109
  106. package/docs/operations/OPERATIONS.md +0 -188
  107. package/docs/operations/PERFORMANCE.md +0 -133
  108. package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
  109. package/docs/operations/REGISTRY.md +0 -90
  110. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  111. package/docs/operations/RELIABILITY.md +0 -122
  112. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  113. package/docs/operations/ROADMAP.md +0 -10
  114. package/docs/operations/ROADMAP_2026.md +0 -7
  115. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  116. package/docs/operations/TESTING.md +0 -216
  117. package/docs/operations/TRACEABILITY.md +0 -44
  118. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  119. package/docs/operations/VERSION_SYNC.md +0 -393
  120. package/docs/packaging.md +0 -222
  121. package/docs/reference/ALIASES.md +0 -131
  122. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  123. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  124. package/docs/reference/FEATURE-MATRIX.md +0 -646
  125. package/docs/reference/FEATURES.md +0 -66
  126. package/docs/reference/FONTS.md +0 -112
  127. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  128. package/docs/reference/PROFILES.md +0 -69
  129. package/docs/reference/SCREENSHOTS.md +0 -121
  130. package/docs/reference/SCRIPTS.md +0 -71
  131. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  132. package/docs/reference/THEMES.md +0 -117
  133. package/docs/reference/TOOLS.md +0 -110
  134. package/docs/reference/UTILS.md +0 -243
  135. package/docs/registry.json +0 -6
  136. package/docs/schema/dot-env-v1.json +0 -110
  137. package/docs/schema/dot-registry-v1.json +0 -33
  138. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  139. package/docs/security/AUDIT_BYPASS.md +0 -103
  140. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  141. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  142. package/docs/security/CI_PINNING.md +0 -129
  143. package/docs/security/COMMIT_SIGNING.md +0 -138
  144. package/docs/security/COMPLIANCE.md +0 -458
  145. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  146. package/docs/security/DISCLOSURE.md +0 -130
  147. package/docs/security/ENCRYPTION.md +0 -57
  148. package/docs/security/FMEA.md +0 -159
  149. package/docs/security/FUZZING.md +0 -209
  150. package/docs/security/HISTORY_FILTERING.md +0 -132
  151. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  152. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  153. package/docs/security/KEYS.md +0 -49
  154. package/docs/security/KEY_ROTATION.md +0 -303
  155. package/docs/security/MCP_POLICY.md +0 -78
  156. package/docs/security/POLICY_RELEASES.md +0 -37
  157. package/docs/security/README.md +0 -28
  158. package/docs/security/SCORECARD.md +0 -195
  159. package/docs/security/SECRETS.md +0 -158
  160. package/docs/security/SECURITY.md +0 -45
  161. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  162. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  163. package/docs/security/SOUP_REGISTER.md +0 -36
  164. package/docs/security/THREAT_MODEL.md +0 -130
  165. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  166. package/docs/security/VERIFY_RELEASE.md +0 -201
  167. package/docs/security/security-pubkey.asc +0 -15
  168. package/docs/stylesheets/extra.css +0 -444
  169. package/docs/themes/README.md +0 -10
  170. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  171. package/docs/themes/hero-shot.svg +0 -78
  172. package/scripts/README.md +0 -123
  173. package/scripts/ci/check-copyright-headers.sh +0 -8
  174. package/scripts/ci/check-shell-preamble.sh +0 -8
  175. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  176. package/scripts/demo/record.sh +0 -43
  177. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  178. package/scripts/diagnostics/alias-governance.sh +0 -165
  179. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  180. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  181. package/scripts/diagnostics/attest-verify.sh +0 -147
  182. package/scripts/diagnostics/benchmark.sh +0 -408
  183. package/scripts/diagnostics/conflicts.sh +0 -73
  184. package/scripts/diagnostics/doctor-unified.sh +0 -43
  185. package/scripts/diagnostics/doctor.sh +0 -797
  186. package/scripts/diagnostics/drift-dashboard.sh +0 -203
  187. package/scripts/diagnostics/health.sh +0 -656
  188. package/scripts/diagnostics/history-analysis.sh +0 -86
  189. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  190. package/scripts/diagnostics/perf.sh +0 -453
  191. package/scripts/diagnostics/scorecard.sh +0 -120
  192. package/scripts/diagnostics/secret-governance.sh +0 -65
  193. package/scripts/diagnostics/security-score.sh +0 -467
  194. package/scripts/diagnostics/smoke-test.sh +0 -88
  195. package/scripts/diagnostics/snapshot.sh +0 -90
  196. package/scripts/diagnostics/verify.sh +0 -108
  197. package/scripts/diagnostics/verify_state.sh +0 -73
  198. package/scripts/diagnostics/version-locks.sh +0 -94
  199. package/scripts/diagnostics/workstation-attestation.sh +0 -212
  200. package/scripts/dot/commands/agent.sh +0 -535
  201. package/scripts/dot/commands/agents.sh +0 -352
  202. package/scripts/dot/commands/ai.sh +0 -600
  203. package/scripts/dot/commands/aliases.sh +0 -277
  204. package/scripts/dot/commands/appearance.sh +0 -110
  205. package/scripts/dot/commands/completion.sh +0 -171
  206. package/scripts/dot/commands/core.sh +0 -217
  207. package/scripts/dot/commands/diagnostics.sh +0 -265
  208. package/scripts/dot/commands/env-emit.sh +0 -203
  209. package/scripts/dot/commands/fleet.sh +0 -711
  210. package/scripts/dot/commands/init.sh +0 -185
  211. package/scripts/dot/commands/lint.sh +0 -208
  212. package/scripts/dot/commands/manual.sh +0 -169
  213. package/scripts/dot/commands/meta.sh +0 -438
  214. package/scripts/dot/commands/patterns.sh +0 -55
  215. package/scripts/dot/commands/registry.sh +0 -455
  216. package/scripts/dot/commands/restore.sh +0 -232
  217. package/scripts/dot/commands/secrets.sh +0 -296
  218. package/scripts/dot/commands/security.sh +0 -102
  219. package/scripts/dot/commands/tools.sh +0 -570
  220. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  221. package/scripts/dot/powershell/Dot.psm1 +0 -319
  222. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  223. package/scripts/fonts/patch-fonts.sh +0 -36
  224. package/scripts/git-hooks/install.sh +0 -12
  225. package/scripts/git-hooks/pre-commit +0 -12
  226. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  227. package/scripts/git-hooks/pre-push +0 -105
  228. package/scripts/git-hooks/prepare-commit-msg +0 -29
  229. package/scripts/lib/secrets_provider.sh +0 -200
  230. package/scripts/nvim/headless-upgrade.lua +0 -81
  231. package/scripts/ops/ai-setup.sh +0 -71
  232. package/scripts/ops/bundle.sh +0 -104
  233. package/scripts/ops/chaos.sh +0 -50
  234. package/scripts/ops/chezmoi-apply.sh +0 -333
  235. package/scripts/ops/chezmoi-diff.sh +0 -16
  236. package/scripts/ops/chezmoi-remove.sh +0 -46
  237. package/scripts/ops/chezmoi-update.sh +0 -67
  238. package/scripts/ops/heal-chezmoi.sh +0 -87
  239. package/scripts/ops/heal-system.sh +0 -129
  240. package/scripts/ops/heal-tools.sh +0 -297
  241. package/scripts/ops/heal.sh +0 -223
  242. package/scripts/ops/post-apply-repair.sh +0 -107
  243. package/scripts/ops/prewarm.sh +0 -128
  244. package/scripts/ops/release.sh +0 -262
  245. package/scripts/ops/rollback.sh +0 -613
  246. package/scripts/ops/setup.sh +0 -138
  247. package/scripts/ops/teleport.sh +0 -34
  248. package/scripts/qa/check-feature-matrix.sh +0 -296
  249. package/scripts/qa/check-version-consistency.sh +0 -12
  250. package/scripts/qa/coverage-baseline.sh +0 -61
  251. package/scripts/qa/docs-coverage.sh +0 -118
  252. package/scripts/qa/examples-coverage.sh +0 -94
  253. package/scripts/qa/powershell-contract.ps1 +0 -95
  254. package/scripts/qa/reliability-audit.sh +0 -139
  255. package/scripts/qa/scorecard-snapshot.sh +0 -128
  256. package/scripts/qa/traceability-coverage.sh +0 -124
  257. package/scripts/qa/validate-examples.sh +0 -90
  258. package/scripts/qa/wsl-contract.sh +0 -12
  259. package/scripts/secrets/age-init.sh +0 -82
  260. package/scripts/secrets/create-secrets-file.sh +0 -46
  261. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  262. package/scripts/security/backup.sh +0 -58
  263. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  264. package/scripts/security/dns-doh.sh +0 -52
  265. package/scripts/security/encryption-check.sh +0 -55
  266. package/scripts/security/enforce-policies.sh +0 -552
  267. package/scripts/security/firewall.sh +0 -91
  268. package/scripts/security/lock-configs.sh +0 -67
  269. package/scripts/security/lock-screen.sh +0 -56
  270. package/scripts/security/manage-secrets.sh +0 -429
  271. package/scripts/security/ssh-cert.sh +0 -204
  272. package/scripts/security/telemetry-kill.sh +0 -51
  273. package/scripts/security/usb-safety.sh +0 -52
  274. package/scripts/theme/apply-gnome-theme.sh +0 -333
  275. package/scripts/theme/extract-heic-frames.sh +0 -115
  276. package/scripts/theme/extract-theme.py +0 -1020
  277. package/scripts/theme/install-boot-logo.sh +0 -63
  278. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  279. package/scripts/theme/install-cursors.sh +0 -26
  280. package/scripts/theme/install-file-icons.sh +0 -27
  281. package/scripts/theme/install-grub-theme.sh +0 -62
  282. package/scripts/theme/install-lock-icon.sh +0 -31
  283. package/scripts/theme/merge-wallpaper.sh +0 -146
  284. package/scripts/theme/rebuild-themes.sh +0 -603
  285. package/scripts/theme/switch.sh +0 -476
  286. package/scripts/theme/wallpaper-rotate.sh +0 -137
  287. package/scripts/theme/wallpaper-sync.sh +0 -690
  288. package/scripts/tools/cmatrix.sh +0 -22
  289. package/scripts/tools/detect-collisions.py +0 -103
  290. package/scripts/tools/emoji-picker.sh +0 -49
  291. package/scripts/tools/figlet-banner.sh +0 -19
  292. package/scripts/tools/log-rotate.sh +0 -31
  293. package/scripts/tools/lolcat-wrap.sh +0 -20
  294. package/scripts/tools/pipes.sh +0 -49
  295. package/scripts/tuning/linux.sh +0 -186
  296. package/scripts/tuning/macos.sh +0 -56
  297. package/scripts/uninstall.sh +0 -86
  298. package/scripts/verify-release-versions +0 -156
  299. package/scripts/version-sync.sh +0 -714
  300. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  301. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  302. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  303. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  304. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  305. package/templates/projects/go/README.md +0 -7
  306. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  307. package/templates/projects/go/go.mod +0 -3
  308. package/templates/projects/go/go.sum +0 -0
  309. package/templates/projects/molecule/README.md +0 -7
  310. package/templates/projects/molecule/converge.yml +0 -7
  311. package/templates/projects/molecule/molecule.yml +0 -16
  312. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  313. package/templates/projects/node/README.md +0 -7
  314. package/templates/projects/node/package-lock.json +0 -12
  315. package/templates/projects/node/package.json +0 -10
  316. package/templates/projects/node/src/index.js +0 -3
  317. package/templates/projects/packer/README.md +0 -15
  318. package/templates/projects/packer/main.pkr.hcl +0 -15
  319. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  320. package/templates/projects/python/README.md +0 -7
  321. package/templates/projects/python/pyproject.toml +0 -25
  322. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  323. package/templates/projects/python/tests/test_basic.py +0 -3
@@ -1,204 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # Code Coverage
6
-
7
- This page documents how coverage is measured, what the threshold is,
8
- how to run it locally, and how to triage a regression. Closes the
9
- docs slice of [#856](https://github.com/sebastienrousseau/dotfiles/issues/856).
10
-
11
- ## Why pure bash xtrace (and not kcov)
12
-
13
- The repo's primary code surface is bash (~140 shell files under
14
- `scripts/`, hundreds more in `.chezmoitemplates/`). Standard
15
- language-specific coverage tools (`coverage.py`, `cargo tarpaulin`,
16
- `go cover`) don't apply.
17
-
18
- We originally targeted [kcov](https://github.com/SimonKagstrom/kcov),
19
- but kcov v43 on Ubuntu 24.04 + bash 5.2 cannot produce bash-script
20
- coverage in any configuration we tried:
21
-
22
- - Without bash debug symbols, kcov's ptrace backend fails to resolve
23
- breakpoints and emits zero lines.
24
- - With `bash-dbgsym` installed, kcov switches into C-binary tracking
25
- mode and emits coverage entries for bash's internal C headers
26
- (`ctype.h`, `stdio.h`, `wchar.h`) instead of the `.sh` files we
27
- want measured.
28
-
29
- Instead we use bash's own xtrace mechanism:
30
-
31
- ```bash
32
- PS4='+@COV@:${LINENO}:${BASH_SOURCE}:@ ' # encode line + source
33
- BASH_ENV=/tmp/cov-setup.sh # `set -x` in every bash
34
- bash test.sh 2>traces/test.trace # capture stderr per test
35
- ```
36
-
37
- `BASH_ENV` is inherited by every non-interactive bash invocation, so
38
- subprocess `bash $SCRIPT_FILE` calls inside tests are also traced
39
- automatically. The runner parses every trace for `:LINENO:FILE:`
40
- matches and emits standard `lcov.info` that Codecov ingests natively.
41
-
42
- ## Where it runs
43
-
44
- | Surface | What runs |
45
- |---|---|
46
- | **PR + push to main** | `.github/workflows/coverage.yml` → `Coverage / kcov` job → uploads lcov.info to Codecov and fails the build below `MIN_COVERAGE_PCT` (currently `58`, ratcheted up after measured integer-floor gains). |
47
- | **Local dev** | `bash tools/ci/run-coverage.sh` — works on Linux + macOS (xtrace is a bash primitive, no platform tools needed). |
48
- | **macOS dev** | Supported. xtrace-based instrumentation runs on macOS bash 3.2+ and Homebrew bash 5.x, with a Perl alarm fallback when GNU `timeout`/`gtimeout` is unavailable. |
49
-
50
- ## The current floor
51
-
52
- `MIN_COVERAGE_PCT=58` in `.github/workflows/coverage.yml`. Slice 1
53
- of [#883](https://github.com/sebastienrousseau/dotfiles/issues/883)
54
- established the baseline at **~2.7% measured** (~613 of ~22 500 lines
55
- across 231 files). Successive slices raised it; the current measured
56
- value sits at **59.32%** (`7523/12682` lines, measured on v0.2.513; gate floored at 58 for local<->CI drift + run variance). This release now traces both mandatory unit and regression suites, replays the function exerciser's captured xtrace, and caches source-path normalization so aggregation completes in seconds instead of minutes. It builds on the earlier parser correction for nested Bash execution prefixes and deterministic branch-driving tests for Scorecard snapshots, examples coverage, and `httpdebug`. It builds on the eighth core
57
- coverage-ratchet slice, which added `jwt` portability coverage and
58
- branch-driving function coverage for `apihealth`, `apiload`, and
59
- `apilatency`. This builds on the prior helper slice that drove
60
- `scripts/dot/commands/restore.sh` to 75.17%,
61
- `scripts/dot/commands/meta.sh` to 66.88%, `lib/dot/log.sh` to 59.56%,
62
- and `scripts/dot/commands/diagnostics.sh` to 49.63%, with additional
63
- git AI, hashsum, regex, jsonv, gl, and hex helper branch coverage.
64
- This builds on the prior core slice (`scripts/dot/commands/init.sh` at 72.09%,
65
- `scripts/dot/commands/manual.sh` at 62.50%,
66
- `scripts/dot/commands/core.sh` at 55.86%, and
67
- `scripts/dot/commands/secrets.sh` at 54.97%), the prior
68
- AI command slice (`defaults/dot_local/bin/executable_dot-ai-proxy` at
69
- 76.00%, `scripts/dot/commands/agents.sh` at 66.15%, and
70
- `scripts/dot/commands/completion.sh` at 45.68%), the registry slice
71
- (`scripts/dot/commands/registry.sh` at 65.03%) and the macOS
72
- coverage-runner Perl timeout fallback, the aliases slice
73
- (`scripts/dot/commands/aliases.sh` at 70.00%), the tools/version-sync
74
- slice (`scripts/dot/commands/tools.sh` at 72.85%, `lib/dot/utils.sh` at
75
- 73.24%, and `scripts/version-sync.sh` at 36.53%), the first core slice
76
- for `lib/dot/ui.sh`, and the #954 deep-branch pass for
77
- `scripts/theme/switch.sh`,
78
- `scripts/diagnostics/mcp-doctor.sh`, and Linux/WSL branches in
79
- `scripts/diagnostics/doctor.sh`.
80
-
81
- To tighten:
82
-
83
- 1. Land a slice that bumps measured coverage.
84
- 2. Wait until two-three Codecov runs report a stable value (no
85
- per-PR jitter).
86
- 3. Edit `MIN_COVERAGE_PCT` upward, ideally by ≤15 percentage points
87
- per bump.
88
- 4. Note the floor change in the commit message + this page.
89
-
90
- ### Why not the 95% target from #883
91
-
92
- The roadmap originally targeted ≥95% measured. The current xtrace-only
93
- measurement is **59.32%** on this codebase. The remaining gap is largely
94
- structural:
95
-
96
- - **System-mutation surface** — large parts of the repo orchestrate
97
- real OS state (`chezmoi apply`, `gpg`, `pass`/`age` keystores,
98
- `gsettings`, signal-driven app reload, `git reset --hard`,
99
- filesystem backups). Exercising these requires either a destroyable
100
- sandbox (Docker / VM) or per-call mocks for every system tool.
101
- - **Platform-gated branches** — every diagnostic and theme script
102
- has Darwin / Linux / WSL forks. The xtrace runner only sees the
103
- fork for the host it ran on; the others remain "uncovered"
104
- forever from that one run's perspective. CI runs both macOS and
105
- Linux but reports them separately.
106
- - **Interactive UIs** — `fzf`, `gum`, `cmatrix`, `niri`, and the
107
- Ghostty/Tmux reload helpers can't return to the test under
108
- `bash -x` within a timeout budget. These are excluded at the
109
- aggregator level.
110
- - **Animated demo helpers** — same as interactive UIs.
111
-
112
- `tools/ci/run-coverage.sh` has a `SKIP_PATHS` set that removes
113
- genuinely-untestable scripts from the lcov denominator. Within the
114
- files that remain, individual mutation-only function bodies are
115
- fenced with `# LCOV_EXCL_START` / `# LCOV_EXCL_STOP` and a one-line
116
- rationale comment. Every exclusion line names the reason (`rm -rf
117
- real $HOME`, `signals live apps`, `gpg keystore`, etc.) so future
118
- maintainers can re-evaluate if the test infrastructure changes.
119
-
120
- The graduated approach in this doc replaces the original 95% target.
121
- The honest floor is the achievable one.
122
-
123
- ## Running locally
124
-
125
- ```bash
126
- bash tools/ci/run-coverage.sh # Linux or macOS
127
-
128
- # Output:
129
- # coverage/traces/<file>.trace — per-test xtrace logs
130
- # coverage/lcov.info — lcov-format report Codecov ingests
131
- ```
132
-
133
- Open `coverage/lcov.info` in any lcov visualizer
134
- (`genhtml coverage/lcov.info -o coverage/html`) for the per-file
135
- heatmap.
136
-
137
- ## Triaging a regression
138
-
139
- When the `Coverage / kcov` PR check fails:
140
-
141
- 1. Pull the workflow's `coverage-lcov` artifact (30-day retention).
142
- 2. Compare against the previous main run by downloading its
143
- `coverage-lcov` artifact too.
144
- 3. Identify the file(s) where the line-coverage dropped.
145
- 4. Either:
146
- - Add tests covering the new code, or
147
- - If the new code is provably unreachable in the test corpus
148
- (e.g., a platform-specific branch only macOS tests exercise),
149
- update the test suite to invoke it. Don't carve out global
150
- exemptions — they accumulate.
151
-
152
- ## Why not 100% yet
153
-
154
- The previous workflow advertised "100% Coverage" without measuring
155
- anything. Going from `0% measured` to `100% enforced` overnight is a
156
- recipe for either:
157
-
158
- - Suppressing the gate to ship anything ("just lower the threshold,
159
- we'll fix it later"), or
160
- - Padding the test suite with assertions that don't actually
161
- exercise the code under test.
162
-
163
- So this page documents a graduated approach: start with a measured
164
- floor at 50%, ratchet upward as the test surface catches up to the
165
- code surface. The previous aspirational "100%" labels in CI/job
166
- names + branch-protection contexts have been renamed to match
167
- reality (`Test / Unit Tests` instead of `Test / Unit Tests (100%
168
- Coverage)`).
169
-
170
- ## Codecov integration
171
-
172
- Codecov (free OSS tier) is the canonical badge + PR-comment source.
173
- The upload uses the
174
- [`codecov/codecov-action`](https://github.com/codecov/codecov-action)
175
- in tokenless mode (works for public repos out of the box; private
176
- repos need `CODECOV_TOKEN`).
177
-
178
- The Codecov GitHub App posts a status check on each PR with the
179
- line-by-line diff coverage. Combine with this workflow's job-level
180
- threshold to get two independent signals.
181
-
182
- ## Excluded paths
183
-
184
- `tools/ci/run-coverage.sh` excludes:
185
-
186
- - `tests/**` itself (don't measure coverage of the tests).
187
- - `.git/`, `node_modules/`.
188
- - Paths matched by `KCOV_EXCLUDE_PATTERN` (defaults reasonable).
189
-
190
- Included paths (`KCOV_INCLUDE_PATH`):
191
-
192
- - `scripts/`
193
- - `.chezmoitemplates/functions/`
194
- - `dot_local/bin/`
195
-
196
- Adjust via the env vars at the top of `run-coverage.sh`.
197
-
198
- ## References
199
-
200
- - [Bash xtrace + PS4 + BASH_ENV docs](https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html).
201
- - [`tools/ci/run-coverage.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/run-coverage.sh).
202
- - [`.github/workflows/coverage.yml`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/coverage.yml).
203
- - Issue [#856](https://github.com/sebastienrousseau/dotfiles/issues/856) (closed) /
204
- [#883](https://github.com/sebastienrousseau/dotfiles/issues/883) (coverage roadmap).
@@ -1,107 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # Drift Detection & Remediation
6
-
7
- This page documents how this repo detects drift between the chezmoi
8
- source-of-truth and what's actually deployed on a host, how to read
9
- the report, and how to remediate. Managed under
10
- [#875](https://github.com/sebastienrousseau/dotfiles/issues/875).
11
-
12
- ## What "drift" means here
13
-
14
- Four distinct classes are tracked. The same `dot drift` command (and
15
- the nightly CI workflow) surfaces all four.
16
-
17
- | Class | Meaning | How to detect | Typical fix |
18
- |---|---|---|---|
19
- | **Managed drift** | A chezmoi-managed file's deployed copy differs from what a fresh `chezmoi apply` would produce. The standard case. | `chezmoi status` (M / MM / A / R rows) | Either update the source so apply is idempotent, or accept the deployed change and re-add. |
20
- | **Untracked source** | The chezmoi source tree contains files git doesn't know about — usually in-progress local edits that haven't been committed. | `git -C <source-dir> ls-files --others --exclude-standard` | Commit, stash, or `.gitignore` the file. |
21
- | **Orphan deployed** | A file under `$HOME` was previously chezmoi-managed but the source has since been deleted. Chezmoi no longer claims it, so a fresh apply leaves it behind silently. | Inventoried in `${XDG_STATE_HOME}/dotfiles/orphans` (populated by `dot heal` / `dot drift`) | `chezmoi remove --force` the path, or re-add the source if the file is still wanted. |
22
- | **Stale source** | The deployed file is *newer* than its source. The next `chezmoi apply` would silently revert the user's hand-edit. Reverse-drift trap. | Compare mtimes for each managed target vs the resolved source-path | Promote the deployed change into the source (`chezmoi re-add`) or revert the deployed file. |
23
-
24
- ## Reading the report
25
-
26
- ```bash
27
- dot drift # human-readable (uses the ui.sh formatting)
28
- dot drift --json # single JSON object — used by the nightly workflow
29
- dot drift --diff # also print `chezmoi diff` for managed drift
30
- ```
31
-
32
- JSON shape:
33
-
34
- ```json
35
- {
36
- "managed_drift": 0,
37
- "untracked_source": 0,
38
- "orphan_deployed": 0,
39
- "stale_source": 0,
40
- "total": 0
41
- }
42
- ```
43
-
44
- Exit code: `0` if every class is clean; `1` if any drift is found;
45
- `2` if a prerequisite (chezmoi, git) is missing.
46
-
47
- ## How the nightly check works
48
-
49
- `.github/workflows/drift-detection.yml` runs `dot drift --json` against
50
- a fresh checkout of `main` every day at 04:00 UTC. If `total != 0`
51
- it opens (or updates) a tracking issue labelled
52
- `type:chore + priority:medium` with the JSON summary, full
53
- `chezmoi diff`, and `chezmoi status` attached as a workflow artifact.
54
-
55
- The workflow itself ignores the failing exit code (`|| true`) for the
56
- dashboard step — the actionable signal is the issue, not a red CI
57
- indicator.
58
-
59
- ## Force a local drift check
60
-
61
- ```bash
62
- dot drift # default — what you'd run before opening a PR
63
- dot drift --json | jq '.' # for scripting / dashboards
64
- ```
65
-
66
- To force a full re-comparison after a tool upgrade or a force-apply:
67
-
68
- ```bash
69
- chezmoi apply --refresh-externals # refetch external sources
70
- dot drift # re-scan
71
- ```
72
-
73
- ## Historical incidents
74
-
75
- ### 2026-05-12 — `core.hooksPath` drift
76
-
77
- The deployed `~/.gitconfig` contained a `hooksPath = ~/.git-templates/hooks`
78
- line that wasn't in `dot_gitconfig.tmpl`. The line had been added
79
- directly to the deployed file (manually, not via chezmoi), then sat
80
- silently for weeks while the global `commit-msg` hook (at
81
- `~/.config/git/hooks/commit-msg`) never fired — because `hooksPath`
82
- was pointing at an empty directory. The result: every commit
83
- authored on this machine silently shipped without the
84
- `Assisted-by:` trailer mandated by `dot_claude/CLAUDE.md`.
85
-
86
- Detection failure: no nightly drift check existed at the time.
87
-
88
- Resolution: commit `f060683b` brought `hooksPath` into the chezmoi
89
- template; this drift class is exactly what the new `stale_source`
90
- signal catches going forward.
91
-
92
- This incident is the canonical worked example for why the four-class
93
- report exists rather than just `chezmoi status`.
94
-
95
- ## Configuration surface
96
-
97
- | Variable | Default | Purpose |
98
- |---|---|---|
99
- | `DOTFILES_DRIFT_SHOW_DIFF` | `0` | When `1`, append `chezmoi diff` (excluding scripts/install/tests) to the report. Equivalent to `--diff`. |
100
-
101
- ## References
102
-
103
- - `scripts/diagnostics/drift-dashboard.sh` — the dashboard itself.
104
- - `.github/workflows/drift-detection.yml` — the nightly scanner.
105
- - `tests/unit/diagnostics/test_drift_dashboard.sh` — JSON contract test.
106
- - `dot heal` / `dot rollback` — drift remediation commands.
107
- - Issue [#875](https://github.com/sebastienrousseau/dotfiles/issues/875).