@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.
- package/CHANGELOG.md +191 -0
- package/README.md +1164 -164
- package/docs/ARCHITECTURE.md +117 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/ECOSYSTEM.md +220 -0
- package/docs/GOLD-STANDARD-AUDIT.md +352 -0
- package/docs/GOVERNANCE.md +1 -1
- package/docs/MAINTAINERS.md +1 -1
- package/docs/MINIMUM-TOOLCHAIN.md +100 -0
- package/docs/README.md +1 -1
- package/docs/STRUCTURE.md +1 -1
- package/docs/architecture/ARCHITECTURE.md +11 -108
- package/docs/architecture/REPO_LAYOUT.md +4 -4
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +121 -0
- package/docs/index.md +3 -3
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/03-reference/01-dot-cli.md +28 -3
- package/docs/manual/command-index.md +24 -4
- package/docs/manual/concept-index.md +2 -0
- package/docs/migration/README.md +81 -0
- package/docs/migration/from-bare-git-repo.md +156 -0
- package/docs/migration/from-gnu-stow.md +165 -0
- package/docs/migration/from-plain-chezmoi.md +148 -0
- package/docs/migration/from-yadm.md +187 -0
- package/docs/operations/PERFORMANCE_BUDGETS.md +196 -0
- package/docs/operations/REGISTRY.md +1 -1
- package/docs/operations/RELEASE_PIPELINE.md +4 -4
- package/docs/operations/TESTING.md +3 -3
- package/docs/operations/TRACEABILITY.md +1 -0
- package/docs/packaging.md +222 -0
- package/docs/reference/FEATURE-MATRIX.md +646 -0
- package/docs/reference/TOOLS.md +1 -1
- package/docs/reference/UTILS.md +1 -0
- package/docs/security/COMPLIANCE.md +1 -1
- package/docs/security/DISCLOSURE.md +4 -4
- package/docs/security/FUZZING.md +113 -18
- package/docs/security/KEY_ROTATION.md +1 -1
- package/docs/security/SCORECARD.md +3 -3
- package/docs/security/VERIFY_RELEASE.md +2 -2
- package/install.sh +6 -6
- package/package.json +2 -2
- package/scripts/ci/check-copyright-headers.sh +1 -1
- package/scripts/ci/check-shell-preamble.sh +1 -1
- package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
- package/scripts/demo/record.sh +1 -1
- package/scripts/diagnostics/a2a-conformance.sh +1 -1
- package/scripts/diagnostics/alias-governance.sh +30 -3
- package/scripts/diagnostics/aliases-cheatsheet.sh +1 -1
- package/scripts/diagnostics/aliases-manifest.sh +1 -1
- package/scripts/diagnostics/attest-verify.sh +147 -0
- package/scripts/diagnostics/benchmark.sh +1 -1
- package/scripts/diagnostics/conflicts.sh +1 -1
- package/scripts/diagnostics/doctor-unified.sh +6 -2
- package/scripts/diagnostics/doctor.sh +56 -10
- package/scripts/diagnostics/drift-dashboard.sh +3 -2
- package/scripts/diagnostics/health.sh +43 -10
- package/scripts/diagnostics/history-analysis.sh +1 -1
- package/scripts/diagnostics/mcp-doctor.sh +2 -2
- package/scripts/diagnostics/perf.sh +1 -1
- package/scripts/diagnostics/scorecard.sh +3 -2
- package/scripts/diagnostics/secret-governance.sh +1 -1
- package/scripts/diagnostics/security-score.sh +1 -1
- package/scripts/diagnostics/smoke-test.sh +1 -1
- package/scripts/diagnostics/snapshot.sh +1 -1
- package/scripts/diagnostics/verify.sh +1 -1
- package/scripts/diagnostics/verify_state.sh +1 -1
- package/scripts/diagnostics/version-locks.sh +1 -1
- package/scripts/diagnostics/workstation-attestation.sh +26 -1
- package/scripts/dot/commands/agent.sh +64 -14
- package/scripts/dot/commands/agents.sh +24 -8
- package/scripts/dot/commands/ai.sh +20 -7
- package/scripts/dot/commands/aliases.sh +1 -1
- package/scripts/dot/commands/appearance.sh +1 -1
- package/scripts/dot/commands/completion.sh +42 -5
- package/scripts/dot/commands/core.sh +1 -1
- package/scripts/dot/commands/diagnostics.sh +1 -1
- package/scripts/dot/commands/env-emit.sh +1 -1
- package/scripts/dot/commands/fleet.sh +41 -18
- package/scripts/dot/commands/init.sh +1 -1
- package/scripts/dot/commands/lint.sh +1 -1
- package/scripts/dot/commands/manual.sh +1 -1
- package/scripts/dot/commands/meta.sh +115 -10
- package/scripts/dot/commands/patterns.sh +1 -1
- package/scripts/dot/commands/registry.sh +43 -7
- package/scripts/dot/commands/restore.sh +1 -1
- package/scripts/dot/commands/secrets.sh +1 -1
- package/scripts/dot/commands/security.sh +1 -1
- package/scripts/dot/commands/tools.sh +21 -7
- package/scripts/fonts/install-nerd-fonts.sh +1 -1
- package/scripts/fonts/patch-fonts.sh +1 -1
- package/scripts/git-hooks/install.sh +1 -1
- package/scripts/git-hooks/pre-commit-audit.sh +2 -2
- package/scripts/lib/secrets_provider.sh +19 -4
- package/scripts/nvim/headless-upgrade.lua +81 -0
- package/scripts/ops/ai-setup.sh +1 -1
- package/scripts/ops/bundle.sh +1 -1
- package/scripts/ops/chaos.sh +1 -1
- package/scripts/ops/chezmoi-apply.sh +1 -1
- package/scripts/ops/chezmoi-diff.sh +1 -1
- package/scripts/ops/chezmoi-remove.sh +3 -3
- package/scripts/ops/chezmoi-update.sh +6 -2
- package/scripts/ops/heal-chezmoi.sh +1 -1
- package/scripts/ops/heal-system.sh +1 -1
- package/scripts/ops/heal-tools.sh +1 -1
- package/scripts/ops/heal.sh +1 -1
- package/scripts/ops/post-apply-repair.sh +1 -1
- package/scripts/ops/prewarm.sh +1 -1
- package/scripts/ops/release.sh +1 -1
- package/scripts/ops/rollback.sh +11 -2
- package/scripts/ops/setup.sh +1 -1
- package/scripts/ops/teleport.sh +1 -1
- package/scripts/qa/check-feature-matrix.sh +296 -0
- package/scripts/qa/check-version-consistency.sh +7 -119
- package/scripts/qa/coverage-baseline.sh +1 -1
- package/scripts/qa/docs-coverage.sh +9 -3
- package/scripts/qa/examples-coverage.sh +1 -1
- package/scripts/qa/reliability-audit.sh +1 -1
- package/scripts/qa/scorecard-snapshot.sh +1 -1
- package/scripts/qa/traceability-coverage.sh +9 -2
- package/scripts/qa/validate-examples.sh +66 -3
- package/scripts/qa/wsl-contract.sh +1 -1
- package/scripts/secrets/age-init.sh +1 -1
- package/scripts/secrets/create-secrets-file.sh +1 -1
- package/scripts/secrets/encrypt-ssh-key.sh +1 -1
- package/scripts/security/backup.sh +1 -1
- package/scripts/security/check-disclosure-key-expiry.sh +1 -1
- package/scripts/security/dns-doh.sh +1 -1
- package/scripts/security/encryption-check.sh +1 -1
- package/scripts/security/enforce-policies.sh +315 -98
- package/scripts/security/firewall.sh +1 -1
- package/scripts/security/lock-configs.sh +1 -1
- package/scripts/security/lock-screen.sh +1 -1
- package/scripts/security/manage-secrets.sh +1 -1
- package/scripts/security/ssh-cert.sh +1 -1
- package/scripts/security/telemetry-kill.sh +1 -1
- package/scripts/security/usb-safety.sh +1 -1
- package/scripts/theme/apply-gnome-theme.sh +1 -1
- package/scripts/theme/extract-heic-frames.sh +1 -1
- package/scripts/theme/extract-theme.py +284 -6
- package/scripts/theme/install-boot-logo.sh +1 -1
- package/scripts/theme/install-catppuccin-themes.sh +1 -1
- package/scripts/theme/install-cursors.sh +1 -1
- package/scripts/theme/install-file-icons.sh +1 -1
- package/scripts/theme/install-grub-theme.sh +1 -1
- package/scripts/theme/install-lock-icon.sh +1 -1
- package/scripts/theme/merge-wallpaper.sh +1 -1
- package/scripts/theme/rebuild-themes.sh +64 -5
- package/scripts/theme/switch.sh +46 -19
- package/scripts/theme/wallpaper-rotate.sh +1 -1
- package/scripts/theme/wallpaper-sync.sh +1 -1
- package/scripts/tools/cmatrix.sh +1 -1
- package/scripts/tools/detect-collisions.py +1 -1
- package/scripts/tools/emoji-picker.sh +1 -1
- package/scripts/tools/figlet-banner.sh +1 -1
- package/scripts/tools/log-rotate.sh +1 -1
- package/scripts/tools/lolcat-wrap.sh +1 -1
- package/scripts/tools/pipes.sh +1 -1
- package/scripts/tuning/linux.sh +1 -1
- package/scripts/tuning/macos.sh +1 -1
- package/scripts/uninstall.sh +1 -1
- package/scripts/verify-release-versions +156 -0
- package/scripts/version-sync.sh +63 -3
- 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
|
@@ -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.
|