@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.
Files changed (323) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +43 -37
  5. package/install.sh +76 -10
  6. package/package.json +7 -7
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/ARCHITECTURE.md +0 -117
  12. package/docs/CNAME +0 -1
  13. package/docs/CONFIG_STRATEGY.md +0 -124
  14. package/docs/COPYRIGHT +0 -7
  15. package/docs/ECOSYSTEM.md +0 -220
  16. package/docs/GOLD-STANDARD-AUDIT.md +0 -352
  17. package/docs/GOVERNANCE.md +0 -98
  18. package/docs/MAINTAINERS.md +0 -41
  19. package/docs/MINIMUM-TOOLCHAIN.md +0 -100
  20. package/docs/NAMING_CONVENTIONS.md +0 -102
  21. package/docs/OPENCODE.md +0 -127
  22. package/docs/README.md +0 -84
  23. package/docs/STRUCTURE.md +0 -102
  24. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  25. package/docs/adr/ADR-002-shell-performance.md +0 -130
  26. package/docs/adr/ADR-003-security-first.md +0 -158
  27. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  28. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  29. package/docs/adr/ADR-006-shell-selection.md +0 -124
  30. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  31. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  32. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  33. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  34. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  35. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  36. package/docs/adr/README.md +0 -40
  37. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  38. package/docs/architecture/ARCHITECTURE.md +0 -20
  39. package/docs/architecture/INTEROP.md +0 -44
  40. package/docs/architecture/REPO_LAYOUT.md +0 -241
  41. package/docs/architecture/WALKTHROUGH.md +0 -86
  42. package/docs/architecture/fleet-deployment.md +0 -77
  43. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  44. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  45. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  46. package/docs/archive/PLAN.md +0 -199
  47. package/docs/archive/REPO_AUDIT.md +0 -31
  48. package/docs/articles/.pages +0 -6
  49. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  50. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  51. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  52. package/docs/articles/index.md +0 -36
  53. package/docs/guides/INSTALL.md +0 -144
  54. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
  55. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  56. package/docs/guides/THEMING.md +0 -230
  57. package/docs/guides/TROUBLESHOOTING.md +0 -176
  58. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  59. package/docs/index.md +0 -132
  60. package/docs/interop/A2A.md +0 -39
  61. package/docs/interop/POWERSHELL.md +0 -102
  62. package/docs/manual/00-introduction.md +0 -89
  63. package/docs/manual/01-concepts/01-architecture.md +0 -138
  64. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  65. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  66. package/docs/manual/01-concepts/04-fleet.md +0 -148
  67. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  68. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  69. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  70. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  71. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  72. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  73. package/docs/manual/03-reference/01-dot-cli.md +0 -475
  74. package/docs/manual/03-reference/02-config-files.md +0 -265
  75. package/docs/manual/03-reference/03-environment.md +0 -124
  76. package/docs/manual/03-reference/04-templates.md +0 -190
  77. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  78. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  79. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  80. package/docs/manual/04-cookbook/03-faq.md +0 -175
  81. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  82. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  83. package/docs/manual/05-appendices/C-glossary.md +0 -40
  84. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  85. package/docs/manual/05-appendices/E-license.md +0 -38
  86. package/docs/manual/_toc.yml +0 -58
  87. package/docs/manual/command-index.md +0 -175
  88. package/docs/manual/concept-index.md +0 -170
  89. package/docs/manual/index.md +0 -66
  90. package/docs/migration/README.md +0 -81
  91. package/docs/migration/from-bare-git-repo.md +0 -156
  92. package/docs/migration/from-gnu-stow.md +0 -165
  93. package/docs/migration/from-plain-chezmoi.md +0 -148
  94. package/docs/migration/from-yadm.md +0 -187
  95. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  96. package/docs/operations/ATTESTATION.md +0 -44
  97. package/docs/operations/CI_CADENCE.md +0 -107
  98. package/docs/operations/CI_COMPOSITES.md +0 -156
  99. package/docs/operations/COMPLETIONS.md +0 -123
  100. package/docs/operations/COVERAGE.md +0 -204
  101. package/docs/operations/DRIFT.md +0 -107
  102. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  103. package/docs/operations/MAINTENANCE.md +0 -63
  104. package/docs/operations/MANIFEST.md +0 -127
  105. package/docs/operations/MIGRATION.md +0 -109
  106. package/docs/operations/OPERATIONS.md +0 -188
  107. package/docs/operations/PERFORMANCE.md +0 -133
  108. package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
  109. package/docs/operations/REGISTRY.md +0 -90
  110. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  111. package/docs/operations/RELIABILITY.md +0 -122
  112. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  113. package/docs/operations/ROADMAP.md +0 -10
  114. package/docs/operations/ROADMAP_2026.md +0 -7
  115. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  116. package/docs/operations/TESTING.md +0 -216
  117. package/docs/operations/TRACEABILITY.md +0 -44
  118. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  119. package/docs/operations/VERSION_SYNC.md +0 -393
  120. package/docs/packaging.md +0 -222
  121. package/docs/reference/ALIASES.md +0 -131
  122. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  123. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  124. package/docs/reference/FEATURE-MATRIX.md +0 -646
  125. package/docs/reference/FEATURES.md +0 -66
  126. package/docs/reference/FONTS.md +0 -112
  127. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  128. package/docs/reference/PROFILES.md +0 -69
  129. package/docs/reference/SCREENSHOTS.md +0 -121
  130. package/docs/reference/SCRIPTS.md +0 -71
  131. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  132. package/docs/reference/THEMES.md +0 -117
  133. package/docs/reference/TOOLS.md +0 -110
  134. package/docs/reference/UTILS.md +0 -243
  135. package/docs/registry.json +0 -6
  136. package/docs/schema/dot-env-v1.json +0 -110
  137. package/docs/schema/dot-registry-v1.json +0 -33
  138. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  139. package/docs/security/AUDIT_BYPASS.md +0 -103
  140. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  141. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  142. package/docs/security/CI_PINNING.md +0 -129
  143. package/docs/security/COMMIT_SIGNING.md +0 -138
  144. package/docs/security/COMPLIANCE.md +0 -458
  145. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  146. package/docs/security/DISCLOSURE.md +0 -130
  147. package/docs/security/ENCRYPTION.md +0 -57
  148. package/docs/security/FMEA.md +0 -159
  149. package/docs/security/FUZZING.md +0 -209
  150. package/docs/security/HISTORY_FILTERING.md +0 -132
  151. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  152. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  153. package/docs/security/KEYS.md +0 -49
  154. package/docs/security/KEY_ROTATION.md +0 -303
  155. package/docs/security/MCP_POLICY.md +0 -78
  156. package/docs/security/POLICY_RELEASES.md +0 -37
  157. package/docs/security/README.md +0 -28
  158. package/docs/security/SCORECARD.md +0 -195
  159. package/docs/security/SECRETS.md +0 -158
  160. package/docs/security/SECURITY.md +0 -45
  161. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  162. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  163. package/docs/security/SOUP_REGISTER.md +0 -36
  164. package/docs/security/THREAT_MODEL.md +0 -130
  165. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  166. package/docs/security/VERIFY_RELEASE.md +0 -201
  167. package/docs/security/security-pubkey.asc +0 -15
  168. package/docs/stylesheets/extra.css +0 -444
  169. package/docs/themes/README.md +0 -10
  170. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  171. package/docs/themes/hero-shot.svg +0 -78
  172. package/scripts/README.md +0 -123
  173. package/scripts/ci/check-copyright-headers.sh +0 -8
  174. package/scripts/ci/check-shell-preamble.sh +0 -8
  175. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  176. package/scripts/demo/record.sh +0 -43
  177. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  178. package/scripts/diagnostics/alias-governance.sh +0 -165
  179. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  180. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  181. package/scripts/diagnostics/attest-verify.sh +0 -147
  182. package/scripts/diagnostics/benchmark.sh +0 -408
  183. package/scripts/diagnostics/conflicts.sh +0 -73
  184. package/scripts/diagnostics/doctor-unified.sh +0 -43
  185. package/scripts/diagnostics/doctor.sh +0 -797
  186. package/scripts/diagnostics/drift-dashboard.sh +0 -203
  187. package/scripts/diagnostics/health.sh +0 -656
  188. package/scripts/diagnostics/history-analysis.sh +0 -86
  189. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  190. package/scripts/diagnostics/perf.sh +0 -453
  191. package/scripts/diagnostics/scorecard.sh +0 -120
  192. package/scripts/diagnostics/secret-governance.sh +0 -65
  193. package/scripts/diagnostics/security-score.sh +0 -467
  194. package/scripts/diagnostics/smoke-test.sh +0 -88
  195. package/scripts/diagnostics/snapshot.sh +0 -90
  196. package/scripts/diagnostics/verify.sh +0 -108
  197. package/scripts/diagnostics/verify_state.sh +0 -73
  198. package/scripts/diagnostics/version-locks.sh +0 -94
  199. package/scripts/diagnostics/workstation-attestation.sh +0 -212
  200. package/scripts/dot/commands/agent.sh +0 -535
  201. package/scripts/dot/commands/agents.sh +0 -352
  202. package/scripts/dot/commands/ai.sh +0 -600
  203. package/scripts/dot/commands/aliases.sh +0 -277
  204. package/scripts/dot/commands/appearance.sh +0 -110
  205. package/scripts/dot/commands/completion.sh +0 -171
  206. package/scripts/dot/commands/core.sh +0 -217
  207. package/scripts/dot/commands/diagnostics.sh +0 -265
  208. package/scripts/dot/commands/env-emit.sh +0 -203
  209. package/scripts/dot/commands/fleet.sh +0 -711
  210. package/scripts/dot/commands/init.sh +0 -185
  211. package/scripts/dot/commands/lint.sh +0 -208
  212. package/scripts/dot/commands/manual.sh +0 -169
  213. package/scripts/dot/commands/meta.sh +0 -438
  214. package/scripts/dot/commands/patterns.sh +0 -55
  215. package/scripts/dot/commands/registry.sh +0 -455
  216. package/scripts/dot/commands/restore.sh +0 -232
  217. package/scripts/dot/commands/secrets.sh +0 -296
  218. package/scripts/dot/commands/security.sh +0 -102
  219. package/scripts/dot/commands/tools.sh +0 -570
  220. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  221. package/scripts/dot/powershell/Dot.psm1 +0 -319
  222. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  223. package/scripts/fonts/patch-fonts.sh +0 -36
  224. package/scripts/git-hooks/install.sh +0 -12
  225. package/scripts/git-hooks/pre-commit +0 -12
  226. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  227. package/scripts/git-hooks/pre-push +0 -105
  228. package/scripts/git-hooks/prepare-commit-msg +0 -29
  229. package/scripts/lib/secrets_provider.sh +0 -200
  230. package/scripts/nvim/headless-upgrade.lua +0 -81
  231. package/scripts/ops/ai-setup.sh +0 -71
  232. package/scripts/ops/bundle.sh +0 -104
  233. package/scripts/ops/chaos.sh +0 -50
  234. package/scripts/ops/chezmoi-apply.sh +0 -333
  235. package/scripts/ops/chezmoi-diff.sh +0 -16
  236. package/scripts/ops/chezmoi-remove.sh +0 -46
  237. package/scripts/ops/chezmoi-update.sh +0 -67
  238. package/scripts/ops/heal-chezmoi.sh +0 -87
  239. package/scripts/ops/heal-system.sh +0 -129
  240. package/scripts/ops/heal-tools.sh +0 -297
  241. package/scripts/ops/heal.sh +0 -223
  242. package/scripts/ops/post-apply-repair.sh +0 -107
  243. package/scripts/ops/prewarm.sh +0 -128
  244. package/scripts/ops/release.sh +0 -262
  245. package/scripts/ops/rollback.sh +0 -613
  246. package/scripts/ops/setup.sh +0 -138
  247. package/scripts/ops/teleport.sh +0 -34
  248. package/scripts/qa/check-feature-matrix.sh +0 -296
  249. package/scripts/qa/check-version-consistency.sh +0 -12
  250. package/scripts/qa/coverage-baseline.sh +0 -61
  251. package/scripts/qa/docs-coverage.sh +0 -118
  252. package/scripts/qa/examples-coverage.sh +0 -94
  253. package/scripts/qa/powershell-contract.ps1 +0 -95
  254. package/scripts/qa/reliability-audit.sh +0 -139
  255. package/scripts/qa/scorecard-snapshot.sh +0 -128
  256. package/scripts/qa/traceability-coverage.sh +0 -124
  257. package/scripts/qa/validate-examples.sh +0 -90
  258. package/scripts/qa/wsl-contract.sh +0 -12
  259. package/scripts/secrets/age-init.sh +0 -82
  260. package/scripts/secrets/create-secrets-file.sh +0 -46
  261. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  262. package/scripts/security/backup.sh +0 -58
  263. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  264. package/scripts/security/dns-doh.sh +0 -52
  265. package/scripts/security/encryption-check.sh +0 -55
  266. package/scripts/security/enforce-policies.sh +0 -552
  267. package/scripts/security/firewall.sh +0 -91
  268. package/scripts/security/lock-configs.sh +0 -67
  269. package/scripts/security/lock-screen.sh +0 -56
  270. package/scripts/security/manage-secrets.sh +0 -429
  271. package/scripts/security/ssh-cert.sh +0 -204
  272. package/scripts/security/telemetry-kill.sh +0 -51
  273. package/scripts/security/usb-safety.sh +0 -52
  274. package/scripts/theme/apply-gnome-theme.sh +0 -333
  275. package/scripts/theme/extract-heic-frames.sh +0 -115
  276. package/scripts/theme/extract-theme.py +0 -1020
  277. package/scripts/theme/install-boot-logo.sh +0 -63
  278. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  279. package/scripts/theme/install-cursors.sh +0 -26
  280. package/scripts/theme/install-file-icons.sh +0 -27
  281. package/scripts/theme/install-grub-theme.sh +0 -62
  282. package/scripts/theme/install-lock-icon.sh +0 -31
  283. package/scripts/theme/merge-wallpaper.sh +0 -146
  284. package/scripts/theme/rebuild-themes.sh +0 -603
  285. package/scripts/theme/switch.sh +0 -476
  286. package/scripts/theme/wallpaper-rotate.sh +0 -137
  287. package/scripts/theme/wallpaper-sync.sh +0 -690
  288. package/scripts/tools/cmatrix.sh +0 -22
  289. package/scripts/tools/detect-collisions.py +0 -103
  290. package/scripts/tools/emoji-picker.sh +0 -49
  291. package/scripts/tools/figlet-banner.sh +0 -19
  292. package/scripts/tools/log-rotate.sh +0 -31
  293. package/scripts/tools/lolcat-wrap.sh +0 -20
  294. package/scripts/tools/pipes.sh +0 -49
  295. package/scripts/tuning/linux.sh +0 -186
  296. package/scripts/tuning/macos.sh +0 -56
  297. package/scripts/uninstall.sh +0 -86
  298. package/scripts/verify-release-versions +0 -156
  299. package/scripts/version-sync.sh +0 -714
  300. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  301. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  302. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  303. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  304. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  305. package/templates/projects/go/README.md +0 -7
  306. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  307. package/templates/projects/go/go.mod +0 -3
  308. package/templates/projects/go/go.sum +0 -0
  309. package/templates/projects/molecule/README.md +0 -7
  310. package/templates/projects/molecule/converge.yml +0 -7
  311. package/templates/projects/molecule/molecule.yml +0 -16
  312. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  313. package/templates/projects/node/README.md +0 -7
  314. package/templates/projects/node/package-lock.json +0 -12
  315. package/templates/projects/node/package.json +0 -10
  316. package/templates/projects/node/src/index.js +0 -3
  317. package/templates/projects/packer/README.md +0 -15
  318. package/templates/projects/packer/main.pkr.hcl +0 -15
  319. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  320. package/templates/projects/python/README.md +0 -7
  321. package/templates/projects/python/pyproject.toml +0 -25
  322. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  323. 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.
@@ -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.