@sebastienrousseau/dotfiles 0.2.520 → 0.2.522

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 +52 -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,297 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # shellcheck disable=SC2034
5
- # =============================================================================
6
-
7
- HEAL_TOOLS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- # shellcheck source=../../lib/dot/verified-download.sh disable=SC1091
9
- source "$HEAL_TOOLS_DIR/../../lib/dot/verified-download.sh"
10
- # heal-tools.sh — Tool installation helpers for heal.sh
11
- # Sourced by heal.sh; inherits set -euo pipefail, ui.sh, and shared variables.
12
- # =============================================================================
13
-
14
- # Helper to check command (mise-aware, mirrors doctor.sh)
15
- check_cmd() {
16
- local cmd="$1"
17
- if command -v "$cmd" &>/dev/null; then
18
- return 0
19
- fi
20
- # Fallback: check if installed via mise
21
- if command -v mise &>/dev/null; then
22
- if mise ls --installed 2>/dev/null | grep -qE "($cmd|aqua:.*$cmd)"; then
23
- return 0
24
- fi
25
- fi
26
- return 1
27
- }
28
-
29
- detect_pkg_manager() {
30
- if command -v brew >/dev/null 2>&1; then
31
- echo "brew"
32
- elif command -v apt-get >/dev/null 2>&1; then
33
- echo "apt"
34
- elif command -v dnf >/dev/null 2>&1; then
35
- echo "dnf"
36
- elif command -v pacman >/dev/null 2>&1; then
37
- echo "pacman"
38
- elif command -v zypper >/dev/null 2>&1; then
39
- echo "zypper"
40
- elif command -v apk >/dev/null 2>&1; then
41
- echo "apk"
42
- elif command -v pkg >/dev/null 2>&1; then
43
- echo "pkg"
44
- elif command -v nix-env >/dev/null 2>&1; then
45
- echo "nix"
46
- else
47
- echo ""
48
- fi
49
- }
50
-
51
- install_package() {
52
- local pkg="$1"
53
- local pkg_mgr
54
- pkg_mgr=$(detect_pkg_manager)
55
-
56
- case "$pkg_mgr" in
57
- brew) brew install --quiet "$pkg" >/dev/null 2>&1 ;;
58
- apt)
59
- if ! command -v sudo >/dev/null 2>&1; then
60
- log_error "sudo not found — cannot install '$pkg' via apt"
61
- return 1
62
- fi
63
- sudo apt-get install -y -qq "$pkg" >/dev/null 2>&1
64
- ;;
65
- dnf)
66
- if ! command -v sudo >/dev/null 2>&1; then
67
- log_error "sudo not found — cannot install '$pkg' via dnf"
68
- return 1
69
- fi
70
- sudo dnf install -y -q "$pkg" >/dev/null 2>&1
71
- ;;
72
- pacman)
73
- if ! command -v sudo >/dev/null 2>&1; then
74
- log_error "sudo not found — cannot install '$pkg' via pacman"
75
- return 1
76
- fi
77
- sudo pacman -S --noconfirm --quiet "$pkg" >/dev/null 2>&1
78
- ;;
79
- zypper)
80
- if ! command -v sudo >/dev/null 2>&1; then
81
- log_error "sudo not found — cannot install '$pkg' via zypper"
82
- return 1
83
- fi
84
- sudo zypper --quiet install -y "$pkg" >/dev/null 2>&1
85
- ;;
86
- apk)
87
- if command -v sudo >/dev/null 2>&1; then
88
- sudo apk add --quiet "$pkg" >/dev/null 2>&1
89
- else
90
- apk add --quiet "$pkg" >/dev/null 2>&1
91
- fi
92
- ;;
93
- pkg)
94
- # FreeBSD/OpenBSD/NetBSD — install as root when available.
95
- if command -v sudo >/dev/null 2>&1; then
96
- sudo pkg install -y "$pkg" >/dev/null 2>&1
97
- else
98
- pkg install -y "$pkg" >/dev/null 2>&1
99
- fi
100
- ;;
101
- nix) nix-env -iA "nixpkgs.$pkg" >/dev/null 2>&1 ;;
102
- *)
103
- log_error "No supported package manager found. Install '$pkg' manually."
104
- return 1
105
- ;;
106
- esac
107
- }
108
-
109
- # Map command names to package names per package manager
110
- get_package_name() {
111
- local cmd="$1"
112
-
113
- case "$cmd" in
114
- rg) echo "ripgrep" ;;
115
- bat) echo "bat" ;;
116
- fzf) echo "fzf" ;;
117
- zsh) echo "zsh" ;;
118
- age) echo "age" ;;
119
- *) echo "$cmd" ;;
120
- esac
121
- }
122
-
123
- # =============================================================================
124
- # Animated Package Installer — delegates to ui.sh ui_run_cmd
125
- # =============================================================================
126
-
127
- # Usage: _pkg_install "label" completed total command [args...]
128
- _pkg_install() { ui_run_cmd "$@"; }
129
-
130
- _mise_tool_specs() {
131
- case "$1" in
132
- nushell) printf '%s\n' 'aqua:nushell/nushell@0.114.1' ;;
133
- pueue)
134
- printf '%s\n' 'aqua:Nukesor/pueue/pueue@4.0.4'
135
- printf '%s\n' 'aqua:Nukesor/pueue/pueued@4.0.4'
136
- ;;
137
- wasmtime) printf '%s\n' 'wasmtime@47.0.3' ;;
138
- sops) printf '%s\n' 'sops@3.13.3' ;;
139
- yazi) printf '%s\n' 'yazi@26.5.6' ;;
140
- zellij) printf '%s\n' 'zellij@0.44.3' ;;
141
- *) return 1 ;;
142
- esac
143
- }
144
-
145
- _install_with_mise() {
146
- local cmd="$1" spec
147
- command -v mise >/dev/null 2>&1 || return 1
148
- while IFS= read -r spec; do
149
- [[ -n "$spec" ]] || continue
150
- # --pin writes an exact version to the user's writable global config;
151
- # aqua/ubi backends verify publisher-provided checksums before install.
152
- mise use --global --pin "$spec" || return 1
153
- done < <(_mise_tool_specs "$cmd")
154
- }
155
-
156
- # Install a single package (dispatcher for _pkg_install to call in subshell)
157
- _do_install() {
158
- local cmd="$1"
159
- local pkg_mgr="$2"
160
-
161
- case "$cmd" in
162
- nushell | pueue | wasmtime | sops | yazi | zellij)
163
- if _install_with_mise "$cmd"; then
164
- return 0
165
- fi
166
- log_warn "mise install unavailable for $cmd; trying $pkg_mgr"
167
- ;;
168
- esac
169
-
170
- # Binary/curl installers for tools not in standard apt repos
171
- case "$cmd" in
172
- starship)
173
- local installer
174
- installer=$(umask 077 && mktemp)
175
- if ! download_verified_script https://starship.rs/install.sh "$installer"; then
176
- rm -f "$installer"
177
- log_error "Failed to download starship installer"
178
- return 1
179
- fi
180
- sh "$installer" --yes
181
- local rc=$?
182
- rm -f "$installer"
183
- return $rc
184
- ;;
185
- atuin)
186
- local installer
187
- installer=$(umask 077 && mktemp)
188
- if ! download_verified_script https://setup.atuin.sh "$installer"; then
189
- rm -f "$installer"
190
- log_error "Failed to download atuin installer"
191
- return 1
192
- fi
193
- bash "$installer" --yes
194
- local rc=$?
195
- rm -f "$installer"
196
- return $rc
197
- ;;
198
- esac
199
-
200
- # System package manager
201
- local pkg
202
- pkg=$(get_package_name "$cmd")
203
- install_package "$pkg"
204
- }
205
-
206
- heal_missing_dependencies() {
207
- log_step "Checking dependencies"
208
- # All tools that dot doctor checks — unified list
209
- local deps=(
210
- zsh chezmoi starship rg bat fzf zoxide atuin yazi zellij
211
- nushell pueue wasmtime sops age hyperfine
212
- )
213
- local all_missing=()
214
-
215
- for cmd in "${deps[@]}"; do
216
- local check_name="$cmd"
217
- [[ "$cmd" == "nushell" ]] && check_name="nu"
218
- if check_cmd "$check_name"; then continue; fi
219
- if [[ "$cmd" == "bat" ]] && check_cmd "batcat"; then continue; fi
220
- all_missing+=("$cmd")
221
- ISSUES_FOUND=$((ISSUES_FOUND + 1))
222
- done
223
-
224
- MISSING_DEPS_FOUND=${#all_missing[@]}
225
-
226
- if [[ ${#all_missing[@]} -eq 0 ]]; then
227
- log_success "All dependencies present"
228
- return 0
229
- fi
230
-
231
- local total=${#all_missing[@]}
232
- local completed=0
233
- local installed=0
234
- local pkg_mgr
235
- pkg_mgr=$(detect_pkg_manager)
236
-
237
- echo ""
238
- for cmd in "${all_missing[@]}"; do
239
- if [[ "$DRY_RUN" == "1" ]]; then
240
- log_dry "install '$cmd'"
241
- completed=$((completed + 1))
242
- continue
243
- fi
244
-
245
- if [[ -z "$pkg_mgr" ]]; then
246
- printf ' \033[38;5;196m✗\033[0m %s (no package manager)\n' "$cmd"
247
- completed=$((completed + 1))
248
- continue
249
- fi
250
-
251
- if _pkg_install "$cmd" "$completed" "$total" _do_install "$cmd" "$pkg_mgr"; then
252
- FIXES_APPLIED=$((FIXES_APPLIED + 1))
253
- installed=$((installed + 1))
254
- persist_log "HEAL: installed $cmd"
255
-
256
- # Post-install hooks (run in parent scope)
257
- case "$cmd" in
258
- bat)
259
- if [[ "$pkg_mgr" == "apt" ]] && command -v batcat >/dev/null 2>&1 && ! command -v bat >/dev/null 2>&1; then
260
- mkdir -p "$HOME/.local/bin"
261
- ln -sf "$(command -v batcat)" "$HOME/.local/bin/bat"
262
- fi
263
- ;;
264
- atuin) export PATH="$HOME/.atuin/bin:$PATH" ;;
265
- esac
266
- fi
267
- completed=$((completed + 1))
268
- done
269
-
270
- if [[ "$DRY_RUN" != "1" ]]; then
271
- echo ""
272
- printf ' \033[1;38;5;42mDone!\033[0m Installed %d/%d packages.\n' "$installed" "$total"
273
- fi
274
- }
275
-
276
- heal_mise_tools() {
277
- if ! command -v mise >/dev/null 2>&1; then
278
- return 0
279
- fi
280
-
281
- # Avoid blocking every heal run. Only ensure mise tools when deps are missing
282
- # or when explicitly requested.
283
- if [[ "${DOTFILES_HEAL_MISE_INSTALL:-0}" != "1" ]] && [[ "${MISSING_DEPS_FOUND:-0}" -eq 0 ]]; then
284
- return 0
285
- fi
286
-
287
- if [[ "$DRY_RUN" == "1" ]]; then
288
- log_dry "run 'mise install' to ensure all tools are present"
289
- else
290
- if _pkg_install "mise tools" 0 1 mise install; then
291
- # Start pueue daemon if it was just installed but not running
292
- if command -v pueued >/dev/null && ! pueue status >/dev/null 2>&1; then
293
- pueued -d 2>/dev/null || true
294
- fi
295
- fi
296
- fi
297
- }
@@ -1,223 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # shellcheck disable=SC2034
5
- # =============================================================================
6
- # Dotfiles Heal Script - Auto-repair common dotfiles issues
7
- # Runs diagnostics and attempts automatic fixes
8
- # Usage: ./scripts/ops/heal.sh [OPTIONS]
9
- # =============================================================================
10
-
11
- set -euo pipefail
12
-
13
- _cleanup_files=()
14
- LOCK_DIR=""
15
- cleanup() {
16
- rm -f "${_cleanup_files[@]:-}"
17
- if [[ -n "$LOCK_DIR" ]]; then
18
- rmdir "$LOCK_DIR" 2>/dev/null || true
19
- fi
20
- }
21
- trap cleanup EXIT
22
-
23
- # Configuration
24
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
- # shellcheck source=../../lib/dot/ui.sh
26
- # shellcheck disable=SC1091
27
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
28
- # shellcheck source=../../lib/dot/log.sh
29
- # shellcheck disable=SC1091
30
- source "$SCRIPT_DIR/../../lib/dot/log.sh"
31
- DOT_COMMAND="heal"
32
- REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
33
- DOTFILES_SOURCE="$REPO_ROOT"
34
- BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
35
- STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles"
36
- HEAL_LOG="$STATE_DIR/heal.log"
37
-
38
- # Logging — delegates to shared ui.sh primitives
39
- ui_init
40
- log() { printf '%b\n' "$*"; }
41
- log_info() { ui_info "$@"; }
42
- log_success() { ui_ok "$@"; }
43
- log_warn() { ui_warn "$@"; }
44
- log_error() { ui_err "$@"; }
45
- log_step() {
46
- echo ""
47
- ui_section "$*"
48
- }
49
- log_dry() { ui_warn "DRY-RUN" "Would: $*"; }
50
-
51
- # Persistent logging
52
- persist_log() {
53
- mkdir -p "$STATE_DIR"
54
- echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*" >>"$HEAL_LOG"
55
- }
56
-
57
- # Options
58
- DRY_RUN=0
59
- FORCE=0
60
- FIXES_APPLIED=0
61
- ISSUES_FOUND=0
62
- CHEZMOI_APPLIED=0
63
- MISSING_DEPS_FOUND=0
64
-
65
- usage() {
66
- cat <<EOF
67
- Dotfiles Heal - Auto-repair common issues
68
-
69
- Usage: $(basename "$0") [OPTIONS]
70
-
71
- Options:
72
- -n, --dry-run Preview what would be fixed without making changes
73
- -f, --force Skip confirmation prompts
74
- -h, --help Show this help message
75
-
76
- Environment:
77
- DOTFILES_NONINTERACTIVE=1 Skip all interactive prompts (same as --force)
78
-
79
- Repairs:
80
- - Missing tools (zsh, starship, rg, bat, fzf, zoxide, atuin, yazi, zellij,
81
- nushell, pueue, wasmtime, sops, age, hyperfine)
82
- - Broken symlinks in \$HOME (depth 3)
83
- - Chezmoi drift (re-applies dotfiles)
84
- - Missing critical files (.zshrc, .bashrc, .profile)
85
- - Missing XDG config directories
86
-
87
- EOF
88
- }
89
-
90
- # Parse arguments
91
- while [[ $# -gt 0 ]]; do
92
- case "$1" in
93
- -n | --dry-run)
94
- DRY_RUN=1
95
- shift
96
- ;;
97
- -f | --force)
98
- FORCE=1
99
- shift
100
- ;;
101
- -h | --help)
102
- usage
103
- exit 0
104
- ;;
105
- *)
106
- log_error "Unknown option: $1"
107
- usage
108
- exit 1
109
- ;;
110
- esac
111
- done
112
-
113
- # Prevent concurrent execution
114
- # Prefer XDG runtime dir when it exists and is writable; fallback to /tmp.
115
- LOCK_BASE="/tmp"
116
- if [[ -n "${XDG_RUNTIME_DIR:-}" ]] && [[ -d "${XDG_RUNTIME_DIR}" ]] && [[ -w "${XDG_RUNTIME_DIR}" ]]; then
117
- LOCK_BASE="${XDG_RUNTIME_DIR}"
118
- fi
119
- LOCK_FILE="${LOCK_BASE}/dotfiles-heal.lock"
120
- LOCK_DIR="${LOCK_FILE}.d"
121
- if command -v flock >/dev/null 2>&1; then
122
- exec 9>"$LOCK_FILE"
123
- if ! flock -n 9; then
124
- # Fallback path for systems where flock exists but cannot lock reliably.
125
- if ! mkdir "$LOCK_DIR" 2>/dev/null; then
126
- ui_warn "Already running" "Another instance is active"
127
- exit 0
128
- fi
129
- fi
130
- else
131
- # Portable fallback when flock is unavailable (e.g. default macOS envs).
132
- if ! mkdir "$LOCK_DIR" 2>/dev/null; then
133
- ui_warn "Already running" "Another instance is active"
134
- exit 0
135
- fi
136
- fi
137
-
138
- # =============================================================================
139
- # Load modules (inherit scope: set -euo pipefail, ui.sh, and all variables)
140
- # =============================================================================
141
-
142
- # shellcheck source=heal-tools.sh
143
- # shellcheck disable=SC1091
144
- source "$SCRIPT_DIR/heal-tools.sh"
145
-
146
- # shellcheck source=heal-system.sh
147
- # shellcheck disable=SC1091
148
- source "$SCRIPT_DIR/heal-system.sh"
149
-
150
- # shellcheck source=heal-chezmoi.sh
151
- # shellcheck disable=SC1091
152
- source "$SCRIPT_DIR/heal-chezmoi.sh"
153
-
154
- # =============================================================================
155
- # Main
156
- # =============================================================================
157
-
158
- main() {
159
- echo ""
160
- printf ' \033[1mDotfiles Heal\033[0m\n'
161
- echo ""
162
-
163
- if [[ "$DRY_RUN" == "1" ]]; then
164
- log_info "Dry-run mode (no changes will be made)"
165
- fi
166
-
167
- # Confirm before making changes (unless --force, --dry-run, or non-interactive)
168
- if [[ "$DRY_RUN" != "1" ]] && [[ "$FORCE" != "1" ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
169
- log_warn "This will auto-repair your dotfiles environment."
170
- read -rp " Continue? [y/N] " response
171
- if [[ ! "$response" =~ ^[Yy]$ ]]; then
172
- log_info "Aborted."
173
- exit 0
174
- fi
175
- echo ""
176
- fi
177
-
178
- # Create backup before making changes
179
- if [[ "$DRY_RUN" != "1" ]]; then
180
- _pkg_install "backup" 0 1 create_pre_heal_backup 2>/dev/null || true
181
- fi
182
-
183
- # Run all repairs
184
- heal_missing_dependencies || true
185
- heal_mise_tools || true
186
-
187
- # Quick checks (no animation needed)
188
- heal_chezmoi_drift || true
189
- heal_broken_symlinks || true
190
- heal_missing_critical_files || true
191
- heal_missing_xdg_dirs || true
192
-
193
- # Pre-warm shell caches for fast startup (< 50ms target)
194
- local prewarm_script="$SCRIPT_DIR/prewarm.sh"
195
- if [[ -f "$prewarm_script" ]] && [[ "$DRY_RUN" != "1" ]]; then
196
- log_step "Performance"
197
- _pkg_install "shell cache pre-warm" 0 1 bash "$prewarm_script" || true
198
- fi
199
-
200
- # Summary
201
- echo ""
202
- if [[ "$DRY_RUN" == "1" ]]; then
203
- if [[ $ISSUES_FOUND -eq 0 ]]; then
204
- printf ' \033[1;38;5;42mHealthy.\033[0m No issues found.\n'
205
- else
206
- printf ' Found %d issue(s). Run without --dry-run to apply fixes.\n' "$ISSUES_FOUND"
207
- fi
208
- else
209
- if [[ $ISSUES_FOUND -eq 0 ]]; then
210
- printf ' \033[1;38;5;42mHealthy.\033[0m No issues found.\n'
211
- elif [[ $FIXES_APPLIED -gt 0 ]]; then
212
- printf ' \033[1;38;5;42mDone!\033[0m Applied %d fix(es) for %d issue(s).\n' "$FIXES_APPLIED" "$ISSUES_FOUND"
213
- persist_log "HEAL_COMPLETE: $FIXES_APPLIED fixes applied"
214
- dot_log info "heal_complete" "fixes=$FIXES_APPLIED" "issues=$ISSUES_FOUND"
215
- else
216
- printf ' Found %d issue(s) but no fixes could be applied.\n' "$ISSUES_FOUND"
217
- printf ' Run \033[38;5;211mdot doctor\033[0m for diagnostics.\n'
218
- fi
219
- fi
220
- echo ""
221
- }
222
-
223
- main
@@ -1,107 +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
- # shellcheck source=../../lib/dot/ui.sh
8
- # shellcheck disable=SC1091
9
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
10
-
11
- ZWC_CACHE_DIRS_DEFAULT=("$HOME/.config/shell" "$HOME/.config/zsh")
12
-
13
- repair_zwc_cache() {
14
- local repaired=0
15
- local failed=0
16
- local file
17
- local dirs=()
18
- local raw_dirs="${DOTFILES_ZWC_CACHE_DIRS:-}"
19
-
20
- if [[ -n "$raw_dirs" ]]; then
21
- # shellcheck disable=SC2206
22
- dirs=($raw_dirs)
23
- else
24
- dirs=("${ZWC_CACHE_DIRS_DEFAULT[@]}")
25
- fi
26
-
27
- while IFS= read -r -d '' file; do
28
- if [[ ! -w "$file" ]]; then
29
- if rm -f "$file" >/dev/null 2>&1; then
30
- ((repaired++)) || true
31
- else
32
- ((failed++)) || true
33
- fi
34
- fi
35
- done < <(find "${dirs[@]}" -type f -name '*.zwc' -print0 2>/dev/null || true)
36
-
37
- if ((failed > 0)); then
38
- ui_err "Zsh cache repair" "failed to remove ${failed} stale .zwc file(s)"
39
- return
40
- fi
41
-
42
- if ((repaired > 0)); then
43
- ui_warn "Zsh cache repair" "removed ${repaired} stale read-only .zwc file(s)"
44
- else
45
- ui_ok "Zsh cache repair" "no stale .zwc permissions detected"
46
- fi
47
- }
48
-
49
- resolve_zsh_bin() {
50
- if [[ -n "${DOTFILES_ZSH_BIN:-}" ]]; then
51
- printf "%s\n" "${DOTFILES_ZSH_BIN}"
52
- return
53
- fi
54
- if command -v zsh >/dev/null 2>&1; then
55
- command -v zsh
56
- return
57
- fi
58
- printf "%s\n" ""
59
- }
60
-
61
- validate_dot_cli() {
62
- local dot_bin="${HOME}/.local/bin/dot"
63
- local zsh_out dot_alias dot_path
64
- local zsh_bin
65
-
66
- if [[ ! -x "$dot_bin" ]]; then
67
- ui_err "dot CLI binary" "missing executable at ${dot_bin}"
68
- return
69
- fi
70
- ui_ok "dot CLI binary" "$dot_bin"
71
-
72
- zsh_bin="$(resolve_zsh_bin)"
73
- if [[ -z "$zsh_bin" || ! -x "$zsh_bin" ]]; then
74
- ui_warn "dot CLI resolution" "zsh not available; skipping shell validation"
75
- return
76
- fi
77
-
78
- zsh_out="$("$zsh_bin" -lic '
79
- alias dot 2>/dev/null || true
80
- whence -p dot 2>/dev/null || true
81
- ' 2>/dev/null || true)"
82
- dot_alias="$(printf "%s\n" "$zsh_out" | head -n 1)"
83
- dot_path="$(printf "%s\n" "$zsh_out" | tail -n 1)"
84
-
85
- if [[ "$dot_alias" == *"cd_with_history"* ]]; then
86
- ui_warn "dot alias collision" "legacy sessions may still map dot to navigation; run: unalias dot && exec zsh"
87
- fi
88
-
89
- if [[ "$dot_path" == "$dot_bin" ]]; then
90
- ui_ok "dot CLI resolution" "$dot_path"
91
- elif [[ -n "$dot_path" ]]; then
92
- ui_warn "dot CLI resolution" "resolved to ${dot_path} (expected ${dot_bin})"
93
- else
94
- ui_err "dot CLI resolution" "dot not found in a fresh zsh login shell"
95
- fi
96
- }
97
-
98
- main() {
99
- ui_init
100
- ui_header "Post-apply checks"
101
- repair_zwc_cache
102
- validate_dot_cli
103
- }
104
-
105
- if [[ "${DOTFILES_POST_APPLY_TESTING:-0}" != "1" ]]; then
106
- main
107
- fi