@sebastienrousseau/dotfiles 0.2.520 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +43 -37
- package/install.sh +76 -10
- package/package.json +7 -7
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/ECOSYSTEM.md +0 -220
- package/docs/GOLD-STANDARD-AUDIT.md +0 -352
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/MINIMUM-TOOLCHAIN.md +0 -100
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -20
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -475
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -175
- package/docs/manual/concept-index.md +0 -170
- package/docs/manual/index.md +0 -66
- package/docs/migration/README.md +0 -81
- package/docs/migration/from-bare-git-repo.md +0 -156
- package/docs/migration/from-gnu-stow.md +0 -165
- package/docs/migration/from-plain-chezmoi.md +0 -148
- package/docs/migration/from-yadm.md +0 -187
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -44
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/packaging.md +0 -222
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURE-MATRIX.md +0 -646
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -243
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -209
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -165
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/attest-verify.sh +0 -147
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -43
- package/scripts/diagnostics/doctor.sh +0 -797
- package/scripts/diagnostics/drift-dashboard.sh +0 -203
- package/scripts/diagnostics/health.sh +0 -656
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -120
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -212
- package/scripts/dot/commands/agent.sh +0 -535
- package/scripts/dot/commands/agents.sh +0 -352
- package/scripts/dot/commands/ai.sh +0 -600
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -171
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -711
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -438
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -455
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -570
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -200
- package/scripts/nvim/headless-upgrade.lua +0 -81
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -67
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -613
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-feature-matrix.sh +0 -296
- package/scripts/qa/check-version-consistency.sh +0 -12
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -118
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -124
- package/scripts/qa/validate-examples.sh +0 -90
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -552
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -1020
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -603
- package/scripts/theme/switch.sh +0 -476
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/verify-release-versions +0 -156
- package/scripts/version-sync.sh +0 -714
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- package/templates/projects/python/tests/test_basic.py +0 -3
package/docs/ECOSYSTEM.md
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
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.
|
|
@@ -1,352 +0,0 @@
|
|
|
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
|
-
# Gold-standard audit
|
|
9
|
-
|
|
10
|
-
Scoring of this repository against the eight categories of the
|
|
11
|
-
repository gold standard, before and after the `feat/gold-standard`
|
|
12
|
-
work. Every row carries evidence — a file path, a workflow name, or a
|
|
13
|
-
command — so a claim here can be checked rather than believed.
|
|
14
|
-
|
|
15
|
-
Rubric: **1–3** absent or tribal knowledge · **4–6** exists but manual,
|
|
16
|
-
partial, or not CI-enforced · **7–8** solid, minor gaps, enforced ·
|
|
17
|
-
**9** enforced and documented with rationale · **10** a newcomer, a
|
|
18
|
-
packager, and a security auditor each get what they need without
|
|
19
|
-
asking anyone.
|
|
20
|
-
|
|
21
|
-
## Scores
|
|
22
|
-
|
|
23
|
-
| # | Category | Before | After | Remaining gap |
|
|
24
|
-
|---|---|:---:|:---:|---|
|
|
25
|
-
| 1 | Identity and README | 6 | 9 | README owned by a separate change; the Repology badge waits on ≥2 distros tracking the package |
|
|
26
|
-
| 2 | Documentation | 7 | 10 | — |
|
|
27
|
-
| 3 | Build and install UX | 4 | 10 | — |
|
|
28
|
-
| 4 | Releases and pre-built binaries | 7 | 9 | New release machinery has not yet run live; the target-matrix item does not apply to a shell project |
|
|
29
|
-
| 5 | Packaging and distribution | 5 | 8 | No deb/rpm recipe; nothing submitted to Debian/Fedora/nixpkgs; reproducibility is deterministic archiving, not a verified claim |
|
|
30
|
-
| 6 | Quality gates in CI | 8 | 9 | Coverage floor 58%; no API-breakage equivalent for a shell CLI beyond the snapshot tests |
|
|
31
|
-
| 7 | Supply chain and security | 7 | 10 | — |
|
|
32
|
-
| 8 | Community and governance | 7 | 10 | — |
|
|
33
|
-
|
|
34
|
-
Two categories moved the most: **build and install UX** (4 → 10),
|
|
35
|
-
where `make install` previously shipped no man page and no completions
|
|
36
|
-
and the installed binary could not find its own source tree; and
|
|
37
|
-
**supply chain** (7 → 10), where the per-file licence headers
|
|
38
|
-
contradicted the licence the project actually grants.
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 1. Identity and README — 6 → 9
|
|
43
|
-
|
|
44
|
-
README.md itself is owned by a separate change; this section scores the
|
|
45
|
-
material that supports it.
|
|
46
|
-
|
|
47
|
-
| Item | Before | After | Evidence |
|
|
48
|
-
|---|---|---|---|
|
|
49
|
-
| Badge row, install methods, quick start | Present | Present | `README.md` |
|
|
50
|
-
| Requirements stated **and** CI-enforced | Number only | Policy + table + matrix | `docs/MINIMUM-TOOLCHAIN.md`; floors mapped to the jobs that prove them |
|
|
51
|
-
| Four documentation links available to point at | 2 of 4 existed | All four exist | `docs/manual/`, `docs/ARCHITECTURE.md`, `DEVELOPMENT.md`, `docs/ECOSYSTEM.md` |
|
|
52
|
-
| Minimum-toolchain **policy**, not just a number | Absent | Present | `docs/MINIMUM-TOOLCHAIN.md` — when a floor may rise, on which axis, and the distro table with an honest "in CI?" column |
|
|
53
|
-
| Stability / security sections have targets | Partial | Present | `SECURITY.md`, `docs/security/FUZZING.md`, `supply-chain/README.md` |
|
|
54
|
-
| Versions in install snippets CI-checked | 8 surfaces | 16 surfaces | `scripts/verify-release-versions`, gated by `doc-drift.yml` |
|
|
55
|
-
| SPDX comment at line 1 of README.md | Absent | **Cannot be satisfied here** — see below | `tests/regression/test_flesch_readability.sh` |
|
|
56
|
-
|
|
57
|
-
### The one checklist item this repository cannot satisfy
|
|
58
|
-
|
|
59
|
-
The standard asks for an `<!-- SPDX-License-Identifier -->` comment on
|
|
60
|
-
line 1 of README.md. **That is not achievable here, and the conflict is
|
|
61
|
-
machine-checkable in both directions.**
|
|
62
|
-
|
|
63
|
-
`tests/regression/test_flesch_readability.sh` asserts
|
|
64
|
-
`flesch_clear_title_README_md`: the first non-empty line of README.md
|
|
65
|
-
(after any frontmatter) must introduce the document's title. An SPDX
|
|
66
|
-
comment displaces it. Verified rather than assumed — adding the comment
|
|
67
|
-
to line 1 and running the gate:
|
|
68
|
-
|
|
69
|
-
```console
|
|
70
|
-
$ bash tests/regression/test_flesch_readability.sh
|
|
71
|
-
✗ flesch_clear_title_README_md: missing clear title
|
|
72
|
-
RESULTS:92:91:1 # and 92:92:0 with the comment removed
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
So the repository has two enforced rules that cannot both hold for this
|
|
76
|
-
one file, and the older one wins. The comment is deliberately **not**
|
|
77
|
-
re-added.
|
|
78
|
-
|
|
79
|
-
**This costs nothing in machine-readable licensing, which is what the
|
|
80
|
-
requirement is actually for.** README.md carries no SPDX header at all,
|
|
81
|
-
and `reuse lint` still reports 1832/1832 files with both copyright and
|
|
82
|
-
licence information, and full REUSE 3.3 compliance — because
|
|
83
|
-
`REUSE.toml` annotates the tree with `path = ["**", "**/**"]`. Blanket
|
|
84
|
-
annotation is the mechanism the REUSE specification provides for
|
|
85
|
-
exactly this case: files that cannot carry a header, or where one would
|
|
86
|
-
be inappropriate. The licence of README.md is machine-readable today;
|
|
87
|
-
it is simply declared in `REUSE.toml` rather than in the file.
|
|
88
|
-
|
|
89
|
-
The residual gap is therefore narrow and worth stating precisely: a
|
|
90
|
-
reader opening README.md in isolation, outside the repository, sees no
|
|
91
|
-
licence marker. Anyone with the repository — which includes every
|
|
92
|
-
licence scanner — gets the correct answer.
|
|
93
|
-
|
|
94
|
-
**Exact remaining step, if the requirement is ever to be met literally:**
|
|
95
|
-
relax `flesch_clear_title` to skip a leading HTML comment the way it
|
|
96
|
-
already skips YAML frontmatter (`tests/regression/test_flesch_readability.sh`,
|
|
97
|
-
around line 408), then add the header. That is a change to an unrelated
|
|
98
|
-
gate, so it is recorded here rather than bundled into this branch.
|
|
99
|
-
|
|
100
|
-
**Why not 10:** the SPDX-comment item above, plus the Repology badge,
|
|
101
|
-
which is legitimately blocked until at least two distributions track
|
|
102
|
-
the package.
|
|
103
|
-
|
|
104
|
-
## 2. Documentation — 7 → 10
|
|
105
|
-
|
|
106
|
-
| Item | Before | After | Evidence |
|
|
107
|
-
|---|---|---|---|
|
|
108
|
-
| `docs/` as the single root | Yes | Yes | `mkdocs.yml`, `docs_dir: docs` |
|
|
109
|
-
| Rendered manual deployed to Pages | Yes | Yes | `pages.yml`, `manual-publish.yml`, doc.dotfiles.io |
|
|
110
|
-
| Root `DEVELOPMENT.md` | **Missing** | Present | `DEVELOPMENT.md` — toolchain setup, test layout, release model, and all 51 workflows mapped to local commands |
|
|
111
|
-
| `docs/ARCHITECTURE.md` at the canonical path | At `docs/architecture/` | Canonical, pointer left behind | `docs/ARCHITECTURE.md` |
|
|
112
|
-
| ADRs | 12 | 12 | `docs/adr/` |
|
|
113
|
-
| Migration guides per competitor | **None** | 4 | `docs/migration/` — yadm, GNU Stow, bare git repo, plain chezmoi |
|
|
114
|
-
| Link check gating CI | Advisory only (`fail: false`, schedule-only) | Gating | `docs-link-check.yml` job *Docs / Link Check (offline, gating)* |
|
|
115
|
-
|
|
116
|
-
**Verified:** `lychee --config config/lychee.toml --offline '**/*.md'`
|
|
117
|
-
→ 0 errors over 386 unique links, after fixing a real broken link in
|
|
118
|
-
`GOVERNANCE.md` that pointed at a `LICENSE` file removed by the
|
|
119
|
-
relicensing.
|
|
120
|
-
|
|
121
|
-
## 3. Build and install UX — 4 → 10
|
|
122
|
-
|
|
123
|
-
The weakest category before, and the one with the most user-visible
|
|
124
|
-
bugs.
|
|
125
|
-
|
|
126
|
-
| Item | Before | After | Evidence |
|
|
127
|
-
|---|---|---|---|
|
|
128
|
-
| `Makefile` for dev tasks | Mixed dev + install, 6 targets | Dev only, 20 targets with `make help` | `Makefile` |
|
|
129
|
-
| `GNUmakefile` with the Unix contract | **Missing** | Present | `GNUmakefile` — `PREFIX` (default `/usr/local`), `DESTDIR`, and per-directory overrides |
|
|
130
|
-
| FHS paths incl. `share/man/man1` and completions | **Bin symlink only** | Full FHS tree | `GNUmakefile` install target |
|
|
131
|
-
| Manpages generated from the CLI definitions | **Hand-written, drifted** | Generated + drift-gated | `tools/docs/generate-manpage.sh`, `doc-drift.yml` job *Generators / man page* |
|
|
132
|
-
| Completions in step with the CLI | **Hand-written, disagreed with the registry and each other** | bash generated byte-for-byte; zsh coverage-gated | `tools/docs/generate-completions.sh`, `doc-drift.yml` job *Generators / completions* |
|
|
133
|
-
| CI smoke: `make DESTDIR=… install` on a clean runner | Existed for the tarball | Plus `make installcheck` | `release-install-smoke.yml`; `GNUmakefile` `installcheck` |
|
|
134
|
-
|
|
135
|
-
Four real bugs were found by making these gates work, not by reading
|
|
136
|
-
the code:
|
|
137
|
-
|
|
138
|
-
1. `make install` placed only a `bin` symlink — `man dot` did not work
|
|
139
|
-
after installing, and no shell picked up completions.
|
|
140
|
-
2. `bin/dot` did not resolve symlinks, so the installed
|
|
141
|
-
`$(PREFIX)/bin/dot` resolved relative to the link and fell through
|
|
142
|
-
to `~/.dotfiles`, which a packaged install need not have.
|
|
143
|
-
3. `stage-dot.sh` copied the fish *function wrapper* into the fish
|
|
144
|
-
vendor completions directory, so every release shipped a no-op
|
|
145
|
-
completion that also shadowed the `dot` command at shell startup.
|
|
146
|
-
4. `stage-dot.sh` refused any destination named `dotfiles` — which is
|
|
147
|
-
exactly `$(PREFIX)/lib/dotfiles` — so `make install` failed outright.
|
|
148
|
-
|
|
149
|
-
The man page went from documenting roughly 40 commands to all 146,
|
|
150
|
-
because it is now rendered from the same registry that drives
|
|
151
|
-
`dot help all` and `dot completion`.
|
|
152
|
-
|
|
153
|
-
The completions landed on a split contract, and the reason is worth
|
|
154
|
-
recording. Generating the zsh completion byte-for-byte from the
|
|
155
|
-
registry *failed eight tests*, because it discarded everything the
|
|
156
|
-
registry cannot express: `ssh-cert` verbs, `dot new` template names,
|
|
157
|
-
`dot perf` flags, and the route-only aliases. Generating an artefact
|
|
158
|
-
is only correct when the generator can say everything the artefact
|
|
159
|
-
needs to say. So bash — which the registry fully describes — is
|
|
160
|
-
generated and checked byte-for-byte, while zsh stays hand-maintained
|
|
161
|
-
and is checked for *coverage*: every registry command must appear,
|
|
162
|
-
richer is allowed, missing is not. That gates the real defect (falling
|
|
163
|
-
behind the CLI; the file was 15 commands behind) without downgrading
|
|
164
|
-
what users get. The release tarball still generates all three shells
|
|
165
|
-
fresh, so a packaged install always matches its own CLI.
|
|
166
|
-
|
|
167
|
-
**Verified:** `make -n DESTDIR=/tmp/stage install` produces a sane
|
|
168
|
-
plan; a real staged install places bin, man, three completions and
|
|
169
|
-
both licences; `make installcheck` passes; the installed binary runs
|
|
170
|
-
from a sandboxed `HOME` with no source checkout; `make uninstall`
|
|
171
|
-
leaves zero files; `mandoc -T lint` is clean.
|
|
172
|
-
|
|
173
|
-
## 4. Releases and pre-built binaries — 7 → 9
|
|
174
|
-
|
|
175
|
-
| Item | Before | After | Evidence |
|
|
176
|
-
|---|---|---|---|
|
|
177
|
-
| SemVer, signed tags, Keep-a-Changelog | Yes | Yes | `verify-tag-signature.yml`, `CHANGELOG.md` |
|
|
178
|
-
| Tag-triggered automated pipeline | Yes | Yes | `docs/operations/RELEASE_PIPELINE.md` |
|
|
179
|
-
| **`workflow_dispatch` dry-run mode** | **Missing** | Present | `release-package-dot.yml` input `dry_run` (defaults to true), artefacts uploaded for inspection |
|
|
180
|
-
| Checksums | Docs bundle only | Plus archives | `dot-<version>.SHA256SUMS` |
|
|
181
|
-
| Sigstore bundle | On the SBOM only | Per archive, and verified in-workflow | `release-package-dot.yml` *Sign archives* + *Verify the bundles we just produced* |
|
|
182
|
-
| SLSA attestation | Yes | Yes | `actions/attest-build-provenance` |
|
|
183
|
-
| **SBOM (CycloneDX)** | SPDX only | Both formats | `release-package-dot.yml`; `security-release.yml` |
|
|
184
|
-
| Publish via OIDC, not long-lived tokens | Yes | Yes | keyless cosign; `id-token: write` |
|
|
185
|
-
|
|
186
|
-
A latent bug was avoided here: naming the new checksum file
|
|
187
|
-
`SHA256SUMS` would have collided with the documentation bundle's
|
|
188
|
-
existing asset of that name and, with `--clobber`, silently destroyed
|
|
189
|
-
it. Hence `dot-<version>.SHA256SUMS`.
|
|
190
|
-
|
|
191
|
-
**Why not 10:** the new machinery has not yet run against a live tag —
|
|
192
|
-
which is precisely what the `dry_run` input exists to de-risk. The
|
|
193
|
-
"pre-built binaries across a target matrix, musl static" item does not
|
|
194
|
-
apply: this is a shell framework, and its `noarch` archive already
|
|
195
|
-
runs everywhere the interpreter does.
|
|
196
|
-
|
|
197
|
-
## 5. Packaging and distribution — 5 → 8
|
|
198
|
-
|
|
199
|
-
| Item | Before | After | Evidence |
|
|
200
|
-
|---|---|---|---|
|
|
201
|
-
| `pkg/` with one directory per format | Templates under `install/` | `pkg/` | `pkg/{aur,brew,scoop,nix,docker}`, `pkg/README.md` |
|
|
202
|
-
| `docs/packaging.md` for distro maintainers | **Missing** | Present | `docs/packaging.md` |
|
|
203
|
-
| Signature-verification guide for packagers | Scattered | Single page | `pkg/VERIFY.md` |
|
|
204
|
-
| Container image, digest-pinned | No image | Documented decision | `pkg/docker/README.md` |
|
|
205
|
-
| Reproducible-builds statement | Implicit | Scoped honestly | `docs/packaging.md` — "deterministic archiving", explicitly *not* a reproducible-builds certification, because no diffoscope comparison runs |
|
|
206
|
-
|
|
207
|
-
**Why not 10:** no deb or rpm recipe ships; nothing has been submitted
|
|
208
|
-
to Debian, Fedora or nixpkgs; and the reproducibility claim is
|
|
209
|
-
deliberately narrow. **Exact remaining step:** add `pkg/deb/` and
|
|
210
|
-
`pkg/rpm/` recipes over `make install`, then file the first
|
|
211
|
-
submission — the `DESTDIR` tree they need is already correct.
|
|
212
|
-
|
|
213
|
-
## 6. Quality gates in CI — 8 → 9
|
|
214
|
-
|
|
215
|
-
| Item | Before | After | Evidence |
|
|
216
|
-
|---|---|---|---|
|
|
217
|
-
| OS matrix | Yes | Yes | `cross-platform-test.yml`: ubuntu, macos-latest, macos-14; windows for the PowerShell contract |
|
|
218
|
-
| Lint at zero warnings | Yes | Yes | `ci-enforced.yml` |
|
|
219
|
-
| Docs build with warnings denied | Yes | Yes | `pages.yml` (`mkdocs build --strict`) |
|
|
220
|
-
| Coverage gate at a stated threshold | 58%, rationale in-workflow | Same, now documented for contributors | `coverage.yml`; `DEVELOPMENT.md` |
|
|
221
|
-
| Fuzz targets + **regression corpus replayed per push** | Corpus replayed only inside the long fuzz jobs, and only on four path filters | Dedicated fast replay job | `fuzz.yml` job *Fuzz / corpus replay* |
|
|
222
|
-
| Examples executed in CI (docs that run) | Already gated | Unchanged, confirmed | `reliability-gate.yml` job *Examples Contract* → `scripts/qa/validate-examples.sh`, on every push and PR |
|
|
223
|
-
| Benchmarks smoke-run | `2>/dev/null \|\| true` in `ci.yml` | Plus a real target | `make bench`; `benches/README.md` |
|
|
224
|
-
| Generated-artefact drift | 2 gates | 4 gates | `doc-drift.yml` |
|
|
225
|
-
|
|
226
|
-
**Why not 10:** the coverage floor is 58% rather than a number chosen
|
|
227
|
-
for a stated risk model, and there is no API-breakage check — for a
|
|
228
|
-
shell CLI the nearest equivalent is the snapshot tests in
|
|
229
|
-
`tests/snapshots/`, which cover output but not every flag.
|
|
230
|
-
**Exact remaining step:** ratchet the coverage floor with a written
|
|
231
|
-
rationale per slice, and extend snapshot coverage to the full flag
|
|
232
|
-
surface.
|
|
233
|
-
|
|
234
|
-
## 7. Supply chain and security — 7 → 10
|
|
235
|
-
|
|
236
|
-
| Item | Before | After | Evidence |
|
|
237
|
-
|---|---|---|---|
|
|
238
|
-
| `SECURITY.md` with private channel and SLA | At `.github/` | At the root, pointer left behind | `SECURITY.md` |
|
|
239
|
-
| Dependency review + advisory audit | Yes | Yes | `dependency-review.yml`, `deps-dev-validation.yml`, `sbom-diff.yml` |
|
|
240
|
-
| Dependency **provenance policy** | Scattered across three docs | One directory, each rule mapped to its enforcing job | `supply-chain/README.md` |
|
|
241
|
-
| Everything pinned | Yes | Yes | `tools/ci/lint-reusable-pins.sh` — 16 call sites, 0 failures |
|
|
242
|
-
| Scorecard workflow and badge | Yes | Yes | `scorecard.yml` |
|
|
243
|
-
| CII best-practices self-assessment | Badge + tracking page | Unchanged | `docs/security/SCORECARD.md` |
|
|
244
|
-
| **Signing keys published (`KEYS.asc`)** | **Missing** | Present, with a verified guide | `KEYS.asc` |
|
|
245
|
-
| **REUSE/SPDX compliance, linted in CI** | **Non-compliant** | Compliant and gated | `REUSE.toml`, `LICENSES/`, `docs-link-check.yml` job *Docs / REUSE lint* |
|
|
246
|
-
|
|
247
|
-
The significant finding: commit `21f15024` relicensed the project to
|
|
248
|
-
`Apache-2.0 OR MIT` — both licence files ship and `package.json`
|
|
249
|
-
declares the pair — but the per-file SPDX headers were never swept.
|
|
250
|
-
**898 files still declared bare `MIT`**, a narrower grant than the
|
|
251
|
-
project offers and the statement a downstream licence scanner would
|
|
252
|
-
actually rely on. After the sweep: **0**, with 916 files declaring the
|
|
253
|
-
dual grant, and two independent gates so it cannot recur —
|
|
254
|
-
`reuse lint` proves every file *has* licensing information, and
|
|
255
|
-
`tools/ci/normalize-spdx-headers.sh --check` proves it is the *right*
|
|
256
|
-
grant, with the expected value read from `package.json` rather than
|
|
257
|
-
hardcoded.
|
|
258
|
-
|
|
259
|
-
`KEYS.asc` was verified rather than assumed: with the file,
|
|
260
|
-
`git -c gpg.ssh.allowedSignersFile=KEYS.asc tag -v v0.2.519` prints
|
|
261
|
-
`Good "git" signature for sebastian.rousseau@gmail.com`; without it,
|
|
262
|
-
`No principal matched`. Every command in its guide was run before it
|
|
263
|
-
was committed.
|
|
264
|
-
|
|
265
|
-
## 8. Community and governance — 7 → 10
|
|
266
|
-
|
|
267
|
-
| Item | Before | After | Evidence |
|
|
268
|
-
|---|---|---|---|
|
|
269
|
-
| CODE_OF_CONDUCT, CONTRIBUTING, GOVERNANCE | Present | Present | root |
|
|
270
|
-
| **SUPPORT.md** | **Missing** | Present | `SUPPORT.md` |
|
|
271
|
-
| Issue + PR templates | Present | Present | `.github/ISSUE_TEMPLATE/`, `PULL_REQUEST_TEMPLATE.md` |
|
|
272
|
-
| **CITATION.cff** | **Missing** | Present, validated | `CITATION.cff`; `cffconvert --validate` |
|
|
273
|
-
| `AGENTS.md` | Present | Present | `AGENTS.md`, generated from `CLAUDE.md` |
|
|
274
|
-
| `.editorconfig`, pre-commit, markdownlint + codespell | codespell unconfigured | Configured and clean | `config/codespellrc`, `config/markdownlint-cli2.jsonc` |
|
|
275
|
-
| `.devcontainer/` booting to a working `make` | Present | Present | `.devcontainer/` |
|
|
276
|
-
| Family table for multi-repo layouts | **Missing** | Present | `docs/ECOSYSTEM.md` |
|
|
277
|
-
|
|
278
|
-
`docs/ECOSYSTEM.md` answers the family-table item for a repository
|
|
279
|
-
that is deliberately singular: what lives in-repo, the three tap
|
|
280
|
-
repositories that must be separate because their tooling demands it,
|
|
281
|
-
and the case for each of MCP, LSP and WASM — with the command that
|
|
282
|
-
checks each claim and a note on what would change the decision.
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## Gates run
|
|
287
|
-
|
|
288
|
-
Every gate below was executed in this worktree.
|
|
289
|
-
|
|
290
|
-
| Gate | Command | Result |
|
|
291
|
-
|---|---|---|
|
|
292
|
-
| Shell lint | `git ls-files '*.sh' \| xargs shellcheck --severity=error -e SC1091 -e SC2030 -e SC2031` | pass |
|
|
293
|
-
| Shell format | `shfmt -d -i 2 -ci` on every added or edited script | pass |
|
|
294
|
-
| Markdown | `npx markdownlint-cli2` | 0 issues in 253 files |
|
|
295
|
-
| Spelling | `codespell --config config/codespellrc` | pass |
|
|
296
|
-
| Spelling | `typos --config config/typos.toml` | pass |
|
|
297
|
-
| Copyright + SPDX grant | `bash tools/ci/check-copyright-headers.sh` | 939 files pass |
|
|
298
|
-
| SPDX sweep | `bash tools/ci/normalize-spdx-headers.sh --check` | pass |
|
|
299
|
-
| REUSE | `reuse lint` | compliant, 1831/1831 files |
|
|
300
|
-
| Links | `lychee --config config/lychee.toml --offline '**/*.md'` | 0 errors |
|
|
301
|
-
| Action pins | `bash tools/ci/lint-reusable-pins.sh` | 16 call sites, 0 failures |
|
|
302
|
-
| Workflow syntax | `actionlint` on every edited workflow | pass |
|
|
303
|
-
| Generated-artefact drift | `make check-drift` | 4/4 in sync |
|
|
304
|
-
| Version surfaces | `bash scripts/verify-release-versions` | 16/16 match |
|
|
305
|
-
| Man page | `mandoc -T lint share/man/man1/dot.1` | clean |
|
|
306
|
-
| CFF | `cffconvert --validate` | valid |
|
|
307
|
-
| Fuzz corpus | `cd fuzz && go vet ./... && go test ./...` | pass |
|
|
308
|
-
| Full test suite | `bash scripts/qa/reliability-audit.sh` | 5575 tests; see note below |
|
|
309
|
-
| Examples | `bash scripts/qa/validate-examples.sh` | pass |
|
|
310
|
-
| Install contract | `make DESTDIR=… install`, `installcheck`, `uninstall` | pass; 0 files left |
|
|
311
|
-
| bash 3.2 compatibility | CLI, generators and version gate under macOS `/bin/bash` 3.2.57 | pass |
|
|
312
|
-
| Tag signature | `git -c gpg.ssh.allowedSignersFile=KEYS.asc tag -v v0.2.519` | Good signature |
|
|
313
|
-
|
|
314
|
-
## Standing caveats
|
|
315
|
-
|
|
316
|
-
Recorded so the scores above are not read as more than they are:
|
|
317
|
-
|
|
318
|
-
- The release additions (dry-run, checksums, CycloneDX SBOM, sigstore
|
|
319
|
-
bundles) are **verified by workflow linting and local equivalents,
|
|
320
|
-
not by a live release run**. The `dry_run` input exists to be
|
|
321
|
-
exercised before the first live use.
|
|
322
|
-
- `docs/MINIMUM-TOOLCHAIN.md` marks Debian, RHEL and Fedora as
|
|
323
|
-
*expected but unverified*, because no job in CI runs on them. That
|
|
324
|
-
is a deliberate refusal to make an unbacked distro-LTS claim, not an
|
|
325
|
-
oversight.
|
|
326
|
-
- The reproducibility statement covers **deterministic archiving**
|
|
327
|
-
only.
|
|
328
|
-
- Coverage is gated at 58%, a measured floor rather than a target.
|
|
329
|
-
- Full-suite results: the first run reported 11 failures, the final run
|
|
330
|
-
5, of 5597 tests. Eight of the original 11 were a genuine regression
|
|
331
|
-
in this branch (the zsh completion — fixed above and re-verified);
|
|
332
|
-
one was a stale contract assertion, updated alongside the workflow it
|
|
333
|
-
describes. Of the 5 remaining, four
|
|
334
|
-
(`test_auto_docs_coverage`, `test_auto_doctor`, `test_auto_tools`,
|
|
335
|
-
`test_test_framework_invariants`) pass in isolation — 6/6, 6/6, 17/17
|
|
336
|
-
and 17/17 — and fail only under the suite's parallelism.
|
|
337
|
-
- One test is genuinely flaky and worth recording rather than
|
|
338
|
-
dismissing: `tests/unit/auto/test_auto_traceability_coverage.sh`
|
|
339
|
-
passed 3/3 at the branch base and 1/3 on this branch. The cause is
|
|
340
|
-
not a broken behaviour — `scripts/qa/traceability-coverage.sh`
|
|
341
|
-
reports 169/169 (100%) and `docs/operations/TRACEABILITY.md` is
|
|
342
|
-
untouched by this branch, so no traced path was broken by the
|
|
343
|
-
directory moves. It is the auto-generated coverage harness: it calls
|
|
344
|
-
every function in the script under a 60 s cap, including `trim()`,
|
|
345
|
-
whose body is a bare `sed` reading standard input. Called with no
|
|
346
|
-
stdin, it blocks until EOF, so whether the run fits inside the cap
|
|
347
|
-
depends on what stdin happens to be. **Exact remaining step:** give
|
|
348
|
-
`trim()` a `"${1:-}"`-style argument form, or add it to the
|
|
349
|
-
functions-mode skip-list in `tests/framework/coverage_helpers.sh`.
|
|
350
|
-
Left alone here because it is a pre-existing latent defect in an
|
|
351
|
-
unrelated harness, and fixing it does not belong in a structure
|
|
352
|
-
cleanup.
|
package/docs/GOVERNANCE.md
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
# Governance
|
|
2
|
-
|
|
3
|
-
## Model
|
|
4
|
-
|
|
5
|
-
**Single-maintainer steward.** The project is owned and decided
|
|
6
|
-
by one maintainer (see [`MAINTAINERS.md`](MAINTAINERS.md)). This document exists so
|
|
7
|
-
contributors and downstream consumers understand exactly how
|
|
8
|
-
decisions are made, how to influence them, and what guarantees
|
|
9
|
-
exist.
|
|
10
|
-
|
|
11
|
-
## Decision-making
|
|
12
|
-
|
|
13
|
-
| Decision class | Process | Veto |
|
|
14
|
-
|---|---|---|
|
|
15
|
-
| Bug fix | Open PR, maintainer reviews + merges. Tests required. | Maintainer |
|
|
16
|
-
| Feature addition | Open issue first to scope. Then PR. Larger changes need an RFC in `docs/operations/`. | Maintainer |
|
|
17
|
-
| Breaking change | RFC in `docs/operations/RFC_<topic>.md` + 2-week comment window + migration script + at least one minor-version deprecation. | Maintainer (with public reasoning) |
|
|
18
|
-
| Security policy | `SECURITY.md` is the canonical reference. Disclosure-key rotation follows `docs/security/KEY_ROTATION.md`. | Maintainer + 30-day public notice |
|
|
19
|
-
| Dependency change | Pre-commit + CI must stay green. New runtime deps require RFC. | Maintainer |
|
|
20
|
-
| Release | Maintainer cuts tags. Convention: signed annotated tag, Cosign-signed SBOM, SLSA L3 provenance. | Maintainer |
|
|
21
|
-
|
|
22
|
-
## Contribution flow
|
|
23
|
-
|
|
24
|
-
1. **Issue** for non-trivial work. Confirm scope before coding.
|
|
25
|
-
2. **Branch** off `main`: `feat/<scope>`, `fix/<scope>`,
|
|
26
|
-
`docs/<scope>`, etc.
|
|
27
|
-
3. **PR** with description following the template:
|
|
28
|
-
- Summary (1–3 bullets)
|
|
29
|
-
- Test plan (checklist)
|
|
30
|
-
- Trailing Euxis signature block (required by
|
|
31
|
-
`pr-signature.yml`)
|
|
32
|
-
4. **CI** must pass before merge. Pre-commit hooks must not be
|
|
33
|
-
bypassed (`--no-verify` is rejected by the pre-push hook).
|
|
34
|
-
5. **Review** by the maintainer. Squash-merge is the project
|
|
35
|
-
default; merge-commit only for release PRs that need history
|
|
36
|
-
preserved (e.g., `feat/v0.X.YYY` aggregate PRs).
|
|
37
|
-
6. **Commit signing** is mandatory: SSH or GPG. Unsigned commits
|
|
38
|
-
are rejected at push.
|
|
39
|
-
|
|
40
|
-
See `CONTRIBUTING.md` for full code-style + commit-message
|
|
41
|
-
requirements.
|
|
42
|
-
|
|
43
|
-
## RFC process
|
|
44
|
-
|
|
45
|
-
For breaking changes or substantial new features:
|
|
46
|
-
|
|
47
|
-
1. Create `docs/operations/RFC_<short-name>.md` with sections:
|
|
48
|
-
- **Summary** (one paragraph)
|
|
49
|
-
- **Motivation** (why now, what's broken without it)
|
|
50
|
-
- **Detailed design** (concrete file paths, API shapes)
|
|
51
|
-
- **Backwards compatibility** (what breaks, migration path)
|
|
52
|
-
- **Alternatives considered** (with reasons rejected)
|
|
53
|
-
- **Unresolved questions**
|
|
54
|
-
2. Open a PR labelled `rfc` against `main`.
|
|
55
|
-
3. Comment window: 14 days minimum.
|
|
56
|
-
4. Maintainer renders a decision (accept / accept-with-changes /
|
|
57
|
-
reject) with public reasoning in the PR.
|
|
58
|
-
5. Accepted RFCs are merged as-is to `docs/operations/` and become
|
|
59
|
-
the implementation reference.
|
|
60
|
-
|
|
61
|
-
Active and historical RFCs are linked from
|
|
62
|
-
`docs/operations/README.md`.
|
|
63
|
-
|
|
64
|
-
## Code of conduct
|
|
65
|
-
|
|
66
|
-
Standard expectations: be kind, assume good faith, focus on the
|
|
67
|
-
work. Discriminatory or harassing behaviour is grounds for
|
|
68
|
-
permanent block. Report incidents to the maintainer via the
|
|
69
|
-
security disclosure channel (`security@sebastienrousseau.com`,
|
|
70
|
-
encrypted to the WKD-published GPG key).
|
|
71
|
-
|
|
72
|
-
## Forking
|
|
73
|
-
|
|
74
|
-
The project is MIT-licensed; fork freely. If your fork diverges
|
|
75
|
-
substantially and gains its own community, please rename it to
|
|
76
|
-
avoid downstream confusion ("dotfiles-X" or similar).
|
|
77
|
-
|
|
78
|
-
## Sustainability
|
|
79
|
-
|
|
80
|
-
The single-maintainer model has known weaknesses (bus factor,
|
|
81
|
-
review bandwidth, perspective). The project mitigates these by:
|
|
82
|
-
|
|
83
|
-
- **Comprehensive automation**: 75+ CI checks, pre-commit hooks,
|
|
84
|
-
shellcheck/shfmt/typos enforcement.
|
|
85
|
-
- **Documented architecture**: [`STRUCTURE.md`](STRUCTURE.md), `scripts/README.md`,
|
|
86
|
-
`architecture/`, `operations/HARD_AUDIT_2026.md`.
|
|
87
|
-
- **Cryptographic supply chain**: Cosign-signed SBOMs, SLSA L3
|
|
88
|
-
provenance, signed commits, WKD-published disclosure key.
|
|
89
|
-
- **Permissive license**: MIT — anyone can fork and continue.
|
|
90
|
-
- **Active issue triage**: targeted weekly cadence.
|
|
91
|
-
|
|
92
|
-
When the project gains regular contributors, this document will be
|
|
93
|
-
updated to reflect the shared-maintainer model.
|
|
94
|
-
|
|
95
|
-
## Reference
|
|
96
|
-
|
|
97
|
-
- [OpenSSF Best Practices criteria](https://www.bestpractices.dev/en/criteria/0) — this governance model is designed to satisfy the "passing" tier.
|
|
98
|
-
- [CNCF Project Governance template](https://contribute.cncf.io/maintainers/governance/) — adapted for solo maintainership.
|