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