@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
@@ -0,0 +1,117 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # Architecture
6
+
7
+ Core architectural decisions and system design of the dotfiles shell distribution.
8
+
9
+ ---
10
+
11
+ ## Philosophy
12
+
13
+ - **XDG-First**: Configuration lives under `~/.config/` to keep the home directory clean.
14
+ - **Multi-Shell**: First-class support for Zsh, Fish, and Nushell with a shared logic core.
15
+ - **Fast Startup**: Heavy features are deferred or autoloaded to keep the first prompt under 50ms.
16
+ - **Deterministic**: Nix Flakes provide bit-for-bit identical environments across machines.
17
+ - **Non-Blocking**: Background daemons (Pueue) handle upgrades and builds without stalling the shell.
18
+
19
+ ## System Layout
20
+
21
+ ```text
22
+ ~/.dotfiles/
23
+ ├── dot_config/ # Managed application configurations (~/.config/)
24
+ │ ├── zsh/ # Modular Zsh rc.d architecture
25
+ │ ├── fish/ # Autoloading Fish configuration
26
+ │ ├── nushell/ # Structured data shell config
27
+ │ ├── shell/ # Shared logic (aliases, paths, functions)
28
+ │ └── ... # 50+ tool configurations (nvim, tmux, ghostty, etc.)
29
+ ├── dot_local/ # Local binaries and scripts (~/.local/bin/)
30
+ ├── .chezmoitemplates/ # Unified source for aliases, functions, and paths
31
+ ├── scripts/ # Internal libraries and diagnostics
32
+ ├── nix/ # Nix Flake for deterministic toolchains
33
+ ├── lib/wasm-tools/ # `dot-sys` crate: health probe + WebAssembly attestation verifier
34
+ └── install.sh # Universal bootstrap script (zero dependencies)
35
+ ```
36
+
37
+ ---
38
+
39
+ ## Shell Startup Strategies
40
+
41
+ ### Shared: `_cached_eval`
42
+
43
+ Across Zsh, Fish, and Bash, an idempotent caching wrapper avoids redundant tool initialization (Starship, Zoxide, Atuin).
44
+
45
+ 1. **Intercept** — check if a cached version of the tool's `eval` output exists in `~/.cache/shell/`.
46
+ 2. **Validate** — compare the cache timestamp against the tool binary's mtime.
47
+ 3. **Bypass** — if valid, `source` the cached text directly, saving 20-50ms per tool.
48
+
49
+ ### Lazy-Hydration Model
50
+
51
+ To reach a fluid first-prompt target (< 50ms), the shell uses a three-phase startup:
52
+
53
+ 1. **Phase 1 (Visual Paint)** — render the prompt immediately using static escape codes.
54
+ 2. **Phase 2 (Async Hydration)** — dispatch tool initializations (mise, atuin, etc.) to background workers.
55
+ 3. **Phase 3 (On-Demand Activation)** — environment hydration occurs on first user interaction or after 500ms of idle time.
56
+
57
+ ---
58
+
59
+ ## Artifact Mode
60
+
61
+ A minimal environment triggered by `DOTFILES_ARTIFACT_MODE=1`.
62
+
63
+ - **Minimalist UI** — strips prompt complexity, leaving only a green `->`.
64
+ - **Intelligence Surface** — an async Bento-style dashboard rendered via `bento.sh` that provides environment context (Node version, cloud status, Git health) without blocking the main thread.
65
+ - **Redraw Signaling** — uses `SIGWINCH` to return control after background hydration completes.
66
+
67
+ ---
68
+
69
+ ## Ultra-Fast Mode
70
+
71
+ Set `DOTFILES_ULTRA_FAST=1` to skip all non-essential initialization. Only core paths, aliases, and the prompt are loaded. Useful for:
72
+
73
+ - CI/CD pipelines where full shell setup is unnecessary
74
+ - Rapid scripting sessions where startup latency matters
75
+ - Benchmarking baseline shell performance
76
+
77
+ ---
78
+
79
+ ## Debug and Trace Modes
80
+
81
+ ### DOTFILES_DEBUG=1
82
+
83
+ Enables verbose diagnostic output during shell startup. Prints which files are sourced and their load times.
84
+
85
+ ### DOTFILES_TRACE=1
86
+
87
+ Enables `set -x` tracing for the entire shell startup sequence. Output is written to `~/.local/state/dotfiles/debug.log` for post-mortem analysis.
88
+
89
+ ---
90
+
91
+ ## Function Groups (groups.json)
92
+
93
+ Functions are organized into groups defined in `.chezmoitemplates/functions/groups.json`:
94
+
95
+ | Group | Functions | Description |
96
+ |-------|-----------|-------------|
97
+ | `api` | apihealth, apilatency, apiload | API testing utilities |
98
+ | `curl` | curlheader, curlstatus, curltime, httpdebug | HTTP debugging |
99
+ | `text` | encode64, kebabcase, lowercase, titlecase, ... | Text transformation |
100
+ | `system` | environment, freespace, hostinfo, myproc, sysinfo | System introspection |
101
+ | `files` | backup, extract, hexdump, hiddenfiles, size, zipf | File operations |
102
+ | `interactive` | banner, emoji, matrix, rainbow, stopwatch | Terminal fun |
103
+ | `nav` | cdls, goto, ql | Navigation shortcuts |
104
+ | `security` | genpass, keygen, mount_read_only | Security utilities |
105
+ | `misc` | dothelp, view-source, prependpath, caffeine | Miscellaneous |
106
+
107
+ Groups are lazy-loaded: stub functions are defined at startup, and the real implementation is loaded on first invocation. This keeps startup fast while providing 52+ functions on demand.
108
+
109
+ The `groups.json` schema maps group names to arrays of relative paths (including subdirectory):
110
+
111
+ ```json
112
+ {
113
+ "group_name": ["group_name/function1.sh", "group_name/function2.sh"]
114
+ }
115
+ ```
116
+
117
+ Each `.sh` file lives in a subdirectory matching its group and defines a single function with the same name as the file (minus `.sh` extension).
package/docs/COPYRIGHT CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * 🅳🅾🆃🅵🅸🅻🅴🆂 (v0.2.518) - <https://github.com/sebastienrousseau/dotfiles>
2
+ * 🅳🅾🆃🅵🅸🅻🅴🆂 (v0.2.520) - <https://github.com/sebastienrousseau/dotfiles>
3
3
  * Made With ❤️ in London, United Kingdom
4
4
  * Designed by
5
5
  * Copyright (c) 2015-2026. All rights reserved.
@@ -0,0 +1,220 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ <!-- SPDX-License-Identifier: Apache-2.0 OR MIT -->
6
+ <!-- Copyright (c) 2015-2026 Sebastien Rousseau -->
7
+
8
+ # Ecosystem
9
+
10
+ **This is a single repository, deliberately.** The gold-standard
11
+ checklist asks multi-repo families for a CI-checked table of which
12
+ repo owns what, so the layout cannot silently drift. This page is that
13
+ table — and the argument for why the family currently has one member.
14
+
15
+ ## What lives where
16
+
17
+ | Component | Where it lives | Why not a separate repo |
18
+ |---|---|---|
19
+ | `dot` CLI | `bin/dot` + `scripts/dot/commands/` + `lib/dot/` | It is the product. Splitting it from the configuration it manages would create a version-skew problem between the CLI and the config schema it reads (`defaults/.chezmoidata.toml`). |
20
+ | Configuration tree | `defaults/` (chezmoi source, rebased via `.chezmoiroot`) | Same reason, inverted: the config depends on the CLI's template data. |
21
+ | **MCP governance surface and server** | `scripts/dot/commands/meta.sh` → `dot mcp`, server in `defaults/dot_local/share/dot-mcp/` (Go), discovery card at `.well-known/mcp/server-card.json` | See below. |
22
+ | **A2A agent card** | `.well-known/agent-card.json`, validated by `dot agent a2a-card --validate`, conformance suite via `dot agent conformance` | A static discovery document plus a subcommand. Nothing to host separately. |
23
+ | AI fleet TUI | `defaults/dot_local/share/dot-ai-tui/` (Go) | Tested by `cockpit-test.yml`. Ships as part of the config tree; useless without it. |
24
+ | `dot-ui` widgets | `defaults/dot_local/share/dot-ui/` (Go) | Tested by `dot-ui-test.yml`. Same reasoning. |
25
+ | **WASM verifier** | `lib/wasm-tools/` (Rust, crate `dot-sys`), built for `wasm32-wasip1` and run under `wasmtime` by `dot attest --verify` | See below. |
26
+ | Module registry | `docs/registry.json` + schema in `docs/schema/`, served over Pages, validated by `tools/ci/check-registry.sh` | A JSON document, not a service. |
27
+ | Packaging recipes | `pkg/` (brew, scoop, aur, nix, docker) | The *published* taps are separate repos and have to be — see the next table. |
28
+ | Documentation site | `docs/` → MkDocs → `doc.dotfiles.io` via `pages.yml` | Built from the same tree it documents; a docs repo would drift by construction. |
29
+
30
+ ## Repositories that genuinely are separate
31
+
32
+ Three, and only because the tooling requires an external repository:
33
+
34
+ | Repo | Why it must be separate | Kept in sync by |
35
+ |---|---|---|
36
+ | `sebastienrousseau/homebrew-tap` | Homebrew requires a tap repository named `homebrew-*` | `release-distribute-homebrew.yml` opens a PR per release from `pkg/brew/dot.rb` |
37
+ | `sebastienrousseau/scoop-bucket` | Scoop requires a bucket repository | `release-distribute-scoop.yml`, from `pkg/scoop/dot.json` |
38
+ | `aur.archlinux.org/dot-cli-git` | AUR is its own git host | `release-distribute-aur.yml`, from `pkg/aur/PKGBUILD` |
39
+
40
+ None of these holds source. Each is a generated artefact of a release
41
+ and is never edited by hand.
42
+
43
+ ## The three satellites the checklist asks about
44
+
45
+ ### MCP — in-repo, and now a real server
46
+
47
+ `dot mcp` has two faces, both in-repo.
48
+
49
+ The **governance surface** is the older one: `dot mcp doctor` validates
50
+ MCP policy and audits the supply chain of the MCP servers *you* have
51
+ configured, and `dot mcp registry` prints the tracked registry.
52
+
53
+ The **protocol surface** is `dot mcp serve`: a stdio MCP server speaking
54
+ JSON-RPC 2.0 over newline-delimited frames on stdin/stdout. It
55
+ implements `initialize`, `notifications/initialized`, `ping`,
56
+ `tools/list`, `tools/call`, `resources/list`, `resources/read`,
57
+ `resources/templates/list` and `logging/setLevel`, and shuts down
58
+ cleanly on EOF. It is a third Go module,
59
+ [`defaults/dot_local/share/dot-mcp`](../defaults/dot_local/share/dot-mcp/README.md),
60
+ deployed to `~/.local/bin/dot-mcp` alongside `dot-ui` and `dot-ai-tui`.
61
+
62
+ Four tools are served, all read-only, each a fixed `dot` argument vector
63
+ run without a shell: `mcp-doctor`, `agent-mode`, `workstation-attestation`
64
+ and `fleet-status`. Mutating paths (`dot mode set`, `dot attest --write`)
65
+ are deliberately not exposed, so a client cannot change this workstation
66
+ through the server. Five resources expose the MCP policy, the MCP
67
+ registry, the agent profiles and both discovery cards.
68
+
69
+ `.well-known/mcp/server-card.json` now describes exactly that. It
70
+ previously advertised a transport of `dot mcp --strict --json` — a
71
+ one-shot audit report — together with `capabilities.tools`,
72
+ `capabilities.resources`, `capabilities.logging` and a four-entry
73
+ `tools[]` array, none of which existed. A client that followed the card
74
+ would have connected, sent `initialize`, and received a report it could
75
+ not parse. Rather than narrow the card, the protocol was implemented and
76
+ the card was corrected to match:
77
+
78
+ - `transport.stdio` is `dot mcp serve`, not `dot mcp --strict --json`
79
+ — the flags kept their original meaning (strict audit, JSON output)
80
+ instead of being overloaded into a mode switch;
81
+ - the four declared tools are the four served tools, and the check runs
82
+ in both directions (`TestServerCardMatchesRegistry`);
83
+ - `capabilities.resources` and `capabilities.logging` stayed true
84
+ because both are implemented; `prompts` stays false because no
85
+ `prompts/*` handler exists, and a test fails if it is ever flipped
86
+ without one.
87
+
88
+ The A2A card's `entrypoints.mcp` was updated from `dot mcp --strict
89
+ --json` to `dot mcp serve` for the same reason.
90
+
91
+ Even so, the *repository* conclusion is unchanged: this surface belongs
92
+ in-repo. It reads the workstation's own state, its declared transport is
93
+ the CLI binary this repo ships, and a satellite would need to depend on
94
+ this repo for every datum it serves.
95
+
96
+ **When that would change:** if it grew a real network transport, or
97
+ served data about a machine other than the one it runs on, it would
98
+ become a deployable artefact with its own lifecycle — and a satellite
99
+ would then be right.
100
+
101
+ ### LSP — does not exist, and should not
102
+
103
+ There is no language server here, and none is planned.
104
+
105
+ The one file that might suggest otherwise is
106
+ `defaults/dot_config/nvim/.../lsp.lua`, and it is the opposite: that
107
+ configures Neovim as an LSP **client**, wiring up third-party servers
108
+ (`bash-language-server`, `taplo`, `marksman`) that this repo does not
109
+ author or ship. Consuming a protocol is not providing it.
110
+
111
+ An LSP satellite serves a language. This project's "language" surfaces
112
+ are shell scripts, Go templates and TOML, all three of which already
113
+ have mature servers. Writing another would mean competing with them
114
+ for the sake of completions this repo already generates natively from
115
+ the command registry via `dot completion` — a shell-completion
116
+ problem, not a language-server one.
117
+
118
+ **When that would change:** if `.chezmoidata.toml` grew a schema
119
+ complex enough that hover and go-to-definition over feature flags had
120
+ real value, an LSP over that schema would be defensible. Today the
121
+ schema is 40 lines and `docs/schema/chezmoidata.schema.json` plus
122
+ `taplo` covers it.
123
+
124
+ ### WASM — in-repo, and now actually WebAssembly
125
+
126
+ An earlier revision of this page said `lib/wasm-tools/` was "not
127
+ actually WebAssembly", and it was right: the crate had no `wasm32`
128
+ target, built an ordinary host binary, printed a hardcoded
129
+ `"engine": "wasm"` field, and nothing in the repository invoked it.
130
+ `wasmtime` was pinned in `mise.toml` for a runtime nothing used.
131
+
132
+ That is fixed. The crate now:
133
+
134
+ - builds for **`wasm32-wasip1`** (`cargo build --release --target
135
+ wasm32-wasip1`), producing `dot-sys.wasm`;
136
+ - has a consumer — `dot attest --verify`
137
+ (`scripts/diagnostics/attest-verify.sh`) runs the module under
138
+ `wasmtime` and hands it the evidence record on stdin;
139
+ - reports `"engine": "wasm"` **only when it really ran as
140
+ WebAssembly**. The constant is `cfg`-selected: the host build of the
141
+ same source says `"engine": "native"`. `lib/wasm-tools/tests/wasm.rs`
142
+ asserts both halves, and `rust.yml`'s `wasm` job executes the module
143
+ rather than merely building it.
144
+
145
+ Why the sandbox is the point rather than decoration: the evidence
146
+ record is produced by the machine under review. A reviewer who checks
147
+ it with `jq` on that machine is trusting tools the machine controls.
148
+ The module has no filesystem, no network and no environment — it reads
149
+ bytes on stdin, applies a fixed policy, and writes a verdict, with the
150
+ same bytes producing the same verdict on any platform that has a
151
+ WebAssembly runtime. This is the first slice of the "TrustMee-Wasm"
152
+ direction recorded in
153
+ [`operations/HARD_AUDIT_2026.md` §8.7](operations/HARD_AUDIT_2026.md);
154
+ the remaining slice is bundling the module *with* the evidence so a
155
+ reviewer needs no checkout at all.
156
+
157
+ **When a satellite repo would be right:** if the verifier gained a
158
+ consumer outside this repo, it would belong on crates.io as its own
159
+ crate, and a satellite would then be the right home because Rust
160
+ crates version independently. Today its only consumer is `dot attest`,
161
+ which releases with it.
162
+
163
+ ## The rule
164
+
165
+ A satellite repository is justified when a component has **an
166
+ independent release cadence and an independent consumer**. Both, not
167
+ either.
168
+
169
+ - `homebrew-tap` — both (Homebrew's cadence, Homebrew's users).
170
+ - `dot mcp` — neither: it releases with the CLI and its only consumer
171
+ is an agent already on this machine.
172
+ - `lib/wasm-tools` — has a consumer (`dot attest --verify`), but not an
173
+ independent one: it ships and versions with the CLI.
174
+
175
+ Splitting a component that fails this test moves complexity from a
176
+ directory boundary (free, enforced by review) to a repository boundary
177
+ (a release, a version constraint, a CI pipeline, and a place for
178
+ skew to hide).
179
+
180
+ ## Corrections made while auditing this page
181
+
182
+ Two statements in the published discovery cards were factually wrong
183
+ and are fixed:
184
+
185
+ | File | Was | Now |
186
+ |---|---|---|
187
+ | `.well-known/agent-card.json` | `"url": "https://github.com/sebastienvermeille/dotfiles"` | `sebastienrousseau` — the card pointed at a different person's GitHub account |
188
+ | `.well-known/mcp/server-card.json` | `"policyRef": "dot_config/dotfiles/mcp-policy.json"` | `defaults/dot_config/...` — the path moved in the [`.chezmoiroot` reorg](operations/RFC_v0_2_503_reorganization.md) |
189
+
190
+ Both cards were also 18 releases stale at `0.2.501` while the project
191
+ shipped `0.2.519`. They are now checked by
192
+ `scripts/verify-release-versions` on every push and rewritten by
193
+ `scripts/version-sync.sh` at release time, so neither can drift again.
194
+
195
+ The larger discrepancy — the MCP card advertising a server that did
196
+ not exist — was resolved by implementing the protocol rather than
197
+ narrowing the card. `dot mcp serve` now serves every tool, resource and
198
+ capability the card declares, and the card and the registry are pinned
199
+ to each other by tests that fail in both directions.
200
+
201
+ ## Keeping this page honest
202
+
203
+ The claims above are checkable rather than aspirational:
204
+
205
+ | Claim | Verify with |
206
+ |---|---|
207
+ | `dot mcp` exists and is routed | `dot mcp --help`; route table in `bin/dot` |
208
+ | `dot mcp serve` **is** an MCP server | `printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}\n' \| dot mcp serve` returns an `initialize` result |
209
+ | The card and the server agree | `cd defaults/dot_local/share/dot-mcp && go test -run TestServerCard ./...` |
210
+ | The MCP card points at the server | `jq .transport .well-known/mcp/server-card.json` → `dot mcp serve` |
211
+ | `lib/wasm-tools` really builds and runs as wasm | `cargo build --release --target wasm32-wasip1 --manifest-path lib/wasm-tools/Cargo.toml && wasmtime run lib/wasm-tools/target/wasm32-wasip1/release/dot-sys.wasm` → a record whose `engine` is `wasm` |
212
+ | The host build of the same source says so | `cargo run --manifest-path lib/wasm-tools/Cargo.toml` → `"engine": "native"` |
213
+ | The verifier has a caller | `dot attest --verify`; `rg -l attest-verify scripts/` |
214
+ | The A2A card is valid | `dot agent a2a-card --validate` |
215
+ | Card versions match the manifest | `bash scripts/verify-release-versions` (both cards are checked surfaces) |
216
+ | The three taps are generated, not authored | `pkg/README.md` and the `release-distribute-*.yml` workflows |
217
+ | The registry document is schema-valid | `bash tools/ci/check-registry.sh` |
218
+
219
+ If this page and the repository disagree, the repository wins and this
220
+ page is the bug.