@sebastienrousseau/dotfiles 0.2.501 → 0.2.502

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 (65) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +38 -8
  3. package/docs/COPYRIGHT +1 -1
  4. package/docs/index.md +2 -2
  5. package/docs/manual/00-introduction.md +1 -1
  6. package/docs/manual/03-reference/01-dot-cli.md +63 -45
  7. package/docs/manual/03-reference/02-config-files.md +2 -2
  8. package/docs/manual/03-reference/05-feature-flags.md +62 -3
  9. package/docs/manual/_toc.yml +1 -1
  10. package/docs/manual/command-index.md +12 -8
  11. package/docs/manual/index.md +66 -0
  12. package/docs/operations/COVERAGE.md +36 -2
  13. package/docs/operations/HARD_AUDIT_2026.md +631 -0
  14. package/docs/operations/REGISTRY.md +89 -0
  15. package/docs/operations/ROADMAP_2026.md +665 -0
  16. package/docs/operations/TRACEABILITY.md +3 -0
  17. package/docs/operations/VERSION_SYNC.md +4 -4
  18. package/docs/reference/POWERSHELL_PARITY.md +80 -0
  19. package/docs/registry.json +6 -0
  20. package/docs/security/CI_PINNING.md +113 -0
  21. package/docs/security/COMMIT_SIGNING.md +138 -0
  22. package/docs/security/DISCLOSURE.md +130 -0
  23. package/docs/security/KEY_ROTATION.md +81 -1
  24. package/docs/security/SCORECARD.md +74 -14
  25. package/docs/security/security-pubkey.asc +15 -0
  26. package/dot_config/fish/conf.d/direnv.fish +4 -0
  27. package/dot_config/fish/conf.d/mise-activate.fish +5 -0
  28. package/dot_config/git/hooks/executable_commit-msg +1 -1
  29. package/dot_config/shell/00-core-paths.sh.tmpl +8 -1
  30. package/dot_config/shell/README.md +1 -1
  31. package/dot_config/zsh/dot_zshrc.tmpl +57 -4
  32. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +1 -1
  33. package/dot_local/bin/executable_dot +49 -9
  34. package/dot_local/bin/executable_dot-bootstrap +0 -1
  35. package/dot_local/bin/executable_dot-theme-sync +8 -8
  36. package/dot_local/bin/executable_tour +2 -2
  37. package/dot_local/share/man/man1/dot.1 +1 -1
  38. package/dot_local/share/zsh/completions/_dot +4 -0
  39. package/install.sh +44 -37
  40. package/package.json +1 -1
  41. package/scripts/ci/dot-cli-startup-bench.sh +126 -0
  42. package/scripts/ci/install-chezmoi-verified.sh +4 -1
  43. package/scripts/ci/lint-reusable-pins.sh +78 -0
  44. package/scripts/ci/run-coverage.sh +89 -0
  45. package/scripts/ci/windows-smoke-test.ps1 +136 -0
  46. package/scripts/diagnostics/doctor.sh +39 -9
  47. package/scripts/dot/commands/agent.sh +19 -22
  48. package/scripts/dot/commands/agents.sh +325 -0
  49. package/scripts/dot/commands/aliases.sh +10 -8
  50. package/scripts/dot/commands/core.sh +10 -4
  51. package/scripts/dot/commands/fleet.sh +278 -3
  52. package/scripts/dot/commands/init.sh +184 -0
  53. package/scripts/dot/commands/meta.sh +7 -4
  54. package/scripts/dot/commands/registry.sh +263 -0
  55. package/scripts/dot/commands/tools.sh +49 -1
  56. package/scripts/dot/lib/bento.sh +1 -1
  57. package/scripts/dot/lib/platform.sh +21 -8
  58. package/scripts/dot/lib/ui.sh +134 -2
  59. package/scripts/dot/lib/utils.sh +1 -1
  60. package/scripts/git-hooks/pre-commit-audit.sh +1 -1
  61. package/scripts/lib/secrets_provider.sh +32 -6
  62. package/scripts/ops/rollback.sh +14 -0
  63. package/scripts/security/check-disclosure-key-expiry.sh +110 -0
  64. package/scripts/security/lock-configs.sh +11 -2
  65. package/scripts/version-sync.sh +3 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,83 @@
2
2
 
3
3
  This file documents all notable changes to this project.
4
4
 
5
+ ## v0.2.502 — 2026-05-17
6
+
7
+ ### Added
8
+
9
+ - **`dot agents`** — multi-harness AI agent context generator. `CLAUDE.md` is canonical; `dot agents render` mirrors it into `AGENTS.md` (the cross-harness standard read by Codex/Copilot/Cursor/Windsurf/Amp/Devin), `.cursor/rules/dotfiles.mdc`, and `.codex/config.toml`. `dot agents check` returns rc 0 when in sync (suitable for a pre-commit hook). Round-1 audit gap #1 closed.
10
+ - **`dot init <github-user|owner/repo|url>`** — analogue to `chezmoi init`. Bootstrap a foreign dotfiles repo through this framework's harness with `--dry-run`, `--no-apply`, `--force` flags; an interactive trust prompt warns before SSH/HTTPS clones; refuses plain HTTP. Owner/repo and bare-user shorthands validated against `[A-Za-z0-9._-]+` to block shell-metacharacter injection.
11
+ - **`dot fleet apply`** — SSH-based fleet reconciliation across hosts in `~/.config/dotfiles/fleet.toml`. Parallel fan-out (default 4-way) via background-job semaphore (no `xargs -d` so it works on macOS BSD xargs too). Hostnames validated against `[A-Za-z0-9._@:+/-]+` before fan-out. Flags: `--host`, `--cmd "<shell>"` (trust boundary — warning shown), `--dry-run`, `--jobs <n>`. Per-host stderr captured; collision-safe `mktemp -d -t dotfiles-fleet.XXXXXX` temp dir.
12
+ - **`dot registry`** — JSON-indexed module marketplace scaffold. Subcommands `list / search / info / install / url / set-url`. Default registry at `https://sebastienrousseau.github.io/dotfiles/registry.json` (published from `docs/registry.json` via GitHub Pages). 6h cache TTL; `set-url` validates HTTPS-only (or `file://` for testing) and writes atomically via `mktemp + mv`. Full module contract + contribution flow in [`docs/operations/REGISTRY.md`](docs/operations/REGISTRY.md).
13
+ - **Sub-100ms CLI cold-start gate** — `scripts/ci/dot-cli-startup-bench.sh` measures median dispatcher startup under a clean `env -i`. New workflow `.github/workflows/dot-cli-bench.yml` runs on every PR touching `dot_local/bin/executable_dot` or `scripts/dot/**`. Current observation: median 47ms locally; CI budget 250ms.
14
+ - **`docs/operations/HARD_AUDIT_2026.md`** — consolidated audit (round 1 + round 2 addendum) of operational reliability, performance, documentation accuracy, cross-platform parity, security posture, competitor positioning, 2026 industry trends, and adoption playbook. Produced from twelve parallel research-agent runs.
15
+
16
+ ### Fixed
17
+
18
+ - **`install.sh`** — removed the unverified `get.chezmoi.io` curl|sh fallback. The SHA256-verified installer is now the only path; if it fails, we refuse to bootstrap rather than silently degrading (H6).
19
+ - **`scripts/dot/lib/platform.sh`** — `dot_path_to_unix` / `dot_path_to_native` return rc 2 with a stderr error when called in WSL without `wslpath`, instead of silently echoing a Windows-format path (H9).
20
+ - **`dot_local/bin/executable_dot`** — user-provided custom commands now run in a subshell so a `exit` in the user script can't kill the whole CLI (H1).
21
+ - **`scripts/dot/commands/fleet.sh`** — `dot fleet namespace set` writes via `mktemp + mv` instead of the brittle GNU/BSD `sed -i` dance (H3).
22
+ - **`dot_config/zsh/dot_zshrc.tmpl`** — `_cached_eval` uses `mktemp` instead of `${cache}.tmp.$$`, eliminating the PID-collision race under shell recycling (H4).
23
+ - **`scripts/dot/commands/meta.sh`** — cache-clear uses `find ... -type f -delete` with a directory guard instead of `rm -rf "$cache_dir/zsh"/*-init.zsh`, which expanded the literal pattern when no files matched (H5).
24
+ - **`scripts/dot/commands/agent.sh`** — replaced three `set +e / "$@" / set -e` blocks with idiomatic `if !` so bash errexit suspension is implicit (M4).
25
+ - **`scripts/dot/commands/core.sh`** — `cmd_status` captures chezmoi stderr and inspects the exit code, so a chezmoi crash is now distinguishable from a clean tree (M1).
26
+ - **`scripts/dot/lib/ui.sh`** — `ui_run_cmd` guards the rc-file read with `[[ -s ]]` to avoid races between the subshell write and the parent read (M3).
27
+ - **`scripts/security/lock-configs.sh`** — pre-checks `sudo` availability and TTY attachment before attempting `chattr +i`, instead of failing per-file in automation (M5).
28
+ - **`scripts/ci/install-chezmoi-verified.sh`** — unsupported-architecture error now names the supported set (x86_64/amd64, arm64/aarch64) and points at the upstream release page (M7).
29
+ - **`docs/manual/03-reference/01-dot-cli.md`** + **`docs/manual/command-index.md`** — removed six commands that were documented but never shipped (`dot verify`, `dot benchmark`, `dot prewarm`, `dot clean-cache`, `dot remove`, `dot update`). Added the new `agents`, `init`, `registry`, and `fleet apply` sections (C3).
30
+ - **Version drift** — bumped `v0.2.501` → `v0.2.502` in five doc surfaces (`docs/manual/00-introduction.md`, `docs/manual/_toc.yml`, `docs/index.md`, `docs/manual/03-reference/02-config-files.md` × 2) (C2).
31
+ - **`docs/manual/index.md`** — new landing page for `https://doc.dotfiles.io/manual/` (the Jekyll site was 404ing because `jekyll-readme-index` had no `README.md`/`index.md` to render in `docs/manual/`).
32
+
33
+ ### Security
34
+
35
+ - **`scripts/dot/commands/agents.sh`** — render only writes when the resolved root contains `.chezmoidata.toml`, so a user running `dot agents render` from inside an unrelated git repo can't accidentally write agent configs there. Output files get explicit `chmod 0644`.
36
+ - **`scripts/dot/commands/init.sh`** — owner/repo and bare-user shorthands are now validated against `[A-Za-z0-9._-]+` before URL construction.
37
+ - **`scripts/dot/commands/fleet.sh`** — hostnames validated against `[A-Za-z0-9._@:+/-]+` before SSH fan-out; an attacker controlling `fleet.toml` can no longer inject shell metacharacters.
38
+ - **`scripts/dot/commands/registry.sh`** — `set-url` refuses non-HTTPS schemes (with a `file://` exemption for local testing) and writes config atomically.
39
+
40
+ ### Documentation
41
+
42
+ - **`docs/operations/REGISTRY.md`** — module contract, JSON schema, and contribution flow for the new registry.
43
+ - **`docs/operations/COVERAGE.md`** — documents the achieved unit-test floor (~47%) plus the structural ceiling for xtrace-only instrumentation; closes #883.
44
+
45
+ ### Round 3 (HARD_AUDIT_2026.md Part 7)
46
+
47
+ - **C1 closed — GPG disclosure key published.** Generated `security@sebastienrousseau.com` ed25519 + cv25519 keypair, fingerprint `55AFAD364FD9DB3819E61F0C8D688FAFA9144693`, expires 2029-05-15. Published to WKD at `sebastienrousseau.github.io/.well-known/openpgpkey/`. Repo carries the armored public key at `docs/security/security-pubkey.asc`.
48
+ - **`.github/workflows/verify-gpg-wkd.yml`** (N1) — imports both the in-repo `.asc` and the live WKD-fetched key, compares fingerprints, fails loud on mismatch. Runs on push/PR + weekly schedule (Mondays 09:00 UTC). Wires the expiry monitor as the final step.
49
+ - **`scripts/security/check-disclosure-key-expiry.sh`** (N2) — monitors the 2029-05-15 expiry; warns at 90 days remaining, fails CI at 30 days.
50
+ - **`dot fleet apply --verify-hosts`** (N4) — closes the TOFU window per-invocation. Aborts the apply unless every host in `fleet.toml` is already present in `~/.ssh/known_hosts`.
51
+ - **`install.sh` Charm GPG pin** (N5) — pins `CHARM_GPG_EXPECTED_FPR=C026D31B92F9BBE91D5DB75AB07AE17C9E0A6585`; aborts (removing the keyring file) on mismatch.
52
+ - **`scripts/lib/secrets_provider.sh` exit codes** (N6) — `dot_secrets_get` now returns `2` (no provider), `3` (provider returned empty / key not found), or the provider's own rc; stderr names provider + key for diagnosis.
53
+ - **R3 docs drifts** — purged 5 orphan dispatch routes + 1 orphan help-table entry in `dot_local/bin/executable_dot`; relabelled `dot agents` + `dot fleet apply` from "Full" to "Stub (bash-bridged)" on Windows-native in `docs/reference/POWERSHELL_PARITY.md`; corrected Microsoft Build 2026 date from "2026-05-19 in Seattle" to actual `2026-06-02 to 2026-06-03 in San Francisco (Fort Mason)` in `ROADMAP_2026.md`.
54
+ - **R3 mocked-SSH test catches 2 real bugs.** `tests/unit/fleet/test_fleet_apply_mocked_ssh.sh` (5 tests with PATH-shim overriding `ssh`) caught: (a) subshell counter loss via pipe — fixed with `done < <(printf '%s\n' "$entries")`; (b) RETURN trap referencing `local tmpdir` failed under `set -u` — fixed with `printf -v _cleanup 'rm -rf %q' "$tmpdir"`.
55
+ - **R3 strategic reversal.** Ship `dot env emit` BEFORE `--attest` (driven by AGNTCon Amsterdam 2026-09-17 deadline + EU CRA SBOM binding 2026-09-11). Full rationale in `HARD_AUDIT_2026.md` §7.4.
56
+
57
+ ### Round 4 (HARD_AUDIT_2026.md Part 8)
58
+
59
+ - **Zero reliability findings** — second consecutive 0-finding round. 4 of 5 candidate perf claims were false positives (SSH-agent guard, completion-chain forks, FNM completion, carapace defer) caught by live verification.
60
+ - **Documentation completeness fixes:**
61
+ - `README.md` — removed 4 stale references to ghost commands `dot verify` / `dot benchmark` / `dot prewarm` (none ship). Routed to `dot secrets verify`, `dot perf`, `dot health`.
62
+ - `docs/manual/03-reference/05-feature-flags.md` — documented the 9 previously-undocumented flags (`alias_wrapper`, `zellij`, `fuzzel`, `mako`, `foot`, `kanshi`, `touch`, `t2`, `surface`) with purpose + platform applicability + requirements.
63
+ - `dot_local/share/man/man1/dot.1` — header bumped `v0.2.500 → v0.2.502`, `April → May 2026`.
64
+ - `dot_config/zsh/rc.d/30-options.zsh.tmpl` — completion-block comment no longer references the non-existent `dot prewarm`.
65
+ - **Strategic outputs** (deferred to follow-up PRs / R5):
66
+ - OSPS Baseline v2026.02.19 Level-2 adoption path documented as the cross-walk for EU CRA Article 24, NIS2 Article 21, SSDF v1.2.
67
+ - **R5 headline** identified: Shai-Hulud-class personal-device defence (credential-locality policy + honeytoken + shell-init integrity manifest + post-incident playbook in `SECURITY.md`).
68
+ - **Strategic leapfrog** identified: `dot attest --format=trustmee-wasm` — Wasm-verifiable workstation attestation (composes SLSA-Graduated + arXiv:2602.13148 TrustMee + MCP-exposed workstation state). No competitor reaches this.
69
+ - **Top-5 de-facto adoption gaps**: Homebrew tap, AUR `PKGBUILD`, Scoop manifest, Hyprland config, awesome-dotfiles listing.
70
+
71
+ ### Performance + polish (post-R4)
72
+
73
+ - **`dot_config/zsh/dot_zshrc.tmpl`** — `_cached_eval_impl` writes use `>|` (force-clobber) instead of `>`, so the just-`mktemp`'d temp file is not rejected when the user has `setopt noclobber` set globally via `dot_config/shell/05-core-safety.sh:15`. Fixes the `_cached_eval_impl:64: file exists` warning surfaced on every interactive shell with a cache miss.
74
+ - **`dot_config/shell/00-core-paths.sh.tmpl`** — system paths added via `path_prepend` (which removes duplicates first) instead of `PATH="...:${PATH}"`, eliminating the duplicate-system-path bloat that accumulates when the parent shell already had those entries (macOS launchd default).
75
+ - **`dot_config/zsh/dot_zshrc.tmpl`** — re-apply `typeset -U path` after `_dotfiles_async_init` runs cached `export PATH=...` from mise/atuin/etc, since those bypass zsh's `-U` flag on the `path` array.
76
+ - **`scripts/diagnostics/doctor.sh`** — only flag tools that actually emit shell-init eval and are not already lazy-loaded; raise PATH-length thresholds (60 ok / 120 warn) to match a populated mise-managed dev machine; skip `nu` when `cached_eval.nu` is present.
77
+ - **`dot_config/git/hooks/executable_commit-msg`** — replaced hardcoded `/Users/seb` path with `${HOME}` so the hook is portable across hosts.
78
+ - **`dot_config/fish/conf.d/{direnv,mise-activate}.fish`** — empty shadow files that override Homebrew `vendor_conf.d` to prevent eager init. fish dedupes `conf.d/` by basename, user wins. Saves ~140ms on every fish shell start; both tools are loaded lazily via `_cached_eval` in `init.fish`.
79
+ - **`.devcontainer/Dockerfile`** — chezmoi install now goes through `scripts/ci/install-chezmoi-verified.sh` (SHA256-verified) instead of the unverified `curl -fsSL https://get.chezmoi.io` fallback. Closes R4 §8.3 P3 / mirrors R1 H6 fix in `install.sh`.
80
+ - **`typos.toml`** — extended file exclusions (`**/*.asc`, `**/*.pgp`, `**/*.gpg`, `**/*.sig`) to skip armored cryptographic blobs; added `fpr` / `FPR` to the allow-list (GPG `--with-colons` fingerprint column label).
81
+
5
82
  ## v0.2.501
6
83
 
7
84
  ### Added
package/README.md CHANGED
@@ -5,12 +5,12 @@
5
5
  <h1 align="center">.dotfiles</h1>
6
6
 
7
7
  <p align="center">
8
- <strong>Declarative dotfiles for macOS, Linux, and WSL. Multi-shell by default. Sub-second startup. Wallpaper-driven themes. Signed releases.</strong>
8
+ <strong>Declarative dotfiles for macOS, Linux, WSL, and Windows-native PowerShell 7.4 LTS / 7.5+. Multi-shell by default. Sub-100ms CLI cold-start. Wallpaper-driven themes. Signed + attested releases. Fleet apply over SSH.</strong>
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://github.com/sebastienrousseau/dotfiles/actions"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/dotfiles/ci.yml?style=for-the-badge&logo=github" alt="Build" /></a>
13
- <a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.501-blue?style=for-the-badge" alt="Version" /></a>
13
+ <a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.502-blue?style=for-the-badge" alt="Version" /></a>
14
14
  <a href="https://github.com/sebastienrousseau/dotfiles/releases"><img src="https://img.shields.io/github/downloads/sebastienrousseau/dotfiles/total?style=for-the-badge" alt="Downloads" /></a>
15
15
  <a href="https://codespaces.new/sebastienrousseau/dotfiles"><img src="https://img.shields.io/badge/Open%20in-Codespaces-blue?style=for-the-badge&logo=github" alt="Open in GitHub Codespaces" /></a>
16
16
  <a href="https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles"><img src="https://img.shields.io/ossf-scorecard/github.com/sebastienrousseau/dotfiles?style=for-the-badge&label=OpenSSF%20Scorecard" alt="OpenSSF Scorecard" /></a>
@@ -20,13 +20,37 @@
20
20
 
21
21
  > **Why this is different.** You won't find these three things in `mathiasbynens/`, `holman/`, or `paulirish/`. First, wallpaper-driven terminal themes. We use K-Means clustering in CIELAB and enforce WCAG AAA contrast. Second, first-class agent governance. That covers MCP policy, A2A discovery, signed attestation logs, and bounded profiles (`ask` / `plan` / `apply` / `audit`). Third, verified multi-shell parity across zsh, fish, bash, nushell, and PowerShell. The suite is tested on macOS, Linux, WSL2, and Apple Silicon CI runners. Signed commits are enforced. The installer is idempotent. The CLI heals itself.
22
22
 
23
+ <!-- ASCIINEMA DEMO — closes #874 once recorded.
24
+ 30-second clip covering: install.sh → dot doctor → dot theme rebuild.
25
+ Recording recipe (maintainer):
26
+
27
+ asciinema rec ~/dotfiles-demo.cast \
28
+ --idle-time-limit 1 --rows 30 --cols 100 \
29
+ --title "Dotfiles: install → doctor → theme"
30
+ # in the recording shell:
31
+ # curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh | bash
32
+ # dot doctor
33
+ # dot theme rebuild --force
34
+ # then Ctrl-D to stop
35
+
36
+ Upload with `asciinema upload ~/dotfiles-demo.cast`, grab the
37
+ resulting `https://asciinema.org/a/<id>` URL, and replace this
38
+ comment with:
39
+
40
+ <p align="center">
41
+ <a href="https://asciinema.org/a/<id>">
42
+ <img src="https://asciinema.org/a/<id>.svg" alt="install → doctor → theme demo" />
43
+ </a>
44
+ </p>
45
+ -->
46
+
23
47
  ## Install
24
48
 
25
49
  **Verified install (recommended).** Pin to a release tag. Download the installer. Check its SHA256 against the value published with the release. Then run it. See [docs/security/INSTALL_VERIFICATION.md](docs/security/INSTALL_VERIFICATION.md) for the per-release hash and how it's generated.
26
50
 
27
51
  ```bash
28
52
  curl -fsSL -o /tmp/dotfiles-install.sh \
29
- https://raw.githubusercontent.com/sebastienrousseau/dotfiles/v0.2.501/install.sh
53
+ https://raw.githubusercontent.com/sebastienrousseau/dotfiles/v0.2.502/install.sh
30
54
  echo "4c0303a2d88d5aed98428ab0da37618c9795af4dae0e6549646c2fce5235c280 /tmp/dotfiles-install.sh" \
31
55
  | shasum -a 256 -c
32
56
  bash /tmp/dotfiles-install.sh
@@ -80,10 +104,10 @@ Most dotfiles repos are personal collections. This one ships as workstation infr
80
104
  |:---|:---|:---|
81
105
  | **Wallpaper-driven themes** | K-Means clustering in CIELAB extracts terminal palettes from any wallpaper. WCAG AAA enforced. Dynamic HEIC dark/light. | `dot theme rebuild` |
82
106
  | **AI and MCP native** | Agent profiles, MCP policy enforcement, attestation logs, AI commit messages. | `dot ai`, `dot mcp`, `dot agent`, `dot mode` |
83
- | **Cryptographic attestation** | Signed commits, machine-readable evidence, policy bundle releases. | `dot attest`, `dot verify` |
107
+ | **Cryptographic attestation** | Signed commits, machine-readable evidence, policy bundle releases. | `dot attest`, `dot secrets verify` |
84
108
  | **Fleet management** | Multi-node drift dashboard, per-host profiles. | `dot fleet` |
85
109
  | **Self-healing** | Auto-repair tools, chezmoi drift, broken symlinks, missing files. | `dot heal`, `dot chaos`, `dot rollback`, `dot bundle` |
86
- | **Sub-second startup** | Lazy loading, `_cached_eval` pattern, mtime-based cache invalidation, realpath sidecar pins. | `dot benchmark`, `dot perf` |
110
+ | **Sub-second startup** | Lazy loading, `_cached_eval` pattern, mtime-based cache invalidation, realpath sidecar pins. | `dot perf`, `dot health` |
87
111
  | **Multi-shell parity** | Tier-1 (full): zsh, bash. Tier-2 (bridged): fish. Tier-3 (compatible): nushell. PowerShell is supported as a contract-tested parity target. See [ADR-007](docs/adr/ADR-007-multi-shell-parity.md) and [ADR-011](docs/adr/ADR-011-nushell-tier3-keep.md). | `dot env`, `dot profile` |
88
112
  | **Build artifacts → /tmp** | Cargo, Go, pip, uv, and Zig caches redirect to `/tmp/builds/`. Project dirs stay clean. | `~/.config/mise/config.toml`, `~/.cargo/config.toml` |
89
113
  | **Encrypted secrets** | Age and SOPS keep per-machine secrets out of plaintext history. | `dot secrets` |
@@ -153,9 +177,15 @@ Over 80 commands grouped by intent. Run `dot help` for the full reference.
153
177
 
154
178
  | | |
155
179
  |:---|:---|
180
+ | `dot init <user>` | Bootstrap any GitHub user's dotfiles repo through this harness |
156
181
  | `dot sync` | Apply dotfiles to this machine |
157
182
  | `dot doctor` | Check the environment and surface issues |
158
183
  | `dot learn` | Open the guided tour |
184
+ | `dot agents render` | Sync `CLAUDE.md` → `AGENTS.md` + Cursor + Codex stubs |
185
+ | `dot fleet apply` | SSH out to every host in `~/.config/dotfiles/fleet.toml` |
186
+ | `dot registry list` | Browse reusable dotfile modules from the registry |
187
+
188
+ A [Claude Code skill](dot_claude/skills/dotfiles-bootstrap/SKILL.md) is also shipped — `/skills` discovers `dotfiles-bootstrap` and runs `dot init` with profile-aware safety defaults.
159
189
 
160
190
  ### Daily Use
161
191
 
@@ -201,9 +231,9 @@ Over 80 commands grouped by intent. Run `dot help` for the full reference.
201
231
  | | |
202
232
  |:---|:---|
203
233
  | `dot fleet` | Multi-node status, drift, and namespace |
204
- | `dot benchmark` / `dot perf` | Measure shell startup |
234
+ | `dot perf` | Measure shell startup |
205
235
  | `dot score` / `dot security-score` | Health and security scorecards |
206
- | `dot prewarm` | Warm caches for the first interactive shell |
236
+ | `dot health` | Live dashboard for caches and tool state |
207
237
 
208
238
  Full reference: [docs/reference/UTILS.md](docs/reference/UTILS.md) · Complete manual: [docs/manual/](docs/manual/) or `dot manual`
209
239
 
@@ -227,7 +257,7 @@ The `.dotfiles` Manual is published in nine formats: HTML (single and multi-page
227
257
  2. **Explore** — `dot learn` walks through shells, secrets, themes, and performance
228
258
  3. **Customize** — edit `~/.config/chezmoi/chezmoi.toml` for per-machine settings ([Profiles](docs/reference/PROFILES.md))
229
259
  4. **Toggle features** — flip features in `.chezmoidata.toml` ([Feature Flags](docs/reference/FEATURES.md))
230
- 5. **Apply** — `dot sync` applies the config and `dot prewarm` caches shell startup
260
+ 5. **Apply** — `dot sync` applies the config and the next interactive shell hydrates caches via `_cached_eval`
231
261
 
232
262
  See the [Migration Guide](docs/operations/MIGRATION.md) for version upgrades.
233
263
 
package/docs/COPYRIGHT CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * 🅳🅾🆃🅵🅸🅻🅴🆂 (v0.2.501) - <https://github.com/sebastienrousseau/dotfiles>
2
+ * 🅳🅾🆃🅵🅸🅻🅴🆂 (v0.2.502) - <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.
package/docs/index.md CHANGED
@@ -7,7 +7,7 @@ render_with_liquid: false
7
7
  Cross-platform, signed, local-first dotfiles for macOS, Linux, and WSL.
8
8
 
9
9
  [![Build](https://img.shields.io/github/actions/workflow/status/sebastienrousseau/dotfiles/ci.yml?style=for-the-badge&logo=github)](https://github.com/sebastienrousseau/dotfiles/actions)
10
- [![Version](https://img.shields.io/badge/Version-v0.2.501-blue?style=for-the-badge)](https://github.com/sebastienrousseau/dotfiles/releases/tag/v0.2.501)
10
+ [![Version](https://img.shields.io/badge/Version-v0.2.502-blue?style=for-the-badge)](https://github.com/sebastienrousseau/dotfiles/releases/tag/v0.2.502)
11
11
  [![Downloads](https://img.shields.io/github/downloads/sebastienrousseau/dotfiles/total?style=for-the-badge)](https://github.com/sebastienrousseau/dotfiles/releases)
12
12
 
13
13
  This site is published from the `docs/` directory on `master` and tracks the current workstation baseline, operational guidance, and security material for the repository.
@@ -38,6 +38,6 @@ This site is published from the `docs/` directory on `master` and tracks the cur
38
38
 
39
39
  ## Current Release
40
40
 
41
- - Current tagged release: [`v0.2.501`](https://github.com/sebastienrousseau/dotfiles/releases/tag/v0.2.501)
41
+ - Current tagged release: [`v0.2.502`](https://github.com/sebastienrousseau/dotfiles/releases/tag/v0.2.502)
42
42
  - Latest release feed: [GitHub releases](https://github.com/sebastienrousseau/dotfiles/releases/latest)
43
43
  - Source repository: [sebastienrousseau/dotfiles](https://github.com/sebastienrousseau/dotfiles)
@@ -4,7 +4,7 @@ render_with_liquid: false
4
4
 
5
5
  # Introduction
6
6
 
7
- This manual describes `.dotfiles` v0.2.501 — a trusted agent workstation baseline for macOS, Linux, and WSL.
7
+ This manual describes `.dotfiles` v0.2.502 — a trusted agent workstation baseline for macOS, Linux, and WSL.
8
8
 
9
9
  The repository is more than a personal dotfiles collection. It ships as workstation infrastructure: signed, attested, multi-platform, AI-aware, and self-healing. Chezmoi handles templating and platform differences. The `dot` CLI sits on top and coordinates lifecycle operations.
10
10
 
@@ -151,19 +151,6 @@ dot attest [--output|-o <file>] [--sign|-s]
151
151
 
152
152
  Default output: `~/.local/state/dotfiles/attestation/YYYY-MM-DD-HHMMSS.json`. With `--sign`, the JSON is signed with the user's SSH ED25519 key.
153
153
 
154
- ### `dot verify`
155
-
156
- Verify integrity of the installation.
157
-
158
- ```
159
- dot verify [--security|-s] [--attestation <path>]
160
- ```
161
-
162
- | Flag | Effect |
163
- |:---|:---|
164
- | `--security`, `-s` | Run gitleaks + signature checks + policy hash |
165
- | `--attestation <path>` | Verify an external attestation file |
166
-
167
154
  ### `dot lint`
168
155
 
169
156
  Lint shell scripts (shellcheck, shfmt).
@@ -174,24 +161,6 @@ dot lint [--path <glob>] [--strict]
174
161
 
175
162
  ## Performance
176
163
 
177
- ### `dot benchmark`
178
-
179
- Measure shell startup time.
180
-
181
- ```
182
- dot benchmark [--detailed|-d] [--profile|-p] [--compare|-c] [--waterfall|-w] [--runs|-r <n>]
183
- ```
184
-
185
- | Flag | Effect |
186
- |:---|:---|
187
- | `--detailed`, `-d` | Per-module timing breakdown |
188
- | `--profile`, `-p` | Profile with `$SHELL -ixc ""` |
189
- | `--compare`, `-c` | Compare against baseline |
190
- | `--waterfall`, `-w` | Waterfall visualization |
191
- | `--runs`, `-r <n>` | Number of hyperfine runs (default 10) |
192
-
193
- Exit codes: 0 (<500ms target), 1 (regression).
194
-
195
164
  ### `dot perf`
196
165
 
197
166
  Quick performance snapshot.
@@ -200,17 +169,9 @@ Quick performance snapshot.
200
169
  dot perf [--json|-j] [--profile|-p] [--runs|-r <n>] [--target|-t <ms>]
201
170
  ```
202
171
 
203
- ### `dot prewarm`
204
-
205
- Regenerate shell init caches for fast startup.
206
-
207
172
  ### `dot cache-refresh`
208
173
 
209
- Rebuild generated shell state (cold-start alternative to prewarm).
210
-
211
- ### `dot clean-cache`
212
-
213
- Clear generated shell initialization caches. Next shell startup will be slow; use `dot prewarm` afterward.
174
+ Regenerate shell caches for ultra-fast startup.
214
175
 
215
176
  ### `dot score`
216
177
 
@@ -322,11 +283,72 @@ Multi-node status, drift, and namespace.
322
283
  dot fleet # show all known hosts
323
284
  dot fleet attest # collect signed attestations
324
285
  dot fleet diff # compare rendered config across hosts
325
- dot fleet sync # run `dot update` on every host
286
+ dot fleet sync # run `dot upgrade` on every host
287
+ dot fleet apply # SSH out to every host in fleet.toml and run 'dot sync'
326
288
  ```
327
289
 
328
290
  Fleet hosts are configured in `~/.config/dotfiles/fleet.toml`.
329
291
 
292
+ ### `dot fleet apply`
293
+
294
+ Push dotfiles state to every host registered in `~/.config/dotfiles/fleet.toml`.
295
+
296
+ ```
297
+ dot fleet apply [--host <name>] [--cmd <shell>] [--dry-run] [--jobs <n>]
298
+ ```
299
+
300
+ | Flag | Effect |
301
+ |:---|:---|
302
+ | `--host <name>` | Apply to a single host only (matches the `[hosts.<name>]` stanza key). |
303
+ | `--cmd <shell>` | Run a custom command on every host instead of the default `dot sync && dot doctor --quiet`. **Warning:** this is arbitrary shell on remote hosts; the value is your trust boundary. |
304
+ | `--dry-run`, `-n` | Print the resolved hosts + planned command without opening SSH. |
305
+ | `--jobs <n>` | Parallelism (default 4). |
306
+
307
+ Hostnames in `fleet.toml` are validated against `[A-Za-z0-9._@:+/-]+` before fan-out; entries containing other characters abort the apply. First-time SSH connections use `StrictHostKeyChecking=accept-new` (TOFU); pre-populate `~/.ssh/known_hosts` if your threat model requires no TOFU window.
308
+
309
+ Example `fleet.toml`:
310
+
311
+ ```toml
312
+ [hosts.laptop]
313
+ ssh = "user@laptop.local"
314
+ profile = "workstation"
315
+ ```
316
+
317
+ ## Agents
318
+
319
+ ### `dot agents`
320
+
321
+ Multi-harness AI agent configuration manager. `CLAUDE.md` is canonical; `dot agents render` keeps `AGENTS.md` (the cross-harness standard read by Codex / Copilot / Cursor / Windsurf / Amp / Devin) plus `.cursor/rules/dotfiles.mdc` and `.codex/config.toml` in sync.
322
+
323
+ ```
324
+ dot agents list # show which harnesses are recognised + their target paths
325
+ dot agents check # exit 0 if AGENTS.md tracks CLAUDE.md; 1 if drifted
326
+ dot agents render # regenerate AGENTS.md + 10 harness-specific files
327
+ ```
328
+
329
+ Harnesses covered: `AGENTS.md` (canonical cross-harness), Cursor (`.cursor/rules/dotfiles.mdc`), Codex (`.codex/config.toml`), Windsurf (`.windsurf/rules.md`), Zed (`.zed/agent-config.toml`), Roo (`.roo/rules.md`), Cline (`.clinerules`), Aider (`.aider.conf.yml`), Continue (`.continuerc.json`), Jules (`.jules/system.md`), Gemini (`.gemini/GEMINI.md`).
330
+
331
+ Edit `CLAUDE.md` first, then run `dot agents render`; do not hand-edit `AGENTS.md` or any of the per-harness files. The check subcommand is suitable for pre-commit hooks.
332
+
333
+ ## Registry
334
+
335
+ ### `dot registry`
336
+
337
+ JSON-indexed module registry. Discover and install reusable dotfile modules from a registry hosted via GitHub Pages (or any HTTPS URL via `set-url`).
338
+
339
+ ```
340
+ dot registry list # list modules in the configured registry
341
+ dot registry search <query> # filter modules by keyword
342
+ dot registry info <name> # full metadata for one module
343
+ dot registry install <name> # apply a module (scaffold today)
344
+ dot registry url # show the active registry URL
345
+ dot registry set-url <url> # override the registry URL (HTTPS-only)
346
+ ```
347
+
348
+ Default registry: `https://sebastienrousseau.github.io/dotfiles/registry.json`. Cache lives at `${XDG_CACHE_HOME:-~/.cache}/dotfiles/registry/index.json` with a 6h TTL. One-off override: `DOTFILES_REGISTRY_URL=<url> dot registry list`.
349
+
350
+ The JSON contract + module-contribution flow live in [`docs/operations/REGISTRY.md`](../../operations/REGISTRY.md).
351
+
330
352
  ## Reference
331
353
 
332
354
  ### `dot version`
@@ -361,10 +383,6 @@ dot add --encrypt ~/.somefile # encrypted with Age
361
383
  dot add --template ~/.somefile # templatize
362
384
  ```
363
385
 
364
- ### `dot remove <path>`
365
-
366
- Safely remove a managed file (removes from source and unmanages).
367
-
368
386
  ### `dot cd`
369
387
 
370
388
  Print the source directory path. Useful for `cd $(dot cd)`.
@@ -33,7 +33,7 @@ Every config file read or written by `.dotfiles`, with its schema and purpose.
33
33
 
34
34
  ```toml
35
35
  # Version — bumped by version-sync.sh at release time
36
- dotfiles_version = "0.2.501"
36
+ dotfiles_version = "0.2.502"
37
37
 
38
38
  # Machine preset — override in ~/.config/chezmoi/chezmoi.toml per host
39
39
  machine = ""
@@ -219,7 +219,7 @@ Agent Card (MCP A2A spec):
219
219
  ```json
220
220
  {
221
221
  "name": "dotfiles-agent",
222
- "version": "0.2.501",
222
+ "version": "0.2.502",
223
223
  "capabilities": ["chezmoi.apply", "theme.switch", "secrets.decrypt"],
224
224
  "policy_hash": "0x7f2a..."
225
225
  }
@@ -11,10 +11,19 @@ Feature flags toggle optional subsystems. Set in `.chezmoidata.toml`, override p
11
11
 
12
12
  ```toml
13
13
  [features]
14
- dms = false # Dank Material Shell (Niri desktop)
14
+ alias_wrapper = false # Wrap selected aliases with safer defaults
15
+ dms = true # Dank Material Shell (Niri desktop)
16
+ zellij = false # Zellij terminal multiplexer config
15
17
  linux_desktop = false # Linux-specific desktop configs
16
- niri = false # Niri window manager
17
- waybar = false # Waybar status bar
18
+ niri = false # Niri window manager
19
+ waybar = false # Waybar status bar
20
+ fuzzel = false # Fuzzel application launcher (Wayland)
21
+ mako = false # Mako notification daemon (Wayland)
22
+ foot = false # Foot terminal emulator (Wayland)
23
+ kanshi = false # Kanshi monitor profile manager (Wayland)
24
+ touch = false # Touchscreen-friendly tweaks (Surface, etc.)
25
+ t2 = false # Apple T2 hardware-specific tweaks
26
+ surface = false # Microsoft Surface hardware-specific tweaks
18
27
  ```
19
28
 
20
29
  ## Per-Preset Overrides (`.chezmoidata/hardware.toml`)
@@ -69,6 +78,56 @@ When `true`:
69
78
 
70
79
  Requires: Waybar installed.
71
80
 
81
+ ### `alias_wrapper` — Safer Alias Defaults
82
+
83
+ When `true`, opt-in wrappers replace selected aliases with confirmation-prompt
84
+ variants (e.g., `rm -i`, `mv -i`). Default `false` for power-user ergonomics.
85
+
86
+ ### `zellij` — Zellij Terminal Multiplexer
87
+
88
+ When `true`:
89
+
90
+ - Generates `~/.config/zellij/config.kdl` from the active theme
91
+ - Wires the `dot mux` alias to launch a profile-aware session
92
+
93
+ Requires: Zellij installed.
94
+
95
+ ### `fuzzel` — Fuzzel Application Launcher (Wayland)
96
+
97
+ When `true`, generates `~/.config/fuzzel/fuzzel.ini` using the active theme.
98
+ Requires: Fuzzel installed (Wayland-only). No effect on macOS.
99
+
100
+ ### `mako` — Mako Notification Daemon (Wayland)
101
+
102
+ When `true`, generates `~/.config/mako/config` with theme-derived colors.
103
+ Requires: Mako installed (Wayland-only). No effect on macOS.
104
+
105
+ ### `foot` — Foot Terminal Emulator (Wayland)
106
+
107
+ When `true`, generates `~/.config/foot/foot.ini` from `themes.toml`.
108
+ Requires: Foot installed (Wayland-only). No effect on macOS.
109
+
110
+ ### `kanshi` — Kanshi Monitor Profile Manager (Wayland)
111
+
112
+ When `true`, generates `~/.config/kanshi/config` with per-host monitor layouts.
113
+ Requires: Kanshi installed (Wayland-only). No effect on macOS.
114
+
115
+ ### `touch` — Touchscreen-Friendly Tweaks
116
+
117
+ When `true`, enables larger UI scaling and touch-friendly input mappings.
118
+ Typically combined with `surface` for Microsoft Surface devices.
119
+
120
+ ### `t2` — Apple T2 Hardware Tweaks
121
+
122
+ When `true`, enables `t2linux` kernel-module hints, audio routing fixes, and
123
+ Touch-Bar utilities for Intel Macs with the T2 chip on Linux. Set by the
124
+ `macbook-t2` hardware preset in `.chezmoidata/hardware.toml`.
125
+
126
+ ### `surface` — Microsoft Surface Hardware Tweaks
127
+
128
+ When `true`, enables `linux-surface` kernel parameters, touchpad gestures, and
129
+ pen-input mappings. Set by the `surface-pro` hardware preset.
130
+
72
131
  ## Using a Flag in a Template
73
132
 
74
133
  ```go
@@ -2,7 +2,7 @@
2
2
  # Determines concatenation order for single-page HTML/PDF/EPUB
3
3
  title: "The .dotfiles Manual"
4
4
  subtitle: "A Trusted Agent Workstation for macOS, Linux, and WSL"
5
- version: "0.2.501"
5
+ version: "0.2.502"
6
6
 
7
7
  sections:
8
8
  - file: 00-introduction.md
@@ -7,30 +7,34 @@ render_with_liquid: false
7
7
  Alphabetical list of `dot` subcommands referenced in the manual.
8
8
 
9
9
  - `dot agent`
10
+ - `dot agents check`
11
+ - `dot agents list`
12
+ - `dot agents render`
13
+ - `dot agents`
10
14
  - `dot ai`
11
15
  - `dot apply --dry-run`
12
16
  - `dot apply`
13
17
  - `dot attest`
14
- - `dot benchmark --detailed`
15
- - `dot benchmark`
16
18
  - `dot bundle`
17
19
  - `dot cache-refresh`
18
20
  - `dot cd`
19
21
  - `dot chaos`
20
- - `dot clean-cache`
21
22
  - `dot commit`
22
23
  - `dot diff`
23
24
  - `dot doctor --json`
24
25
  - `dot doctor`
25
- - `dot drift`
26
26
  - `dot edit`
27
27
  - `dot env`
28
+ - `dot fleet apply --dry-run`
29
+ - `dot fleet apply`
28
30
  - `dot fleet attest`
29
31
  - `dot fleet diff`
30
32
  - `dot fleet sync`
31
33
  - `dot fleet`
32
34
  - `dot heal`
33
35
  - `dot help`
36
+ - `dot init --dry-run`
37
+ - `dot init`
34
38
  - `dot learn`
35
39
  - `dot lint`
36
40
  - `dot load-bench`
@@ -42,8 +46,11 @@ Alphabetical list of `dot` subcommands referenced in the manual.
42
46
  - `dot mode`
43
47
  - `dot packages`
44
48
  - `dot perf`
45
- - `dot prewarm`
46
49
  - `dot profile`
50
+ - `dot registry info`
51
+ - `dot registry list`
52
+ - `dot registry search`
53
+ - `dot registry`
47
54
  - `dot rollback`
48
55
  - `dot score`
49
56
  - `dot secrets rotate`
@@ -55,8 +62,5 @@ Alphabetical list of `dot` subcommands referenced in the manual.
55
62
  - `dot theme toggle`
56
63
  - `dot theme`
57
64
  - `dot tune`
58
- - `dot update`
59
65
  - `dot upgrade`
60
- - `dot verify --security`
61
- - `dot verify`
62
66
  - `dot version`
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: "The .dotfiles Manual"
3
+ description: "A trusted agent workstation baseline for macOS, Linux, and WSL."
4
+ render_with_liquid: false
5
+ ---
6
+
7
+ # The .dotfiles Manual
8
+
9
+ A trusted agent workstation baseline for macOS, Linux, and WSL. Chezmoi handles templating and platform differences; the `dot` CLI coordinates lifecycle operations on top.
10
+
11
+ This manual is generated from the Markdown sources in [`docs/manual/`](https://github.com/sebastienrousseau/dotfiles/tree/master/docs/manual) and published in nine formats per release. The HTML edition you are reading is the canonical online version.
12
+
13
+ ## Read it your way
14
+
15
+ - **Web (multi-page)** — browse the chapters below
16
+ - **Single-page HTML, PDF, EPUB, ASCII text** — attached to every [GitHub Release](https://github.com/sebastienrousseau/dotfiles/releases/latest)
17
+ - **CLI** — `dot manual` opens the manual locally; `dot manual pdf` downloads the PDF; `dot manual text` pipes the ASCII edition to your pager
18
+
19
+ ## Contents
20
+
21
+ ### [Introduction](00-introduction.md)
22
+
23
+ The audience, scope, conventions, and where the manual is published.
24
+
25
+ ### Concepts
26
+
27
+ - [Architecture](01-concepts/01-architecture.md) — repository layout, chezmoi templating, the `dot` dispatcher
28
+ - [Trust model](01-concepts/02-trust-model.md) — signing, attestation, SBOM, policy gates
29
+ - [Theme engine](01-concepts/03-theme-engine.md) — wallpaper-driven theming across apps
30
+ - [Fleet](01-concepts/04-fleet.md) — multi-workstation coordination and drift detection
31
+ - [Self-healing](01-concepts/05-self-healing.md) — automatic remediation and rollback
32
+
33
+ ### Tutorials
34
+
35
+ - [First install](02-tutorials/01-first-install.md)
36
+ - [Add a wallpaper-driven theme](02-tutorials/02-add-wallpaper.md)
37
+ - [Create an agent profile](02-tutorials/03-create-profile.md)
38
+ - [Encrypt a secret](02-tutorials/04-encrypt-secret.md)
39
+ - [Deploy to a fleet](02-tutorials/05-deploy-fleet.md)
40
+
41
+ ### Reference
42
+
43
+ - [`dot` CLI](03-reference/01-dot-cli.md) — every subcommand
44
+ - [Config files](03-reference/02-config-files.md) — every `~/.config/dotfiles/*` path
45
+ - [Environment](03-reference/03-environment.md) — every variable read by the framework
46
+ - [Templates](03-reference/04-templates.md) — every `{{ .var }}` reference
47
+ - [Feature flags](03-reference/05-feature-flags.md)
48
+
49
+ ### Cookbook
50
+
51
+ - [Recipes](04-cookbook/01-recipes.md)
52
+ - [Troubleshooting](04-cookbook/02-troubleshooting.md)
53
+ - [FAQ](04-cookbook/03-faq.md)
54
+
55
+ ### Appendices
56
+
57
+ - [A — Platform matrix](05-appendices/A-platform-matrix.md)
58
+ - [B — Security checklist](05-appendices/B-security-checklist.md)
59
+ - [C — Glossary](05-appendices/C-glossary.md)
60
+ - [D — Bibliography](05-appendices/D-bibliography.md)
61
+ - [E — License](05-appendices/E-license.md)
62
+
63
+ ### Indexes
64
+
65
+ - [Concept index](concept-index.md)
66
+ - [Command index](command-index.md)