@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
@@ -1,138 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Interactive setup for dotfiles preferences
5
- # Usage: dot setup
6
-
7
- set -euo pipefail
8
-
9
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../../lib/dot/ui.sh
11
- # shellcheck disable=SC1091
12
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
13
-
14
- ui_init
15
-
16
- CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/chezmoi"
17
- CONFIG_FILE="$CONFIG_DIR/chezmoi.toml"
18
- BACKUP_FILE="$CONFIG_DIR/chezmoi.toml.bak.$(date +%Y%m%d_%H%M%S)"
19
- mkdir -p "$CONFIG_DIR"
20
-
21
- choose() {
22
- local prompt="$1"
23
- shift
24
- if command -v gum >/dev/null 2>&1; then
25
- gum choose --cursor.foreground=212 --selected.foreground=212 --header "$prompt" "$@"
26
- else
27
- echo "$prompt"
28
- select opt in "$@"; do
29
- echo "$opt"
30
- return
31
- done
32
- fi
33
- }
34
-
35
- confirm() {
36
- local prompt="$1"
37
- if command -v gum >/dev/null 2>&1; then
38
- gum confirm "$prompt"
39
- else
40
- read -r -p "$prompt [y/N]: " ans
41
- [[ "$ans" =~ ^[Yy]$ ]]
42
- fi
43
- }
44
-
45
- ui_header "Dotfiles Setup"
46
-
47
- profile=$(choose "Select profile" laptop desktop server minimal)
48
-
49
- feature_zsh=true
50
- feature_nvim=true
51
- feature_tmux=true
52
- feature_gui=true
53
- feature_secrets=true
54
-
55
- confirm "Enable Zsh config?" || feature_zsh=false
56
- confirm "Enable Neovim config?" || feature_nvim=false
57
- confirm "Enable tmux config?" || feature_tmux=false
58
- confirm "Enable GUI extras (fonts/themes)?" || feature_gui=false
59
- confirm "Enable secrets integration?" || feature_secrets=false
60
-
61
- alias_profile=$(choose "Alias profile" standard minimal)
62
- strict_mode=false
63
- confirm "Enable strict alias governance?" && strict_mode=true
64
-
65
- secrets_provider=$(choose "Secrets provider" auto sops onepassword bitwarden)
66
-
67
- theme_choices=(
68
- macos-ai-dark macos-ai-light
69
- macos-bigsur-dark macos-bigsur-light
70
- macos-blue-dark macos-blue-light
71
- macos-blush-dark macos-blush-light
72
- macos-citrus-dark macos-citrus-light
73
- macos-green-dark macos-green-light
74
- macos-gridgreen-dark macos-gridgreen-light
75
- macos-heatmap-dark macos-heatmap-light
76
- macos-indigo-dark macos-indigo-light
77
- macos-miami-dark macos-miami-light
78
- macos-mojave-dark macos-mojave-light
79
- macos-monterey-dark macos-monterey-light
80
- macos-nova-dark macos-nova-light
81
- macos-orange-dark macos-orange-light
82
- macos-pink-dark macos-pink-light
83
- macos-purple-dark macos-purple-light
84
- macos-sequoia-dark macos-sequoia-light
85
- macos-silver-dark macos-silver-light
86
- macos-sonoma-dark macos-sonoma-light
87
- macos-tahoe-dark macos-tahoe-light
88
- macos-valentine-dark macos-valentine-light
89
- macos-ventura-dark macos-ventura-light
90
- macos-wave-dark macos-wave-light
91
- macos-yellow-dark macos-yellow-light
92
- )
93
- theme=$(choose "Theme" "${theme_choices[@]}")
94
-
95
- if [[ -f "$CONFIG_FILE" ]]; then
96
- cp "$CONFIG_FILE" "$BACKUP_FILE"
97
- ui_info "Backup" "$BACKUP_FILE"
98
- fi
99
-
100
- cat >"$CONFIG_FILE" <<TOML
101
- [data]
102
- profile = "$profile"
103
- theme = "$theme"
104
-
105
- [data.features]
106
- zsh = ${feature_zsh}
107
- nvim = ${feature_nvim}
108
- tmux = ${feature_tmux}
109
- gui = ${feature_gui}
110
- secrets = ${feature_secrets}
111
-
112
- [data.aliases]
113
- profile = "$alias_profile"
114
-
115
- [data.aliases.policy]
116
- strict_mode = ${strict_mode}
117
-
118
- [data.aliases.buckets]
119
- system = true
120
- svn = true
121
-
122
- [data.secrets]
123
-
124
- [data.secrets.policy]
125
- provider = "$secrets_provider"
126
- auto_load = true
127
- TOML
128
-
129
- ui_ok "Config" "Updated $CONFIG_FILE"
130
-
131
- if confirm "Apply dotfiles now?"; then
132
- if command -v chezmoi >/dev/null 2>&1; then
133
- chezmoi apply
134
- ui_ok "Apply" "Complete"
135
- else
136
- ui_warn "chezmoi" "Not installed"
137
- fi
138
- fi
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Script: teleport.sh
5
- # Description: Deploys dotfiles to a remote host ephemerally.
6
- # Usage: ./teleport.sh user@hostname
7
-
8
- set -euo pipefail
9
-
10
- TARGET="${1:-}"
11
-
12
- if [[ -z "$TARGET" ]]; then
13
- echo "Usage: dot teleport user@host"
14
- exit 1
15
- fi
16
-
17
- # Validate SSH target: must be user@host format, no shell metacharacters
18
- if [[ ! "$TARGET" =~ ^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+$ ]]; then
19
- echo "Invalid SSH target: $TARGET" >&2
20
- echo "Expected format: user@hostname (alphanumeric, dots, hyphens, underscores only)" >&2
21
- exit 1
22
- fi
23
-
24
- echo " Teleporting dotfiles to ${TARGET}..."
25
-
26
- # 1. Archive the current state
27
- # 2. Pipe to SSH
28
- # 3. Extract in remote home directory with safety flags
29
- # --no-same-owner: don't try to preserve owner (non-root)
30
- # --strip-components=0: don't strip path components
31
- chezmoi archive | ssh "$TARGET" 'tar xz -C "$HOME" --no-same-owner'
32
-
33
- echo " Teleport successful!"
34
- echo " Note: Changes are applied to files, but shell may need restart or sourcing."
@@ -1,296 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- #
5
- # check-feature-matrix.sh — drift gate for docs/reference/FEATURE-MATRIX.md.
6
- #
7
- # The matrix is a contract: every user-facing feature of the `dot` CLI has a
8
- # row naming the regression test, benchmark, example and manual section that
9
- # cover it. A contract nobody checks rots, so this script checks it, and
10
- # ci.yml runs it on every push.
11
- #
12
- # Four checks:
13
- #
14
- # 1. Command coverage — every command the dispatcher can route (bin/dot's
15
- # route table, which is what `scripts/dot/commands/*.sh` are reached
16
- # through) and every command in the generated docs/manual/command-index.md
17
- # has at least one row.
18
- # 2. Test coverage — every regression test function named in a row is
19
- # defined by one of tests/regression/test_feature_matrix_*.sh.
20
- # 3. Benchmark coverage — every benchmark id named in a row is produced by
21
- # `benches/dot_command_bench.sh --list-ids`.
22
- # 4. Example coverage — every example file named in a row exists and is
23
- # executable by scripts/qa/validate-examples.sh.
24
- #
25
- # Usage:
26
- # scripts/qa/check-feature-matrix.sh [--quiet]
27
- #
28
- # Exit codes:
29
- # 0 the matrix is in sync
30
- # 1 drift detected (details on stderr)
31
- # 2 bad invocation, or a file the gate depends on is missing
32
-
33
- set -euo pipefail
34
-
35
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
36
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
37
- cd "$REPO_ROOT"
38
-
39
- MATRIX="docs/reference/FEATURE-MATRIX.md"
40
- DOT_BIN="bin/dot"
41
- COMMAND_INDEX="docs/manual/command-index.md"
42
- BENCH="benches/dot_command_bench.sh"
43
- TEST_GLOB="tests/regression/test_feature_matrix_*.sh"
44
-
45
- QUIET=0
46
- case "${1:-}" in
47
- --quiet | -q) QUIET=1 ;;
48
- -h | --help)
49
- sed -n '5,30p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
50
- exit 0
51
- ;;
52
- "") ;;
53
- *)
54
- printf 'Unknown option: %s\n' "$1" >&2
55
- exit 2
56
- ;;
57
- esac
58
-
59
- say() { [[ "$QUIET" -eq 1 ]] || printf '%s\n' "$*"; }
60
-
61
- for required in "$MATRIX" "$DOT_BIN" "$COMMAND_INDEX" "$BENCH"; do
62
- if [[ ! -f "$required" ]]; then
63
- printf '::error::required file missing: %s\n' "$required" >&2
64
- exit 2
65
- fi
66
- done
67
-
68
- failures=0
69
- fail() {
70
- printf '::error::%s\n' "$1" >&2
71
- failures=$((failures + 1))
72
- }
73
-
74
- work="$(mktemp -d)"
75
- trap 'rm -rf "$work"' EXIT
76
-
77
- # ---------------------------------------------------------------------------
78
- # Parse the matrix.
79
- #
80
- # Rows look like:
81
- # | `dot fleet apply` | --dry-run | `test_fm_x` | `run:y` | `examples/z.sh` | `docs/…` | regression |
82
- #
83
- # Field 1 is the command (backticked, "dot " prefix), 3 the test function,
84
- # 4 the benchmark id, 5 the example path. The two explanatory tables at the
85
- # top of the document have different shapes and are skipped by requiring a
86
- # leading "| `dot ".
87
- # ---------------------------------------------------------------------------
88
-
89
- awk '
90
- # A cell may legitimately contain an escaped pipe (a variant like
91
- # "set advisory\|strict"). Neutralise those BEFORE splitting on "|", or the
92
- # row shifts a column and every later check reads the wrong cell.
93
- /^\| `dot / {
94
- line = $0
95
- gsub(/\\\|/, "\002", line)
96
- n = split(line, cell, "|")
97
- # 7 content columns become 9 fields: the empty strings either side of the
98
- # leading and trailing pipes. The document also carries a 3-column summary
99
- # table of the unmeasurable rows, which must not be parsed as feature rows.
100
- if (n < 9) next
101
- for (i = 1; i <= n; i++) {
102
- gsub(/^[ \t]+|[ \t]+$/, "", cell[i])
103
- gsub(/`/, "", cell[i])
104
- gsub(/\002/, "|", cell[i])
105
- }
106
- # cell[2] command, cell[4] test, cell[5] bench, cell[6] example, cell[8] coverage
107
- print cell[2] "\t" cell[4] "\t" cell[5] "\t" cell[6] "\t" cell[8]
108
- }
109
- ' "$MATRIX" >"$work/rows.tsv"
110
-
111
- row_count="$(wc -l <"$work/rows.tsv" | tr -d ' ')"
112
- if [[ "$row_count" -lt 50 ]]; then
113
- fail "only $row_count rows parsed from $MATRIX — has the table format changed?"
114
- exit 1
115
- fi
116
-
117
- # The command cell is "dot <command>"; a row may name a subcommand
118
- # ("dot fleet apply"), so the routable command is the first word after "dot".
119
- cut -f1 "$work/rows.tsv" | sed 's/^dot *//' | awk '{print $1}' |
120
- sort -u >"$work/matrix-commands.txt"
121
- cut -f2 "$work/rows.tsv" | sort -u | grep -v '^$' >"$work/matrix-tests.txt"
122
- cut -f3 "$work/rows.tsv" | sort -u | grep -v '^$' >"$work/matrix-benches.txt"
123
- cut -f4 "$work/rows.tsv" | sort -u | grep -v '^$' >"$work/matrix-examples.txt"
124
-
125
- say "Feature matrix: $row_count rows, $(wc -l <"$work/matrix-commands.txt" | tr -d ' ') distinct commands"
126
-
127
- # ---------------------------------------------------------------------------
128
- # 1. Command coverage
129
- # ---------------------------------------------------------------------------
130
-
131
- # bin/dot's route table is the authority on what the dispatcher can reach.
132
- # Flag aliases (--help/-h/--version/-v) are not commands and are excluded.
133
- awk '/^_dot_command_routes\(\)/,/^EOF$/' "$DOT_BIN" |
134
- awk -F'|' '/^[a-z][a-z0-9-]*\|[a-z]+$/ { print $1 }' |
135
- sort -u >"$work/routed.txt"
136
-
137
- # The generated command index is the documented surface.
138
- grep -oE '^\| `dot [a-z][a-z0-9-]*' "$COMMAND_INDEX" |
139
- sed 's/^| `dot //' | sort -u >"$work/indexed.txt"
140
-
141
- missing_routed="$(comm -23 "$work/routed.txt" "$work/matrix-commands.txt")"
142
- if [[ -n "$missing_routed" ]]; then
143
- while IFS= read -r cmd; do
144
- [[ -n "$cmd" ]] || continue
145
- fail "routable command has no FEATURE-MATRIX row: dot $cmd"
146
- done <<<"$missing_routed"
147
- else
148
- say " ✓ every routable command has a row ($(wc -l <"$work/routed.txt" | tr -d ' ') commands)"
149
- fi
150
-
151
- missing_indexed="$(comm -23 "$work/indexed.txt" "$work/matrix-commands.txt")"
152
- if [[ -n "$missing_indexed" ]]; then
153
- while IFS= read -r cmd; do
154
- [[ -n "$cmd" ]] || continue
155
- fail "command documented in $COMMAND_INDEX has no FEATURE-MATRIX row: dot $cmd"
156
- done <<<"$missing_indexed"
157
- else
158
- say " ✓ every documented command has a row ($(wc -l <"$work/indexed.txt" | tr -d ' ') commands)"
159
- fi
160
-
161
- # A row naming a command the dispatcher cannot route is a phantom: the
162
- # feature was removed but its coverage claim was not.
163
- phantom="$(comm -13 <(sort -u "$work/routed.txt" "$work/indexed.txt") \
164
- "$work/matrix-commands.txt")"
165
- if [[ -n "$phantom" ]]; then
166
- while IFS= read -r cmd; do
167
- [[ -n "$cmd" ]] || continue
168
- fail "FEATURE-MATRIX row names a command that is neither routable nor documented: dot $cmd"
169
- done <<<"$phantom"
170
- else
171
- say " ✓ no phantom command rows"
172
- fi
173
-
174
- # ---------------------------------------------------------------------------
175
- # 2. Test coverage
176
- # ---------------------------------------------------------------------------
177
-
178
- # `|| true`: this runs at top level under `set -euo pipefail`, so without it an
179
- # unmatched glob (or a grep that simply finds nothing) aborts the whole script
180
- # with grep's status before the emptiness check below can run — exit 2 and not
181
- # a word about why, instead of the diagnostic that check exists to print.
182
- # shellcheck disable=SC2086
183
- grep -ho '^test_fm_[a-z0-9_]*()' $TEST_GLOB 2>/dev/null |
184
- sed 's/()//' | sort -u >"$work/defined-tests.txt" || true
185
-
186
- if [[ ! -s "$work/defined-tests.txt" ]]; then
187
- fail "no test functions found in $TEST_GLOB"
188
- else
189
- undefined="$(comm -23 "$work/matrix-tests.txt" "$work/defined-tests.txt")"
190
- if [[ -n "$undefined" ]]; then
191
- while IFS= read -r fn; do
192
- [[ -n "$fn" ]] || continue
193
- fail "FEATURE-MATRIX names a test function that does not exist: $fn"
194
- done <<<"$undefined"
195
- else
196
- say " ✓ every named test function exists ($(wc -l <"$work/matrix-tests.txt" | tr -d ' ') referenced, $(wc -l <"$work/defined-tests.txt" | tr -d ' ') defined)"
197
- fi
198
-
199
- # A defined-but-unreferenced test is not an error — it may be a helper or a
200
- # cross-cutting invariant — but it is worth surfacing so coverage does not
201
- # quietly drift out of the table.
202
- orphan_count="$(comm -13 "$work/matrix-tests.txt" "$work/defined-tests.txt" | grep -c . || true)"
203
- if [[ "$orphan_count" -gt 0 ]]; then
204
- say " · $orphan_count test function(s) defined but not referenced by any row"
205
- fi
206
- fi
207
-
208
- # Every function the matrix names must also actually be CALLED by its file;
209
- # a defined-but-never-invoked test passes vacuously.
210
- uncalled=0
211
- while IFS= read -r fn; do
212
- [[ -n "$fn" ]] || continue
213
- # shellcheck disable=SC2086
214
- if ! grep -hqE "^[[:space:]]*${fn}([[:space:]]|$)" $TEST_GLOB 2>/dev/null; then
215
- fail "test function is defined but never called: $fn"
216
- uncalled=$((uncalled + 1))
217
- fi
218
- done <"$work/matrix-tests.txt"
219
- [[ "$uncalled" -eq 0 ]] && say " ✓ every named test function is invoked by its file"
220
-
221
- # ---------------------------------------------------------------------------
222
- # 3. Benchmark coverage
223
- # ---------------------------------------------------------------------------
224
-
225
- if bash "$BENCH" --list-ids >"$work/bench-ids.txt" 2>/dev/null &&
226
- [[ -s "$work/bench-ids.txt" ]]; then
227
- sort -u -o "$work/bench-ids.txt" "$work/bench-ids.txt"
228
- unknown_bench="$(comm -23 "$work/matrix-benches.txt" "$work/bench-ids.txt")"
229
- if [[ -n "$unknown_bench" ]]; then
230
- while IFS= read -r id; do
231
- [[ -n "$id" ]] || continue
232
- fail "FEATURE-MATRIX names a benchmark id the harness does not produce: $id"
233
- done <<<"$unknown_bench"
234
- else
235
- say " ✓ every named benchmark id exists ($(wc -l <"$work/matrix-benches.txt" | tr -d ' ') referenced, $(wc -l <"$work/bench-ids.txt" | tr -d ' ') available)"
236
- fi
237
-
238
- # Cold-start coverage must be total: one help benchmark per routable command.
239
- missing_bench=0
240
- while IFS= read -r cmd; do
241
- [[ -n "$cmd" ]] || continue
242
- if ! grep -qx "help:$cmd" "$work/bench-ids.txt"; then
243
- fail "no cold-start benchmark for routable command: dot $cmd"
244
- missing_bench=$((missing_bench + 1))
245
- fi
246
- done <"$work/routed.txt"
247
- [[ "$missing_bench" -eq 0 ]] &&
248
- say " ✓ every routable command has a cold-start benchmark"
249
- else
250
- fail "could not list benchmark ids: $BENCH --list-ids"
251
- fi
252
-
253
- # ---------------------------------------------------------------------------
254
- # 4. Example coverage
255
- # ---------------------------------------------------------------------------
256
-
257
- missing_example=0
258
- while IFS= read -r path; do
259
- [[ -n "$path" ]] || continue
260
- if [[ ! -f "$path" ]]; then
261
- fail "FEATURE-MATRIX names an example that does not exist: $path"
262
- missing_example=$((missing_example + 1))
263
- elif [[ "$path" != examples/*.sh ]]; then
264
- fail "example is outside the directory validate-examples.sh runs: $path"
265
- missing_example=$((missing_example + 1))
266
- fi
267
- done <"$work/matrix-examples.txt"
268
- [[ "$missing_example" -eq 0 ]] &&
269
- say " ✓ every named example exists ($(wc -l <"$work/matrix-examples.txt" | tr -d ' ') referenced)"
270
-
271
- # Every command module should be demonstrated by at least one example.
272
- missing_group=0
273
- for module in scripts/dot/commands/*.sh; do
274
- [[ -f "$module" ]] || continue
275
- name="$(basename "$module" .sh)"
276
- if ! grep -rqlE "scripts/dot/commands/${name}\.sh" examples/ 2>/dev/null; then
277
- fail "no example references the command module: $module"
278
- missing_group=$((missing_group + 1))
279
- fi
280
- done
281
- [[ "$missing_group" -eq 0 ]] &&
282
- say " ✓ every command module is referenced by an example"
283
-
284
- # ---------------------------------------------------------------------------
285
- # Verdict
286
- # ---------------------------------------------------------------------------
287
-
288
- if [[ "$failures" -ne 0 ]]; then
289
- printf '\nFEATURE-MATRIX drift: %s problem(s).\n' "$failures" >&2
290
- printf 'Add or correct the row(s) in %s, then re-run this check.\n' "$MATRIX" >&2
291
- exit 1
292
- fi
293
-
294
- say ""
295
- say "FEATURE-MATRIX is in sync."
296
- exit 0
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- #
5
- # Compatibility wrapper. The canonical name for this gate is
6
- # `scripts/verify-release-versions` (the name the repository standard
7
- # uses); this path is kept so existing callers — the `version-consistency`
8
- # pre-commit hook, older docs, muscle memory — keep working.
9
- #
10
- # Do not add logic here. Edit scripts/verify-release-versions.
11
- set -euo pipefail
12
- exec bash "$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/scripts/verify-release-versions" "$@"
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
-
9
- include_module_coverage=0
10
-
11
- usage() {
12
- cat <<'EOF'
13
- Coverage Baseline
14
-
15
- Usage:
16
- coverage-baseline.sh [--with-module-coverage]
17
-
18
- Options:
19
- --with-module-coverage Run tests/framework/module_coverage.sh and include the result
20
- -h, --help Show this help
21
- EOF
22
- }
23
-
24
- while [ "$#" -gt 0 ]; do
25
- case "$1" in
26
- --with-module-coverage)
27
- include_module_coverage=1
28
- ;;
29
- -h | --help)
30
- usage
31
- exit 0
32
- ;;
33
- *)
34
- printf 'Unknown option: %s\n' "$1" >&2
35
- usage >&2
36
- exit 1
37
- ;;
38
- esac
39
- shift
40
- done
41
-
42
- unit_tests="$(find "$REPO_ROOT/tests/unit" -name 'test_*.sh' | wc -l | tr -d ' ')"
43
- integration_tests="$(find "$REPO_ROOT/tests/integration" -name 'test_*.sh' | wc -l | tr -d ' ')"
44
- total_tests="$(find "$REPO_ROOT/tests" -path '*/framework/*' -prune -o -name 'test_*.sh' -print | wc -l | tr -d ' ')"
45
- named_tests="$(rg -o '\btest_start\b' "$REPO_ROOT/tests/unit" "$REPO_ROOT/tests/integration" -g 'test_*.sh' | wc -l | tr -d ' ')"
46
- docs_files="$(find "$REPO_ROOT/docs" -type f \( -name '*.md' -o -name '*.md.tmpl' \) | wc -l | tr -d ' ')"
47
- shell_surfaces="$(find "$REPO_ROOT/scripts" "$REPO_ROOT/defaults/dot_local/bin" "$REPO_ROOT/defaults/.chezmoitemplates/functions" -type f \( -name '*.sh' -o -name 'executable_*' \) | wc -l | tr -d ' ')"
48
-
49
- printf 'Coverage Baseline\n'
50
- printf 'Repository: %s\n' "$REPO_ROOT"
51
- printf 'Documentation files: %s\n' "$docs_files"
52
- printf 'Executable shell surfaces: %s\n' "$shell_surfaces"
53
- printf 'Unit test files: %s\n' "$unit_tests"
54
- printf 'Integration test files: %s\n' "$integration_tests"
55
- printf 'Total test files: %s\n' "$total_tests"
56
- printf 'Named tests: %s\n' "$named_tests"
57
-
58
- if [ "$include_module_coverage" -eq 1 ]; then
59
- printf '\n'
60
- (cd "$REPO_ROOT" && bash ./tests/framework/module_coverage.sh)
61
- fi
@@ -1,118 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
-
9
- DOT_CLI="$REPO_ROOT/bin/dot"
10
- UTILS_DOC="$REPO_ROOT/docs/reference/UTILS.md"
11
- AI_DOC="$REPO_ROOT/docs/AI.md"
12
- SCRIPTS_DOC="$REPO_ROOT/docs/reference/SCRIPTS.md"
13
- ARCH_DOC="$REPO_ROOT/docs/ARCHITECTURE.md"
14
- FUNCTION_GROUPS_JSON="$REPO_ROOT/defaults/.chezmoitemplates/functions/groups.json"
15
- MIN_DOCS_COVERAGE="${MIN_DOCS_COVERAGE:-100}"
16
-
17
- TOTAL_CHECKS=0
18
- COVERED_CHECKS=0
19
-
20
- record_doc_check() {
21
- local label="$1"
22
- local needle="$2"
23
- local file="$3"
24
-
25
- TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
26
- if grep -Fq "$needle" "$file"; then
27
- COVERED_CHECKS=$((COVERED_CHECKS + 1))
28
- else
29
- printf 'Missing documentation: %s\n' "$label" >&2
30
- fi
31
- }
32
-
33
- extract_public_commands() {
34
- awk '
35
- /_dot_help_specs\(\)/ { in_func=1; next }
36
- in_func && /cat <<'\''EOF'\''/ { in_block=1; next }
37
- in_block && /^EOF$/ { exit }
38
- in_block && /\|/ {
39
- split($0, parts, /\|/)
40
- print parts[2]
41
- }
42
- ' "$DOT_CLI"
43
- }
44
-
45
- check_dot_command_docs() {
46
- local command=""
47
-
48
- while IFS= read -r command; do
49
- [ -n "$command" ] || continue
50
- record_doc_check "dot $command in UTILS.md" "\`dot $command" "$UTILS_DOC"
51
- done < <(extract_public_commands)
52
- }
53
-
54
- check_ai_provider_docs() {
55
- local provider=""
56
-
57
- for provider in cl copilot kimi agy kiro sgpt ollama opencode aider; do
58
- record_doc_check "dot $provider in AI.md" "\`dot $provider\`" "$AI_DOC"
59
- done
60
- }
61
-
62
- check_utility_docs() {
63
- local utility=""
64
-
65
- for utility in \
66
- ai-update ai_core antigravity b64 bm cb dot dot-ai dot-bootstrap dot-launch-or-focus \
67
- dot-load-benchmark dot-load-benchmark-pty dot-theme-sync dtags epoch extract gbd gd \
68
- git-ai-commit git-ai-diff gl hash hashsum hex jsonv jwt kill-port lorem monitor myip \
69
- notify open pw rec-start rec-stop regex start-niri tmux-sessionizer tour up update uuid \
70
- win yamlv; do
71
- record_doc_check "$utility in SCRIPTS.md" "\`$utility\`" "$SCRIPTS_DOC"
72
- done
73
- }
74
-
75
- check_function_group_docs() {
76
- local group=""
77
-
78
- for group in $(
79
- FUNCTION_GROUPS_JSON="$FUNCTION_GROUPS_JSON" python3 - <<'PY'
80
- import json
81
- import os
82
- from pathlib import Path
83
- path = Path(os.environ["FUNCTION_GROUPS_JSON"])
84
- for key in json.loads(path.read_text()).keys():
85
- print(key)
86
- PY
87
- ); do
88
- record_doc_check "function group $group in ARCHITECTURE.md" "\`$group\`" "$ARCH_DOC"
89
- done
90
- }
91
-
92
- report_coverage() {
93
- local pct
94
- pct="$(awk -v c="$COVERED_CHECKS" -v t="$TOTAL_CHECKS" 'BEGIN{if(t==0){print "0.00"}else{printf "%.2f", (100*c/t)}}')"
95
-
96
- printf 'Docs coverage: %s/%s (%s%%)\n' "$COVERED_CHECKS" "$TOTAL_CHECKS" "$pct"
97
- printf 'Threshold: %s%%\n' "$MIN_DOCS_COVERAGE"
98
-
99
- awk -v p="$pct" -v min="$MIN_DOCS_COVERAGE" 'BEGIN{exit !(p+0 >= min+0)}'
100
- }
101
-
102
- main() {
103
- check_dot_command_docs
104
- check_ai_provider_docs
105
- check_utility_docs
106
- check_function_group_docs
107
- # Capture the coverage threshold verdict — without this the final
108
- # `printf PASS...` overwrites report_coverage's exit code and CI
109
- # never sees a coverage regression.
110
- if ! report_coverage; then
111
- printf 'FAIL: docs coverage below MIN_DOCS_COVERAGE=%s%%\n' "$MIN_DOCS_COVERAGE" >&2
112
- return 1
113
- fi
114
-
115
- printf 'PASS: public dot commands, utility entrypoints, AI providers, and function groups are documented at or above the required threshold\n'
116
- }
117
-
118
- main "$@"