@sebastienrousseau/dotfiles 0.2.520 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +43 -37
- package/install.sh +76 -10
- package/package.json +7 -7
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/ECOSYSTEM.md +0 -220
- package/docs/GOLD-STANDARD-AUDIT.md +0 -352
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/MINIMUM-TOOLCHAIN.md +0 -100
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -20
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -475
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -175
- package/docs/manual/concept-index.md +0 -170
- package/docs/manual/index.md +0 -66
- package/docs/migration/README.md +0 -81
- package/docs/migration/from-bare-git-repo.md +0 -156
- package/docs/migration/from-gnu-stow.md +0 -165
- package/docs/migration/from-plain-chezmoi.md +0 -148
- package/docs/migration/from-yadm.md +0 -187
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -44
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/packaging.md +0 -222
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURE-MATRIX.md +0 -646
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -243
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -209
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -165
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/attest-verify.sh +0 -147
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -43
- package/scripts/diagnostics/doctor.sh +0 -797
- package/scripts/diagnostics/drift-dashboard.sh +0 -203
- package/scripts/diagnostics/health.sh +0 -656
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -120
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -212
- package/scripts/dot/commands/agent.sh +0 -535
- package/scripts/dot/commands/agents.sh +0 -352
- package/scripts/dot/commands/ai.sh +0 -600
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -171
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -711
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -438
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -455
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -570
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -200
- package/scripts/nvim/headless-upgrade.lua +0 -81
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -67
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -613
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-feature-matrix.sh +0 -296
- package/scripts/qa/check-version-consistency.sh +0 -12
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -118
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -124
- package/scripts/qa/validate-examples.sh +0 -90
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -552
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -1020
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -603
- package/scripts/theme/switch.sh +0 -476
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/verify-release-versions +0 -156
- package/scripts/version-sync.sh +0 -714
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- package/templates/projects/python/tests/test_basic.py +0 -3
|
@@ -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).
|
package/docs/operations/DRIFT.md
DELETED
|
@@ -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).
|