@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.
- package/CHANGELOG.md +52 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +43 -37
- package/install.sh +76 -10
- package/package.json +7 -7
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/ECOSYSTEM.md +0 -220
- package/docs/GOLD-STANDARD-AUDIT.md +0 -352
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/MINIMUM-TOOLCHAIN.md +0 -100
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -20
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -475
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -175
- package/docs/manual/concept-index.md +0 -170
- package/docs/manual/index.md +0 -66
- package/docs/migration/README.md +0 -81
- package/docs/migration/from-bare-git-repo.md +0 -156
- package/docs/migration/from-gnu-stow.md +0 -165
- package/docs/migration/from-plain-chezmoi.md +0 -148
- package/docs/migration/from-yadm.md +0 -187
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -44
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/packaging.md +0 -222
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURE-MATRIX.md +0 -646
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -243
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -209
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -165
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/attest-verify.sh +0 -147
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -43
- package/scripts/diagnostics/doctor.sh +0 -797
- package/scripts/diagnostics/drift-dashboard.sh +0 -203
- package/scripts/diagnostics/health.sh +0 -656
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -120
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -212
- package/scripts/dot/commands/agent.sh +0 -535
- package/scripts/dot/commands/agents.sh +0 -352
- package/scripts/dot/commands/ai.sh +0 -600
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -171
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -711
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -438
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -455
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -570
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -200
- package/scripts/nvim/headless-upgrade.lua +0 -81
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -67
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -613
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-feature-matrix.sh +0 -296
- package/scripts/qa/check-version-consistency.sh +0 -12
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -118
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -124
- package/scripts/qa/validate-examples.sh +0 -90
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -552
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -1020
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -603
- package/scripts/theme/switch.sh +0 -476
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/verify-release-versions +0 -156
- package/scripts/version-sync.sh +0 -714
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- 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
|
-
}
|
package/scripts/ops/heal.sh
DELETED
|
@@ -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
|