@sebastienrousseau/dotfiles 0.2.518 → 0.2.520

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +1164 -164
  3. package/docs/ARCHITECTURE.md +117 -0
  4. package/docs/COPYRIGHT +1 -1
  5. package/docs/ECOSYSTEM.md +220 -0
  6. package/docs/GOLD-STANDARD-AUDIT.md +352 -0
  7. package/docs/GOVERNANCE.md +1 -1
  8. package/docs/MAINTAINERS.md +1 -1
  9. package/docs/MINIMUM-TOOLCHAIN.md +100 -0
  10. package/docs/README.md +1 -1
  11. package/docs/STRUCTURE.md +1 -1
  12. package/docs/architecture/ARCHITECTURE.md +11 -108
  13. package/docs/architecture/REPO_LAYOUT.md +4 -4
  14. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +121 -0
  15. package/docs/index.md +3 -3
  16. package/docs/manual/00-introduction.md +1 -1
  17. package/docs/manual/03-reference/01-dot-cli.md +28 -3
  18. package/docs/manual/command-index.md +24 -4
  19. package/docs/manual/concept-index.md +2 -0
  20. package/docs/migration/README.md +81 -0
  21. package/docs/migration/from-bare-git-repo.md +156 -0
  22. package/docs/migration/from-gnu-stow.md +165 -0
  23. package/docs/migration/from-plain-chezmoi.md +148 -0
  24. package/docs/migration/from-yadm.md +187 -0
  25. package/docs/operations/PERFORMANCE_BUDGETS.md +196 -0
  26. package/docs/operations/REGISTRY.md +1 -1
  27. package/docs/operations/RELEASE_PIPELINE.md +4 -4
  28. package/docs/operations/TESTING.md +3 -3
  29. package/docs/operations/TRACEABILITY.md +1 -0
  30. package/docs/packaging.md +222 -0
  31. package/docs/reference/FEATURE-MATRIX.md +646 -0
  32. package/docs/reference/TOOLS.md +1 -1
  33. package/docs/reference/UTILS.md +1 -0
  34. package/docs/security/COMPLIANCE.md +1 -1
  35. package/docs/security/DISCLOSURE.md +4 -4
  36. package/docs/security/FUZZING.md +113 -18
  37. package/docs/security/KEY_ROTATION.md +1 -1
  38. package/docs/security/SCORECARD.md +3 -3
  39. package/docs/security/VERIFY_RELEASE.md +2 -2
  40. package/install.sh +6 -6
  41. package/package.json +2 -2
  42. package/scripts/ci/check-copyright-headers.sh +1 -1
  43. package/scripts/ci/check-shell-preamble.sh +1 -1
  44. package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
  45. package/scripts/demo/record.sh +1 -1
  46. package/scripts/diagnostics/a2a-conformance.sh +1 -1
  47. package/scripts/diagnostics/alias-governance.sh +30 -3
  48. package/scripts/diagnostics/aliases-cheatsheet.sh +1 -1
  49. package/scripts/diagnostics/aliases-manifest.sh +1 -1
  50. package/scripts/diagnostics/attest-verify.sh +147 -0
  51. package/scripts/diagnostics/benchmark.sh +1 -1
  52. package/scripts/diagnostics/conflicts.sh +1 -1
  53. package/scripts/diagnostics/doctor-unified.sh +6 -2
  54. package/scripts/diagnostics/doctor.sh +56 -10
  55. package/scripts/diagnostics/drift-dashboard.sh +3 -2
  56. package/scripts/diagnostics/health.sh +43 -10
  57. package/scripts/diagnostics/history-analysis.sh +1 -1
  58. package/scripts/diagnostics/mcp-doctor.sh +2 -2
  59. package/scripts/diagnostics/perf.sh +1 -1
  60. package/scripts/diagnostics/scorecard.sh +3 -2
  61. package/scripts/diagnostics/secret-governance.sh +1 -1
  62. package/scripts/diagnostics/security-score.sh +1 -1
  63. package/scripts/diagnostics/smoke-test.sh +1 -1
  64. package/scripts/diagnostics/snapshot.sh +1 -1
  65. package/scripts/diagnostics/verify.sh +1 -1
  66. package/scripts/diagnostics/verify_state.sh +1 -1
  67. package/scripts/diagnostics/version-locks.sh +1 -1
  68. package/scripts/diagnostics/workstation-attestation.sh +26 -1
  69. package/scripts/dot/commands/agent.sh +64 -14
  70. package/scripts/dot/commands/agents.sh +24 -8
  71. package/scripts/dot/commands/ai.sh +20 -7
  72. package/scripts/dot/commands/aliases.sh +1 -1
  73. package/scripts/dot/commands/appearance.sh +1 -1
  74. package/scripts/dot/commands/completion.sh +42 -5
  75. package/scripts/dot/commands/core.sh +1 -1
  76. package/scripts/dot/commands/diagnostics.sh +1 -1
  77. package/scripts/dot/commands/env-emit.sh +1 -1
  78. package/scripts/dot/commands/fleet.sh +41 -18
  79. package/scripts/dot/commands/init.sh +1 -1
  80. package/scripts/dot/commands/lint.sh +1 -1
  81. package/scripts/dot/commands/manual.sh +1 -1
  82. package/scripts/dot/commands/meta.sh +115 -10
  83. package/scripts/dot/commands/patterns.sh +1 -1
  84. package/scripts/dot/commands/registry.sh +43 -7
  85. package/scripts/dot/commands/restore.sh +1 -1
  86. package/scripts/dot/commands/secrets.sh +1 -1
  87. package/scripts/dot/commands/security.sh +1 -1
  88. package/scripts/dot/commands/tools.sh +21 -7
  89. package/scripts/fonts/install-nerd-fonts.sh +1 -1
  90. package/scripts/fonts/patch-fonts.sh +1 -1
  91. package/scripts/git-hooks/install.sh +1 -1
  92. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  93. package/scripts/lib/secrets_provider.sh +19 -4
  94. package/scripts/nvim/headless-upgrade.lua +81 -0
  95. package/scripts/ops/ai-setup.sh +1 -1
  96. package/scripts/ops/bundle.sh +1 -1
  97. package/scripts/ops/chaos.sh +1 -1
  98. package/scripts/ops/chezmoi-apply.sh +1 -1
  99. package/scripts/ops/chezmoi-diff.sh +1 -1
  100. package/scripts/ops/chezmoi-remove.sh +3 -3
  101. package/scripts/ops/chezmoi-update.sh +6 -2
  102. package/scripts/ops/heal-chezmoi.sh +1 -1
  103. package/scripts/ops/heal-system.sh +1 -1
  104. package/scripts/ops/heal-tools.sh +1 -1
  105. package/scripts/ops/heal.sh +1 -1
  106. package/scripts/ops/post-apply-repair.sh +1 -1
  107. package/scripts/ops/prewarm.sh +1 -1
  108. package/scripts/ops/release.sh +1 -1
  109. package/scripts/ops/rollback.sh +11 -2
  110. package/scripts/ops/setup.sh +1 -1
  111. package/scripts/ops/teleport.sh +1 -1
  112. package/scripts/qa/check-feature-matrix.sh +296 -0
  113. package/scripts/qa/check-version-consistency.sh +7 -119
  114. package/scripts/qa/coverage-baseline.sh +1 -1
  115. package/scripts/qa/docs-coverage.sh +9 -3
  116. package/scripts/qa/examples-coverage.sh +1 -1
  117. package/scripts/qa/reliability-audit.sh +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +1 -1
  119. package/scripts/qa/traceability-coverage.sh +9 -2
  120. package/scripts/qa/validate-examples.sh +66 -3
  121. package/scripts/qa/wsl-contract.sh +1 -1
  122. package/scripts/secrets/age-init.sh +1 -1
  123. package/scripts/secrets/create-secrets-file.sh +1 -1
  124. package/scripts/secrets/encrypt-ssh-key.sh +1 -1
  125. package/scripts/security/backup.sh +1 -1
  126. package/scripts/security/check-disclosure-key-expiry.sh +1 -1
  127. package/scripts/security/dns-doh.sh +1 -1
  128. package/scripts/security/encryption-check.sh +1 -1
  129. package/scripts/security/enforce-policies.sh +315 -98
  130. package/scripts/security/firewall.sh +1 -1
  131. package/scripts/security/lock-configs.sh +1 -1
  132. package/scripts/security/lock-screen.sh +1 -1
  133. package/scripts/security/manage-secrets.sh +1 -1
  134. package/scripts/security/ssh-cert.sh +1 -1
  135. package/scripts/security/telemetry-kill.sh +1 -1
  136. package/scripts/security/usb-safety.sh +1 -1
  137. package/scripts/theme/apply-gnome-theme.sh +1 -1
  138. package/scripts/theme/extract-heic-frames.sh +1 -1
  139. package/scripts/theme/extract-theme.py +284 -6
  140. package/scripts/theme/install-boot-logo.sh +1 -1
  141. package/scripts/theme/install-catppuccin-themes.sh +1 -1
  142. package/scripts/theme/install-cursors.sh +1 -1
  143. package/scripts/theme/install-file-icons.sh +1 -1
  144. package/scripts/theme/install-grub-theme.sh +1 -1
  145. package/scripts/theme/install-lock-icon.sh +1 -1
  146. package/scripts/theme/merge-wallpaper.sh +1 -1
  147. package/scripts/theme/rebuild-themes.sh +64 -5
  148. package/scripts/theme/switch.sh +46 -19
  149. package/scripts/theme/wallpaper-rotate.sh +1 -1
  150. package/scripts/theme/wallpaper-sync.sh +1 -1
  151. package/scripts/tools/cmatrix.sh +1 -1
  152. package/scripts/tools/detect-collisions.py +1 -1
  153. package/scripts/tools/emoji-picker.sh +1 -1
  154. package/scripts/tools/figlet-banner.sh +1 -1
  155. package/scripts/tools/log-rotate.sh +1 -1
  156. package/scripts/tools/lolcat-wrap.sh +1 -1
  157. package/scripts/tools/pipes.sh +1 -1
  158. package/scripts/tuning/linux.sh +1 -1
  159. package/scripts/tuning/macos.sh +1 -1
  160. package/scripts/uninstall.sh +1 -1
  161. package/scripts/verify-release-versions +156 -0
  162. package/scripts/version-sync.sh +63 -3
  163. package/LICENSE +0 -21
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  set -euo pipefail
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  set -euo pipefail
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  set -euo pipefail
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  set -euo pipefail
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  # Linux System Tuning (opt-in)
5
5
  # Managed by chezmoi - https://github.com/sebastienrousseau/dotfiles
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  # macOS tuning (opt-in)
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  # Uninstall dotfiles and clean up all artifacts.
5
5
 
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env bash
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
+ # Copyright (c) 2015-2026 Sebastien Rousseau
4
+ #
5
+ # verify-release-versions — assert every human-visible version surface
6
+ # matches the canonical version in defaults/.chezmoidata.toml.
7
+ #
8
+ # This is the CI-checked "no stale install snippets" gate: install
9
+ # one-liners, badges, the CLI banner, the man page, the agent/MCP
10
+ # discovery cards, llms.txt and the CHANGELOG heading all have to
11
+ # agree with the manifest BEFORE a release ships.
12
+ #
13
+ # Formerly scripts/qa/check-version-consistency.sh; that path remains
14
+ # as a thin wrapper so existing callers keep working.
15
+ #
16
+ # Historical references (CHANGELOG entries, audit-doc closed-cycle
17
+ # tables, roadmap docs that mention previous versions) are NOT
18
+ # checked — they are intentionally pinned to the version they
19
+ # describe.
20
+ #
21
+ # Usage:
22
+ # scripts/verify-release-versions # verify
23
+ # scripts/verify-release-versions --fix # auto-fix
24
+ # scripts/verify-release-versions --quiet # rc-only
25
+ #
26
+ # Exit codes:
27
+ # 0 every live reference matches
28
+ # 1 drift detected (with diff printed unless --quiet)
29
+ # 2 bad usage / missing canonical version
30
+
31
+ set -euo pipefail
32
+
33
+ # Honour a caller-supplied REPO_ROOT, matching scorecard-snapshot.sh,
34
+ # a2a-conformance.sh and the other repo-scoped QA scripts. Lets the
35
+ # checker run against a fixture tree without being copied into it.
36
+ REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
37
+ cd "$REPO_ROOT"
38
+
39
+ # ── Parse flags ─────────────────────────────────────────────────────────
40
+ fix=0
41
+ quiet=0
42
+ for arg in "$@"; do
43
+ case "$arg" in
44
+ --fix) fix=1 ;;
45
+ --quiet | -q) quiet=1 ;;
46
+ -h | --help)
47
+ sed -n '5,29p' "$0" | sed 's/^# \{0,1\}//'
48
+ exit 0
49
+ ;;
50
+ *)
51
+ echo "unknown flag: $arg" >&2
52
+ exit 2
53
+ ;;
54
+ esac
55
+ done
56
+
57
+ _log() { ((quiet)) || printf '%s\n' "$*"; }
58
+ _err() { printf 'verify-release-versions: %s\n' "$*" >&2; }
59
+
60
+ # ── Canonical version ──────────────────────────────────────────────────
61
+ # `|| true`: when the key is absent grep exits 1, and under
62
+ # `set -euo pipefail` that aborted the script right here — rc 1 with no
63
+ # message, indistinguishable from "drift detected", and the documented
64
+ # rc 2 below was unreachable. Let the emptiness check do the reporting.
65
+ canonical="$(grep -E '^dotfiles_version[[:space:]]*=' defaults/.chezmoidata.toml 2>/dev/null |
66
+ head -1 | sed -E 's/.*"([^"]+)".*/\1/' || true)"
67
+
68
+ if [[ -z "$canonical" ]]; then
69
+ _err 'failed to read dotfiles_version from defaults/.chezmoidata.toml'
70
+ exit 2
71
+ fi
72
+ _log "canonical: $canonical (defaults/.chezmoidata.toml)"
73
+
74
+ # ── Per-file expected-substring map ────────────────────────────────────
75
+ # Each entry: PATH|MATCH_PATTERN|EXPECTED_STRING
76
+ # MATCH_PATTERN is a fixed substring to grep for on the file to
77
+ # locate the version-bearing line; we then verify it contains the
78
+ # expected substring rendered with $canonical. version-sync.sh
79
+ # already handles many files (it reads package.json as source);
80
+ # this list captures the surfaces version-sync.sh historically
81
+ # missed — bento.sh banner, man-page header, dispatcher header.
82
+ specs=(
83
+ "package.json|\"version\"|\"version\": \"${canonical}\""
84
+ "bin/dot|^VERSION=|VERSION=\"${canonical}\""
85
+ "bin/dot|^# Dotfiles CLI Entry Point - v|# Dotfiles CLI Entry Point - v${canonical}"
86
+ "share/man/man1/dot.1|^.TH DOT 1|dotfiles v${canonical}"
87
+ "lib/dot/bento.sh|D O T F I L E S|[v${canonical}]"
88
+ "README.md|img.shields.io/badge/Version|Version-v${canonical}-blue"
89
+ "CLAUDE.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
90
+ "AGENTS.md|^Chezmoi-managed dotfiles|Version \`${canonical}\`"
91
+ # Install snippet pinned to a tag — the "no stale install one-liner"
92
+ # rule from the repo standard. `main` snippets are deliberately
93
+ # unpinned and are not checked.
94
+ "README.md|raw.githubusercontent.com/sebastienrousseau/dotfiles/v|/dotfiles/v${canonical}/install.sh"
95
+ "install.sh|local version=\"v|local version=\"v${canonical}\""
96
+ "install.sh|\\(default: v|(default: v${canonical})"
97
+ # Machine-readable discovery surfaces: agents fetch these, so a stale
98
+ # version here misroutes tooling rather than merely reading wrong.
99
+ ".well-known/agent-card.json|\"version\"|\"version\": \"${canonical}\""
100
+ ".well-known/mcp/server-card.json|\"version\"|\"version\": \"${canonical}\""
101
+ # serverInfo.version returned by the MCP `initialize` handshake. A client
102
+ # reads the card and the handshake; they must agree.
103
+ "defaults/dot_local/share/dot-mcp/main.go|^const version =|const version = \"${canonical}\""
104
+ # LLM-facing repo index.
105
+ "llms.txt|Current version:|Current version: v${canonical}."
106
+ # Citation metadata: a stale version here is cited in papers.
107
+ "CITATION.cff|^version:|version: ${canonical}"
108
+ # Keep-a-Changelog: the top heading must be the version being shipped.
109
+ "CHANGELOG.md|^## v|## v${canonical}"
110
+ )
111
+
112
+ drift=0
113
+ for spec in "${specs[@]}"; do
114
+ IFS='|' read -r path pattern expected <<<"$spec"
115
+ if [[ ! -f "$path" ]]; then
116
+ _err "MISSING: $path (declared in spec list)"
117
+ drift=$((drift + 1))
118
+ continue
119
+ fi
120
+ line="$(grep -E "$pattern" "$path" | head -1 || true)"
121
+ if [[ -z "$line" ]]; then
122
+ _err "PATTERN NOT FOUND: '$pattern' in $path"
123
+ drift=$((drift + 1))
124
+ continue
125
+ fi
126
+ if [[ "$line" != *"$expected"* ]]; then
127
+ _err "DRIFT in $path"
128
+ _err " found: $line"
129
+ _err " expected: contains '$expected'"
130
+ drift=$((drift + 1))
131
+ if ((fix)); then
132
+ # Auto-fix: only safe when the file contains a previous v0.X.YYY
133
+ # we can sed-replace. Skip otherwise.
134
+ old="$(printf '%s' "$line" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
135
+ if [[ -n "$old" ]] && [[ "$old" != "v${canonical}" ]]; then
136
+ sed -i.bak "s|${old}|v${canonical}|g" "$path" && rm -f "$path.bak"
137
+ _log " fixed: $path ($old → v${canonical})"
138
+ fi
139
+ fi
140
+ fi
141
+ done
142
+
143
+ if ((drift > 0)); then
144
+ if ((fix)); then
145
+ _log ""
146
+ _log "Auto-fixed where safe. Re-run without --fix to verify."
147
+ else
148
+ _log ""
149
+ _log "Tip: rerun with --fix to auto-correct (only safe substitutions)."
150
+ _log " For non-trivial drift, edit the file manually then re-run."
151
+ fi
152
+ exit 1
153
+ fi
154
+
155
+ _log "all $((${#specs[@]})) live version surfaces match $canonical"
156
+ exit 0
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
2
+ # SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
  # Copyright (c) 2015-2026 Sebastien Rousseau
4
4
  # Version Synchronization Script
5
5
  # Synchronizes version numbers across all markdown files with package.json
@@ -39,12 +39,18 @@ EXCLUDE_FILES=(
39
39
  # carry per-release hash tables / closed-cycle logs. The "current"
40
40
  # version inside these is tracked by hand, not by version-sync.
41
41
  "docs/security/CI_PINNING.md"
42
+ # Same reason: supply-chain/README.md pins the SLSA generator at its
43
+ # required tag (v2.1.0). That is a third-party version, not ours.
44
+ "supply-chain/README.md"
42
45
  "docs/security/INSTALL_VERIFICATION.md"
43
46
  "docs/security/SCORECARD.md"
44
47
 
45
48
  # Release-verification recipes use an example pinned tag
46
49
  # that intentionally stays at a known-published release.
47
50
  "docs/security/VERIFY_RELEASE.md"
51
+ # Same category: pkg/VERIFY.md's "coverage by release" table names
52
+ # the release each attestation first appeared in, which is history.
53
+ "pkg/VERIFY.md"
48
54
 
49
55
  # Example bundles — version refs in README'd examples are illustrative.
50
56
  "examples/mise-plugin-dot/README.md"
@@ -287,7 +293,7 @@ update_version_references() {
287
293
  files_processed=$((files_processed + 1))
288
294
 
289
295
  # Skip milestone and other historical files
290
- if [[ "$(basename "$file")" == MILESTONE_* ]]; then
296
+ if _is_historical_record "$file"; then
291
297
  log_info "Skipping historical file: $file"
292
298
  continue
293
299
  fi
@@ -366,6 +372,22 @@ update_version_references() {
366
372
  echo "$changes_made"
367
373
  }
368
374
 
375
+ # A version reference is only drift if it is meant to track the release. In a
376
+ # historical record it is evidence: GOLD-STANDARD-AUDIT.md records which tag
377
+ # `git tag -v` was run against and what it printed, and MILESTONE_* files
378
+ # describe releases that already happened. Rewriting either to the version
379
+ # being prepared would claim a verification nobody performed against a tag
380
+ # that does not exist yet, which is a worse outcome than a stale-looking
381
+ # string. Both the updater and the verifier consult this, so they cannot
382
+ # disagree about which files are in scope.
383
+ _is_historical_record() {
384
+ case "$(basename "$1")" in
385
+ MILESTONE_*) return 0 ;;
386
+ GOLD-STANDARD-AUDIT.md) return 0 ;;
387
+ *) return 1 ;;
388
+ esac
389
+ }
390
+
369
391
  verify_version_consistency() {
370
392
  local expected_version="$1"
371
393
  local files=("${@:2}")
@@ -380,7 +402,7 @@ verify_version_consistency() {
380
402
  continue
381
403
  fi
382
404
 
383
- if [[ "$(basename "$file")" == MILESTONE_* ]]; then
405
+ if _is_historical_record "$file"; then
384
406
  log_info "Skipping historical file: $file"
385
407
  continue
386
408
  fi
@@ -590,6 +612,11 @@ main() {
590
612
  "install.sh"
591
613
  "lib/dot/bento.sh"
592
614
  "share/man/man1/dot.1"
615
+ # The MCP server reports this string as serverInfo.version in the
616
+ # `initialize` handshake, and it must equal the version in
617
+ # .well-known/mcp/server-card.json — a client compares them.
618
+ # TestVersionMatchesServerCard fails the build if this drifts.
619
+ "defaults/dot_local/share/dot-mcp/main.go"
593
620
  )
594
621
  for script_file in "${script_files[@]}"; do
595
622
  local full_path="$PROJECT_ROOT/$script_file"
@@ -613,6 +640,39 @@ main() {
613
640
  fi
614
641
  done
615
642
 
643
+ # Machine-readable discovery cards. These are JSON with a bare
644
+ # `"version"` key, so the `v$VERSION` substitution above does not
645
+ # reach them — which is exactly why the MCP card sat at 0.2.501
646
+ # while the project shipped 0.2.519. Agents fetch these over the
647
+ # network, so a stale version here misroutes tooling rather than
648
+ # merely reading wrong. Gated by scripts/verify-release-versions.
649
+ local card_files=(
650
+ ".well-known/mcp/server-card.json"
651
+ ".well-known/agent-card.json"
652
+ )
653
+ for card_file in "${card_files[@]}"; do
654
+ local card_path="$PROJECT_ROOT/$card_file"
655
+ [[ -f "$card_path" ]] || continue
656
+ # Deliberately sed, not jq: jq re-serialises the whole document and
657
+ # would reflow the hand-formatted arrays in these cards, producing a
658
+ # large diff for a one-token change. Only the top-level "version"
659
+ # key is rewritten (it is the first such key in both files).
660
+ local card_tmp
661
+ card_tmp=$(umask 077 && mktemp)
662
+ cp "$card_path" "$card_tmp"
663
+ sed_in_place "$card_tmp" \
664
+ "1,6s|\"version\": \"$SED_VERSION_PATTERN\"|\"version\": \"$target_version\"|"
665
+ if ! cmp -s "$card_path" "$card_tmp"; then
666
+ if [[ "$dry_run" == "true" ]]; then
667
+ log_info "Would update: $card_file"
668
+ else
669
+ cat "$card_tmp" >"$card_path"
670
+ log_success "Updated: $card_file"
671
+ fi
672
+ fi
673
+ rm -f "$card_tmp"
674
+ done
675
+
616
676
  # Update version references
617
677
  local changes_made
618
678
  changes_made="$(update_version_references "$target_version" "$dry_run" "${version_files[@]}")"
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2015-2026 Sebastien Rousseau
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.