@sebastienrousseau/dotfiles 0.2.518 → 0.2.520

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 (163) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +1164 -164
  3. package/docs/ARCHITECTURE.md +117 -0
  4. package/docs/COPYRIGHT +1 -1
  5. package/docs/ECOSYSTEM.md +220 -0
  6. package/docs/GOLD-STANDARD-AUDIT.md +352 -0
  7. package/docs/GOVERNANCE.md +1 -1
  8. package/docs/MAINTAINERS.md +1 -1
  9. package/docs/MINIMUM-TOOLCHAIN.md +100 -0
  10. package/docs/README.md +1 -1
  11. package/docs/STRUCTURE.md +1 -1
  12. package/docs/architecture/ARCHITECTURE.md +11 -108
  13. package/docs/architecture/REPO_LAYOUT.md +4 -4
  14. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +121 -0
  15. package/docs/index.md +3 -3
  16. package/docs/manual/00-introduction.md +1 -1
  17. package/docs/manual/03-reference/01-dot-cli.md +28 -3
  18. package/docs/manual/command-index.md +24 -4
  19. package/docs/manual/concept-index.md +2 -0
  20. package/docs/migration/README.md +81 -0
  21. package/docs/migration/from-bare-git-repo.md +156 -0
  22. package/docs/migration/from-gnu-stow.md +165 -0
  23. package/docs/migration/from-plain-chezmoi.md +148 -0
  24. package/docs/migration/from-yadm.md +187 -0
  25. package/docs/operations/PERFORMANCE_BUDGETS.md +196 -0
  26. package/docs/operations/REGISTRY.md +1 -1
  27. package/docs/operations/RELEASE_PIPELINE.md +4 -4
  28. package/docs/operations/TESTING.md +3 -3
  29. package/docs/operations/TRACEABILITY.md +1 -0
  30. package/docs/packaging.md +222 -0
  31. package/docs/reference/FEATURE-MATRIX.md +646 -0
  32. package/docs/reference/TOOLS.md +1 -1
  33. package/docs/reference/UTILS.md +1 -0
  34. package/docs/security/COMPLIANCE.md +1 -1
  35. package/docs/security/DISCLOSURE.md +4 -4
  36. package/docs/security/FUZZING.md +113 -18
  37. package/docs/security/KEY_ROTATION.md +1 -1
  38. package/docs/security/SCORECARD.md +3 -3
  39. package/docs/security/VERIFY_RELEASE.md +2 -2
  40. package/install.sh +6 -6
  41. package/package.json +2 -2
  42. package/scripts/ci/check-copyright-headers.sh +1 -1
  43. package/scripts/ci/check-shell-preamble.sh +1 -1
  44. package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
  45. package/scripts/demo/record.sh +1 -1
  46. package/scripts/diagnostics/a2a-conformance.sh +1 -1
  47. package/scripts/diagnostics/alias-governance.sh +30 -3
  48. package/scripts/diagnostics/aliases-cheatsheet.sh +1 -1
  49. package/scripts/diagnostics/aliases-manifest.sh +1 -1
  50. package/scripts/diagnostics/attest-verify.sh +147 -0
  51. package/scripts/diagnostics/benchmark.sh +1 -1
  52. package/scripts/diagnostics/conflicts.sh +1 -1
  53. package/scripts/diagnostics/doctor-unified.sh +6 -2
  54. package/scripts/diagnostics/doctor.sh +56 -10
  55. package/scripts/diagnostics/drift-dashboard.sh +3 -2
  56. package/scripts/diagnostics/health.sh +43 -10
  57. package/scripts/diagnostics/history-analysis.sh +1 -1
  58. package/scripts/diagnostics/mcp-doctor.sh +2 -2
  59. package/scripts/diagnostics/perf.sh +1 -1
  60. package/scripts/diagnostics/scorecard.sh +3 -2
  61. package/scripts/diagnostics/secret-governance.sh +1 -1
  62. package/scripts/diagnostics/security-score.sh +1 -1
  63. package/scripts/diagnostics/smoke-test.sh +1 -1
  64. package/scripts/diagnostics/snapshot.sh +1 -1
  65. package/scripts/diagnostics/verify.sh +1 -1
  66. package/scripts/diagnostics/verify_state.sh +1 -1
  67. package/scripts/diagnostics/version-locks.sh +1 -1
  68. package/scripts/diagnostics/workstation-attestation.sh +26 -1
  69. package/scripts/dot/commands/agent.sh +64 -14
  70. package/scripts/dot/commands/agents.sh +24 -8
  71. package/scripts/dot/commands/ai.sh +20 -7
  72. package/scripts/dot/commands/aliases.sh +1 -1
  73. package/scripts/dot/commands/appearance.sh +1 -1
  74. package/scripts/dot/commands/completion.sh +42 -5
  75. package/scripts/dot/commands/core.sh +1 -1
  76. package/scripts/dot/commands/diagnostics.sh +1 -1
  77. package/scripts/dot/commands/env-emit.sh +1 -1
  78. package/scripts/dot/commands/fleet.sh +41 -18
  79. package/scripts/dot/commands/init.sh +1 -1
  80. package/scripts/dot/commands/lint.sh +1 -1
  81. package/scripts/dot/commands/manual.sh +1 -1
  82. package/scripts/dot/commands/meta.sh +115 -10
  83. package/scripts/dot/commands/patterns.sh +1 -1
  84. package/scripts/dot/commands/registry.sh +43 -7
  85. package/scripts/dot/commands/restore.sh +1 -1
  86. package/scripts/dot/commands/secrets.sh +1 -1
  87. package/scripts/dot/commands/security.sh +1 -1
  88. package/scripts/dot/commands/tools.sh +21 -7
  89. package/scripts/fonts/install-nerd-fonts.sh +1 -1
  90. package/scripts/fonts/patch-fonts.sh +1 -1
  91. package/scripts/git-hooks/install.sh +1 -1
  92. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  93. package/scripts/lib/secrets_provider.sh +19 -4
  94. package/scripts/nvim/headless-upgrade.lua +81 -0
  95. package/scripts/ops/ai-setup.sh +1 -1
  96. package/scripts/ops/bundle.sh +1 -1
  97. package/scripts/ops/chaos.sh +1 -1
  98. package/scripts/ops/chezmoi-apply.sh +1 -1
  99. package/scripts/ops/chezmoi-diff.sh +1 -1
  100. package/scripts/ops/chezmoi-remove.sh +3 -3
  101. package/scripts/ops/chezmoi-update.sh +6 -2
  102. package/scripts/ops/heal-chezmoi.sh +1 -1
  103. package/scripts/ops/heal-system.sh +1 -1
  104. package/scripts/ops/heal-tools.sh +1 -1
  105. package/scripts/ops/heal.sh +1 -1
  106. package/scripts/ops/post-apply-repair.sh +1 -1
  107. package/scripts/ops/prewarm.sh +1 -1
  108. package/scripts/ops/release.sh +1 -1
  109. package/scripts/ops/rollback.sh +11 -2
  110. package/scripts/ops/setup.sh +1 -1
  111. package/scripts/ops/teleport.sh +1 -1
  112. package/scripts/qa/check-feature-matrix.sh +296 -0
  113. package/scripts/qa/check-version-consistency.sh +7 -119
  114. package/scripts/qa/coverage-baseline.sh +1 -1
  115. package/scripts/qa/docs-coverage.sh +9 -3
  116. package/scripts/qa/examples-coverage.sh +1 -1
  117. package/scripts/qa/reliability-audit.sh +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +1 -1
  119. package/scripts/qa/traceability-coverage.sh +9 -2
  120. package/scripts/qa/validate-examples.sh +66 -3
  121. package/scripts/qa/wsl-contract.sh +1 -1
  122. package/scripts/secrets/age-init.sh +1 -1
  123. package/scripts/secrets/create-secrets-file.sh +1 -1
  124. package/scripts/secrets/encrypt-ssh-key.sh +1 -1
  125. package/scripts/security/backup.sh +1 -1
  126. package/scripts/security/check-disclosure-key-expiry.sh +1 -1
  127. package/scripts/security/dns-doh.sh +1 -1
  128. package/scripts/security/encryption-check.sh +1 -1
  129. package/scripts/security/enforce-policies.sh +315 -98
  130. package/scripts/security/firewall.sh +1 -1
  131. package/scripts/security/lock-configs.sh +1 -1
  132. package/scripts/security/lock-screen.sh +1 -1
  133. package/scripts/security/manage-secrets.sh +1 -1
  134. package/scripts/security/ssh-cert.sh +1 -1
  135. package/scripts/security/telemetry-kill.sh +1 -1
  136. package/scripts/security/usb-safety.sh +1 -1
  137. package/scripts/theme/apply-gnome-theme.sh +1 -1
  138. package/scripts/theme/extract-heic-frames.sh +1 -1
  139. package/scripts/theme/extract-theme.py +284 -6
  140. package/scripts/theme/install-boot-logo.sh +1 -1
  141. package/scripts/theme/install-catppuccin-themes.sh +1 -1
  142. package/scripts/theme/install-cursors.sh +1 -1
  143. package/scripts/theme/install-file-icons.sh +1 -1
  144. package/scripts/theme/install-grub-theme.sh +1 -1
  145. package/scripts/theme/install-lock-icon.sh +1 -1
  146. package/scripts/theme/merge-wallpaper.sh +1 -1
  147. package/scripts/theme/rebuild-themes.sh +64 -5
  148. package/scripts/theme/switch.sh +46 -19
  149. package/scripts/theme/wallpaper-rotate.sh +1 -1
  150. package/scripts/theme/wallpaper-sync.sh +1 -1
  151. package/scripts/tools/cmatrix.sh +1 -1
  152. package/scripts/tools/detect-collisions.py +1 -1
  153. package/scripts/tools/emoji-picker.sh +1 -1
  154. package/scripts/tools/figlet-banner.sh +1 -1
  155. package/scripts/tools/log-rotate.sh +1 -1
  156. package/scripts/tools/lolcat-wrap.sh +1 -1
  157. package/scripts/tools/pipes.sh +1 -1
  158. package/scripts/tuning/linux.sh +1 -1
  159. package/scripts/tuning/macos.sh +1 -1
  160. package/scripts/uninstall.sh +1 -1
  161. package/scripts/verify-release-versions +156 -0
  162. package/scripts/version-sync.sh +63 -3
  163. package/LICENSE +0 -21
package/CHANGELOG.md CHANGED
@@ -2,6 +2,195 @@
2
2
 
3
3
  This file documents all notable changes to this project.
4
4
 
5
+ ## Unreleased
6
+
7
+ ## v0.2.520 — 2026-09-13
8
+
9
+ ### Added
10
+
11
+ - `docs/guides/MACOS_ICLOUD_SYMLINKS.md`, documenting what the hook does, the
12
+ cases it refuses, and how to resolve each one by hand.
13
+ - A safety regression suite and a unit suite for the hook, covering the refusal
14
+ paths that the destructive version never had.
15
+ - Performance budgets for the shell startup path, with the budget table and its
16
+ rationale in `docs/operations/PERFORMANCE_BUDGETS.md`.
17
+ - A gate-integrity regression test asserting that the safety checks cannot be
18
+ disabled without a test failing.
19
+ - `dot mcp serve` — a real stdio Model Context Protocol server, where the
20
+ published card had previously described one that did not exist. Full
21
+ lifecycle with version negotiation across three protocol revisions,
22
+ `tools/list`, `tools/call`, resources and logging, with proper JSON-RPC
23
+ error objects. All four tools are read-only and run from closed argument
24
+ vectors without a shell; the mutating operations are deliberately
25
+ unreachable. Go, standard library only.
26
+ - A feature matrix covering every routable command, flag, environment
27
+ variable and config key, each row naming the regression test, benchmark,
28
+ example and manual section that covers it. The gate fails when a command
29
+ gains no row, or when a row names a test or example that does not exist,
30
+ so coverage cannot be claimed in the table without being written.
31
+ - `dot attest --verify` (`--json|-j`, `--max-age|-a`): checks a workstation
32
+ evidence record against the attestation policy by running `lib/wasm-tools`
33
+ as WebAssembly under `wasmtime`. The module gets stdin, stdout and a clock
34
+ and nothing else — no filesystem, no network, no environment — so the
35
+ verdict does not depend on the tools installed on the machine under review.
36
+ Eleven checks cover evidence freshness, the required identity fields, the
37
+ git signing configuration, the agent profile and MCP health.
38
+ - `scripts/diagnostics/attest-verify.sh`, the caller behind that flag: it
39
+ resolves the module and the runtime, builds the module on demand when a
40
+ Rust toolchain is present, and forwards an evidence file, a pipe, or a
41
+ fresh `dot attest --json`.
42
+ - `dot-sys` gained a real `wasm32-wasip1` target, a general JSON reader
43
+ (`dot_sys::json`), an RFC 3339 UTC parser (`dot_sys::time`), the policy
44
+ itself (`dot_sys::attest`), a `verify` subcommand, `--help` and
45
+ `--version`, two more fuzz targets (`fuzz_json`, `fuzz_verify`), a fourth
46
+ example, a second benchmark suite, and `tests/wasm.rs`, which executes the
47
+ built module in a runtime rather than merely inspecting the artefact.
48
+ - `rust.yml` gained a `wasm` job: clippy for the target, a build, an
49
+ execution assertion, the WebAssembly integration tests, the shell caller's
50
+ test, and the `.wasm` uploaded as an artefact.
51
+
52
+ ### Changed
53
+
54
+ - Bash line coverage went from 59% to **98.14%**. Roughly half of that came
55
+ from fixing the measurement rather than adding tests: untraceable lines sat
56
+ in the denominator, 540 of 706 test files discarded their traces through
57
+ `2>&1`, silent timeout kills were counted as passes, and the sweep's `PS4`
58
+ truncated at 100 characters so the figure depended on how long your checkout
59
+ path was. Correcting those alone moved it 59.36% to 72.29% with no new test
60
+ written. Both Go modules are at 100%, where fuzzing found four defects.
61
+ - The terminal palette now takes more than one colour from the wallpaper.
62
+ `term.bg` had two distinct values across all 228 themes; it now has 36, and
63
+ the status bar carries a secondary and tertiary alongside the accent. The
64
+ background is *tinted* rather than replaced — lightness is unchanged, so the
65
+ low-eye-strain surface the engine was built around is preserved, and
66
+ `DOTFILES_TERM_TINT=0` restores the flat neutrals.
67
+ - Rust is no longer managed by mise. Its plugin exports `RUSTUP_TOOLCHAIN`,
68
+ which silently overrides `rust-toolchain.toml` in every project — a
69
+ repository pinned to 1.98.0 was being built with 1.97.1, and a local "all
70
+ green" said nothing about CI. rustup governs instead, so each project's own
71
+ pin is honoured.
72
+ - `~/.cargo/config.toml` no longer sets a global `target-dir`. Cargo takes an
73
+ exclusive lock on it, so every repository sharing one path serialised: a
74
+ build in one project blocked `cargo test` in another, and cargo prints
75
+ nothing while it waits, so it read as a hang. sccache recovers the shared
76
+ dependency cache without the lock.
77
+ - mise's tool directories are promoted above Homebrew and the shims on `PATH`,
78
+ fused into the existing dedup pass rather than added as a second walk.
79
+
80
+ ### Fixed
81
+
82
+ - AI provider dispatch now uses the installed CLIs' prompt modes; OpenCode
83
+ installs through its native mise backend. Noninteractive status checks no
84
+ longer open terminal pickers. Reviewed upstream installer checksums are refreshed.
85
+ - Ollama prompts and interactive chat default to `qwen3.5:4b`; set
86
+ `DOTFILES_OLLAMA_MODEL` to select another downloaded model.
87
+ - Neovim configures the current Treesitter and mason-lspconfig APIs, preserves
88
+ custom debugger configurations, and uses Mason's Python debug adapter.
89
+ - Health checks recognize named SSH key pairs and the configured age identity;
90
+ doctor includes Codex and reports absent optional AI providers as information.
91
+ - Homebrew's rustup is available in the shared shell and Fish paths. Go uses
92
+ its system temporary directory instead of a potentially missing custom directory.
93
+ - Terminal test fixtures explicitly control `NO_COLOR`.
94
+
95
+ - `dot doctor`, `dot health`, `dot fleet`, the scorecard and the drift dashboard
96
+ no longer report permanent drift on macOS. The iCloud symlink hook is a
97
+ `run_before_` script that chezmoi lists as pending on every apply by design,
98
+ which made plain `chezmoi verify` exit 1 and every `chezmoi status` line
99
+ count read 1 on a fully synchronised machine. Those callers now pass
100
+ `--exclude=always`; files, directories, symlinks and `run_once`/`run_onchange`
101
+ scripts still count as drift.
102
+ - markdown-preview.nvim no longer blocks `dot upgrade`'s plugin sync. Its build
103
+ step ran `cd app && npm install`, which rewrote the upstream `app/yarn.lock`
104
+ on every build and left the checkout dirty, so Lazy refused to update it.
105
+ The spec now uses upstream's `mkdp#util#install`, which downloads the
106
+ prebuilt preview server and leaves the checkout untouched.
107
+
108
+ - Replaced the destructive mechanism behind the macOS iCloud symlink hook. The
109
+ previous implementation could remove real content from `~/Documents` and
110
+ `~/Desktop`; the replacement only ever removes an empty directory, refuses to
111
+ act on a non-empty one, and leaves an existing correct symlink untouched.
112
+ - Reported what it declined to do, and why, instead of failing silently.
113
+ - The health-probe record no longer claims `"engine": "wasm"` when it was
114
+ produced by a host binary. `ENGINE` is now `cfg`-selected, so the field
115
+ states where the bytes were actually computed: `wasm` from the module,
116
+ `native` from the host build. This is what makes the field evidence rather
117
+ than a label, and both halves are asserted in CI.
118
+ - Corrected the documentation that described `lib/wasm-tools` as vendored
119
+ third-party tooling or as "not actually WebAssembly": `docs/ECOSYSTEM.md`,
120
+ `docs/architecture/REPO_LAYOUT.md`, `docs/STRUCTURE.md`,
121
+ `docs/ARCHITECTURE.md`, `docs/reference/TOOLS.md` and `REUSE.toml`.
122
+ - `workbench.colorTheme` had been commented out on every machine this was
123
+ ever applied to. A template newline was chomped, welding the setting onto
124
+ the comment above it. Two thirds of the theme labels also named themes no
125
+ extension registers — "Tokyonight Mocha" and "Everforest Latte", where
126
+ Mocha and Latte are Catppuccin flavours rather than a general dark/light
127
+ suffix. The editor is now pinned to Catppuccin, and the icon theme ids are
128
+ the ones the extension actually declares.
129
+ - Twelve documented defects, each with a regression test proven to fail
130
+ against the unfixed code first: `dot theme set` aborting before its picker,
131
+ `dot fleet namespace set` reporting success while writing nothing,
132
+ `dot agent delegate` requiring a GNU `timeout` absent from stock macOS, a
133
+ registry cache keyed by path so changing the URL served a stale index for
134
+ six hours, and `dot doctor --audit` routing to a script not in the tree.
135
+ Two of the reported findings turned out to be wrong, and correcting them
136
+ was more useful than fixing them.
137
+ - `chezmoi apply` no longer silently discards edits made directly in `$HOME`.
138
+ Local drift is captured into the source instead of overwritten.
139
+ - macOS home folders (`~/Desktop`, `~/Documents`, `~/Public` and the rest) are
140
+ excluded from chezmoi management entirely, as a second layer beneath the
141
+ iCloud hook's own refusals.
142
+ - `docs-coverage.sh` and `traceability-coverage.sh` stopped masking their own
143
+ exit codes, so a failing gate now fails.
144
+ - `dot benchmark` is routed. Every layer but the router already had it.
145
+ - `dot upgrade` no longer hangs on a question nobody can see. Each phase's
146
+ output is captured to a log, so when `chezmoi update` met a locally edited
147
+ managed file it asked "has changed since chezmoi last wrote it?" on the
148
+ terminal's tty while the run looked merely slow. The step runner now closes
149
+ stdin and passes `--no-tty`, so the prompt fails fast, the step is marked
150
+ failed, and the surfaced tail names the fix (`chezmoi apply` to choose per
151
+ file, or `chezmoi update --force`).
152
+ - `dot upgrade`'s Neovim phase actually syncs plugins. `nvim -l` does not
153
+ load `init.lua`, so `scripts/nvim/headless-upgrade.lua` never found
154
+ lazy.nvim and logged "skipping plugin update" on every run. The phase now
155
+ passes `-u` with the user's `init.lua` (honouring `XDG_CONFIG_HOME` and
156
+ `NVIM_APPNAME`) ahead of `-l`, and reports a visible skip when there is no
157
+ config to load.
158
+ - `dot doctor` no longer warns about a missing `cargo-install-update` on a
159
+ machine that has no `cargo` for it to run through; the check now reports
160
+ "not needed" there and keeps warning where a Rust toolchain is present.
161
+
162
+ ## v0.2.519 — 2026-08-13
163
+
164
+ ### Added
165
+
166
+ - Implemented the Model Context Protocol server the discovery card has always
167
+ advertised. `dot mcp serve` now speaks JSON-RPC 2.0 over newline-delimited
168
+ frames on stdin/stdout: `initialize`, `initialized`, `ping`, `tools/list`,
169
+ `tools/call`, `resources/list`, `resources/read`,
170
+ `resources/templates/list`, `logging/setLevel`, and a clean shutdown on EOF.
171
+ It is a third Go module, `defaults/dot_local/share/dot-mcp`, deployed to
172
+ `~/.local/bin/dot-mcp`.
173
+ - Served four read-only tools — `mcp-doctor`, `agent-mode`,
174
+ `workstation-attestation` and `fleet-status` — each a fixed `dot` argument
175
+ vector run without a shell, and five read-only resources covering the MCP
176
+ policy, the MCP registry, the agent profiles and both discovery cards.
177
+ Mutating paths are deliberately not exposed.
178
+
179
+ ### Changed
180
+
181
+ - Corrected `.well-known/mcp/server-card.json` to describe the server that now
182
+ exists: the stdio transport is `dot mcp serve` rather than the one-shot
183
+ `dot mcp --strict --json` audit, and the declared tools, resources and
184
+ capabilities are pinned to the running registry by tests that fail in both
185
+ directions. `entrypoints.mcp` in the A2A card was updated to match.
186
+
187
+ ### Fixed
188
+
189
+ - Rendered the Nerd Font check as a chezmoi template so its verified-download
190
+ dependency is resolved before an apply begins. This avoids an unreliable
191
+ nested `chezmoi source-path` call while chezmoi is executing the hook.
192
+ - Added a real-apply regression test for the font hook's source resolution.
193
+
5
194
  ## v0.2.518 — 2026-08-13
6
195
 
7
196
  ### Changed
@@ -288,9 +477,11 @@ headers across the source tree.
288
477
  to `batcat`/`fdfind`; a missing apt/dnf/pacman warns loudly instead of silently
289
478
  installing nothing; WSL gets a best-effort `wslu` install for `wslview`. fish
290
479
  and nushell now export `EDITOR`/`VISUAL`/`PAGER` to match the zsh/bash profile.
480
+ <!-- REUSE-IgnoreStart -->
291
481
  - **Licensing:** added `SPDX-License-Identifier: MIT` headers (SPDX-first / REUSE
292
482
  form) and normalized the copyright line to `Sebastien Rousseau` across 831
293
483
  repo-only source files; dropped the contradictory `All rights reserved.`.
484
+ <!-- REUSE-IgnoreEnd -->
294
485
  - **README** — fixed the OpenSSF Best Practices badge (was linking to the
295
486
  new-project form with a static label; now the live `cii/percentage/12840`
296
487
  endpoint linked to the real project).