@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,105 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# pre-push hook
|
|
5
|
-
#
|
|
6
|
-
# 1. Refuses to push any commit that is not GPG/SSH-signed.
|
|
7
|
-
# 2. Runs `scripts/qa/reliability-audit.sh --quick`. The audit is mandatory
|
|
8
|
-
# by default; explicit per-push bypass requires `DOTFILES_ALLOW_UNSKIPPED_PUSH=1`,
|
|
9
|
-
# and every bypass is logged to `~/.local/share/dotfiles/audit-bypass.log`.
|
|
10
|
-
#
|
|
11
|
-
# The legacy `DOTFILES_SKIP_PRE_PUSH_AUDIT=1` env var (opt-out) is rejected
|
|
12
|
-
# with a migration message. The new variable is intentionally awkwardly
|
|
13
|
-
# named so that setting it requires deliberate intent. See
|
|
14
|
-
# `docs/security/AUDIT_BYPASS.md`.
|
|
15
|
-
# =============================================================================
|
|
16
|
-
|
|
17
|
-
set -euo pipefail
|
|
18
|
-
|
|
19
|
-
repo_root="$(git rev-parse --show-toplevel)"
|
|
20
|
-
|
|
21
|
-
# -----------------------------------------------------------------------------
|
|
22
|
-
# Step 1 — signed-commit enforcement (unchanged)
|
|
23
|
-
# -----------------------------------------------------------------------------
|
|
24
|
-
while read -r local_ref local_sha remote_ref remote_sha; do
|
|
25
|
-
[ "$local_sha" = "0000000000000000000000000000000000000000" ] && continue
|
|
26
|
-
|
|
27
|
-
if [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
|
|
28
|
-
range="$local_sha"
|
|
29
|
-
elif git cat-file -e "${remote_sha}^{commit}" 2>/dev/null; then
|
|
30
|
-
range="$remote_sha..$local_sha"
|
|
31
|
-
else
|
|
32
|
-
# Remote tip is not in the local object store yet (push without prior fetch).
|
|
33
|
-
# Fall back to checking commits reachable from local tip.
|
|
34
|
-
range="$local_sha"
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
for c in $(git rev-list "$range"); do
|
|
38
|
-
if ! git verify-commit "$c" >/dev/null 2>&1; then
|
|
39
|
-
echo "Blocked: unsigned commit $c" >&2
|
|
40
|
-
exit 1
|
|
41
|
-
fi
|
|
42
|
-
done
|
|
43
|
-
done
|
|
44
|
-
|
|
45
|
-
# -----------------------------------------------------------------------------
|
|
46
|
-
# Step 2 — reject the legacy opt-out variable
|
|
47
|
-
# -----------------------------------------------------------------------------
|
|
48
|
-
if [ "${DOTFILES_SKIP_PRE_PUSH_AUDIT:-}" = "1" ]; then
|
|
49
|
-
cat >&2 <<'EOF'
|
|
50
|
-
ERROR: DOTFILES_SKIP_PRE_PUSH_AUDIT is no longer honored.
|
|
51
|
-
|
|
52
|
-
The pre-push audit was previously opt-out — setting one env var was enough
|
|
53
|
-
to skip it. That made bypass invisible and routine. Effective with #871,
|
|
54
|
-
the policy is fail-closed: the audit always runs unless you explicitly
|
|
55
|
-
authorize a bypass for this single push.
|
|
56
|
-
|
|
57
|
-
To bypass for one push:
|
|
58
|
-
DOTFILES_ALLOW_UNSKIPPED_PUSH=1 git push
|
|
59
|
-
|
|
60
|
-
Every bypass is recorded to ~/.local/share/dotfiles/audit-bypass.log
|
|
61
|
-
and surfaced by `dot doctor` if any are recent.
|
|
62
|
-
|
|
63
|
-
See: docs/security/AUDIT_BYPASS.md
|
|
64
|
-
EOF
|
|
65
|
-
exit 1
|
|
66
|
-
fi
|
|
67
|
-
|
|
68
|
-
# -----------------------------------------------------------------------------
|
|
69
|
-
# Step 3 — run the audit (or log + skip if explicitly bypassed)
|
|
70
|
-
# -----------------------------------------------------------------------------
|
|
71
|
-
if [ "${DOTFILES_ALLOW_UNSKIPPED_PUSH:-}" = "1" ]; then
|
|
72
|
-
bypass_log_dir="${XDG_STATE_HOME:-$HOME/.local/state}/dotfiles"
|
|
73
|
-
# The audit-bypass log lives under XDG_STATE_HOME (user state — never
|
|
74
|
-
# checked in, never deployed by chezmoi to other locations).
|
|
75
|
-
mkdir -p "$bypass_log_dir"
|
|
76
|
-
bypass_log="$bypass_log_dir/audit-bypass.log"
|
|
77
|
-
|
|
78
|
-
ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
79
|
-
branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)"
|
|
80
|
-
remote="$(git remote get-url --push @{upstream} 2>/dev/null ||
|
|
81
|
-
git config --get remote.origin.url 2>/dev/null ||
|
|
82
|
-
echo unknown)"
|
|
83
|
-
reason="${DOTFILES_BYPASS_REASON:-no reason given}"
|
|
84
|
-
|
|
85
|
-
printf '%s\tbranch=%s\tremote=%s\treason=%s\n' \
|
|
86
|
-
"$ts" "$branch" "$remote" "$reason" >>"$bypass_log"
|
|
87
|
-
|
|
88
|
-
echo "WARN: pre-push audit bypassed (logged to $bypass_log)" >&2
|
|
89
|
-
exit 0
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
bash "$repo_root/scripts/qa/reliability-audit.sh" --quick
|
|
93
|
-
|
|
94
|
-
# Step 4 — version-string consistency. Catches the case where the
|
|
95
|
-
# canonical version in .chezmoidata.toml advanced but a human-visible
|
|
96
|
-
# surface (CLI banner, man page, README badge) wasn't bumped. The
|
|
97
|
-
# script is cheap (~8 grep calls); failure tells the user exactly
|
|
98
|
-
# which file drifted and offers --fix.
|
|
99
|
-
bash "$repo_root/scripts/qa/check-version-consistency.sh" --quiet || {
|
|
100
|
-
echo "" >&2
|
|
101
|
-
echo "Pre-push blocked: version-string drift detected." >&2
|
|
102
|
-
echo "Run: scripts/qa/check-version-consistency.sh" >&2
|
|
103
|
-
echo "Then: scripts/qa/check-version-consistency.sh --fix (optional auto-fix)" >&2
|
|
104
|
-
exit 1
|
|
105
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
-
# Appends the EUXIS branding signature to every commit message.
|
|
4
|
-
# Signature source: ~/.euxis/data/config/branding/signature.txt
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# R5: validate commit message file argument
|
|
9
|
-
if [[ -z "${1:-}" || ! -f "${1:-}" ]]; then
|
|
10
|
-
exit 0 # No file provided — git will handle the error
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
COMMIT_MSG_FILE="$1"
|
|
14
|
-
COMMIT_SOURCE="${2:-}"
|
|
15
|
-
|
|
16
|
-
# Skip merge commits, amends with existing signature, and squash
|
|
17
|
-
case "$COMMIT_SOURCE" in
|
|
18
|
-
merge | squash) exit 0 ;;
|
|
19
|
-
esac
|
|
20
|
-
|
|
21
|
-
SIGNATURE_FILE="$HOME/.euxis/data/config/branding/signature.txt"
|
|
22
|
-
|
|
23
|
-
# Only append if the signature file exists and message doesn't already have it
|
|
24
|
-
if [[ -f "$SIGNATURE_FILE" ]]; then
|
|
25
|
-
signature=$(cat "$SIGNATURE_FILE")
|
|
26
|
-
if ! grep -qF "THE ARCHITECT" "$COMMIT_MSG_FILE" 2>/dev/null; then
|
|
27
|
-
printf '\n%s\n' "$signature" >>"$COMMIT_MSG_FILE"
|
|
28
|
-
fi
|
|
29
|
-
fi
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Provider-agnostic secrets bridge for dotfiles.
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
DOT_SECRETS_HOME="${DOT_SECRETS_HOME:-$HOME/.config/dotfiles/secrets}"
|
|
9
|
-
DOT_SECRETS_STORE_DIR="${DOT_SECRETS_STORE_DIR:-$DOT_SECRETS_HOME/store}"
|
|
10
|
-
DOT_SECRETS_INDEX_FILE="${DOT_SECRETS_INDEX_FILE:-$DOT_SECRETS_HOME/index.txt}"
|
|
11
|
-
DOT_SECRETS_AGE_KEY="${DOT_SECRETS_AGE_KEY:-$HOME/.config/chezmoi/key.txt}"
|
|
12
|
-
DOT_SECRETS_SERVICE_PREFIX="${DOT_SECRETS_SERVICE_PREFIX:-dotfiles.secret}"
|
|
13
|
-
|
|
14
|
-
dot_secrets_ensure_layout() {
|
|
15
|
-
mkdir -p "$DOT_SECRETS_STORE_DIR"
|
|
16
|
-
touch "$DOT_SECRETS_INDEX_FILE"
|
|
17
|
-
chmod 700 "$DOT_SECRETS_HOME" 2>/dev/null || true
|
|
18
|
-
chmod 700 "$DOT_SECRETS_STORE_DIR" 2>/dev/null || true
|
|
19
|
-
chmod 600 "$DOT_SECRETS_INDEX_FILE" 2>/dev/null || true
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
dot_secrets_provider() {
|
|
23
|
-
local provider="${DOTFILES_SECRETS_PROVIDER:-auto}"
|
|
24
|
-
if [[ "$provider" != "auto" ]]; then
|
|
25
|
-
printf "%s\n" "$provider"
|
|
26
|
-
return 0
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
if [[ "${OSTYPE:-}" == darwin* ]] && command -v security >/dev/null 2>&1; then
|
|
30
|
-
printf "macos-keychain\n"
|
|
31
|
-
return 0
|
|
32
|
-
fi
|
|
33
|
-
if command -v pass >/dev/null 2>&1; then
|
|
34
|
-
printf "pass\n"
|
|
35
|
-
return 0
|
|
36
|
-
fi
|
|
37
|
-
if command -v age >/dev/null 2>&1 && [[ -f "$DOT_SECRETS_AGE_KEY" ]]; then
|
|
38
|
-
printf "plain-enc\n"
|
|
39
|
-
return 0
|
|
40
|
-
fi
|
|
41
|
-
printf "none\n"
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
dot_secrets_index_add() {
|
|
45
|
-
local key="${1:-}"
|
|
46
|
-
[[ -n "$key" ]] || return 1
|
|
47
|
-
dot_secrets_ensure_layout
|
|
48
|
-
if ! grep -qxF "$key" "$DOT_SECRETS_INDEX_FILE" 2>/dev/null; then
|
|
49
|
-
printf "%s\n" "$key" >>"$DOT_SECRETS_INDEX_FILE"
|
|
50
|
-
fi
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
dot_secrets_index_list() {
|
|
54
|
-
dot_secrets_ensure_layout
|
|
55
|
-
awk 'NF > 0' "$DOT_SECRETS_INDEX_FILE" | sort -u
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
dot_secrets_store_macos() {
|
|
59
|
-
local key="$1"
|
|
60
|
-
local value="$2"
|
|
61
|
-
local service="${DOT_SECRETS_SERVICE_PREFIX}.${key}"
|
|
62
|
-
security add-generic-password -U -a "${USER:-dotfiles}" -s "$service" -w "$value" >/dev/null
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
dot_secrets_get_macos() {
|
|
66
|
-
local key="$1"
|
|
67
|
-
local service="${DOT_SECRETS_SERVICE_PREFIX}.${key}"
|
|
68
|
-
security find-generic-password -a "${USER:-dotfiles}" -s "$service" -w 2>/dev/null || return 1
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
dot_secrets_store_pass() {
|
|
72
|
-
local key="$1" value="$2"
|
|
73
|
-
printf "%s\n" "$value" | pass insert -m -f "dotfiles/${key}" >/dev/null
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
dot_secrets_get_pass() {
|
|
77
|
-
local key="$1"
|
|
78
|
-
pass show "dotfiles/${key}" 2>/dev/null | head -n1
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
dot_secrets_store_plain_enc() {
|
|
82
|
-
local key="$1" value="$2"
|
|
83
|
-
local tmp_rec file
|
|
84
|
-
[[ -f "$DOT_SECRETS_AGE_KEY" ]] || {
|
|
85
|
-
echo "age key not found: $DOT_SECRETS_AGE_KEY" >&2
|
|
86
|
-
return 1
|
|
87
|
-
}
|
|
88
|
-
command -v age >/dev/null 2>&1 || {
|
|
89
|
-
echo "age not installed" >&2
|
|
90
|
-
return 1
|
|
91
|
-
}
|
|
92
|
-
command -v age-keygen >/dev/null 2>&1 || {
|
|
93
|
-
echo "age-keygen not installed" >&2
|
|
94
|
-
return 1
|
|
95
|
-
}
|
|
96
|
-
dot_secrets_ensure_layout
|
|
97
|
-
tmp_rec="$(umask 077 && mktemp)"
|
|
98
|
-
file="$DOT_SECRETS_STORE_DIR/${key}.age"
|
|
99
|
-
|
|
100
|
-
# No RETURN trap here. A RETURN trap set inside a function also fires when
|
|
101
|
-
# its CALLER returns, and by then `tmp_rec` — local to this function — is
|
|
102
|
-
# out of scope: under `set -u` the trap aborted dot_secrets_set with
|
|
103
|
-
# "tmp_rec: unbound variable" AFTER the encrypted file had been written, so
|
|
104
|
-
# `dot secrets set` reported failure on a write that had succeeded. Clean up
|
|
105
|
-
# explicitly on both paths instead.
|
|
106
|
-
if ! age-keygen -y "$DOT_SECRETS_AGE_KEY" >"$tmp_rec"; then
|
|
107
|
-
rm -f "$tmp_rec"
|
|
108
|
-
echo "failed to derive the age recipient from $DOT_SECRETS_AGE_KEY" >&2
|
|
109
|
-
return 1
|
|
110
|
-
fi
|
|
111
|
-
if ! printf "%s" "$value" | age -R "$tmp_rec" -o "$file"; then
|
|
112
|
-
rm -f "$tmp_rec"
|
|
113
|
-
echo "failed to encrypt secret: $key" >&2
|
|
114
|
-
return 1
|
|
115
|
-
fi
|
|
116
|
-
rm -f "$tmp_rec"
|
|
117
|
-
chmod 600 "$file" 2>/dev/null || true
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
dot_secrets_get_plain_enc() {
|
|
121
|
-
local key="$1"
|
|
122
|
-
local file="$DOT_SECRETS_STORE_DIR/${key}.age"
|
|
123
|
-
[[ -f "$DOT_SECRETS_AGE_KEY" ]] || return 1
|
|
124
|
-
[[ -f "$file" ]] || return 1
|
|
125
|
-
age -d -i "$DOT_SECRETS_AGE_KEY" "$file" 2>/dev/null || return 1
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
dot_secrets_set() {
|
|
129
|
-
local key="${1:-}" value="${2:-}" provider
|
|
130
|
-
[[ -n "$key" ]] || return 1
|
|
131
|
-
provider="$(dot_secrets_provider)"
|
|
132
|
-
case "$provider" in
|
|
133
|
-
macos-keychain) dot_secrets_store_macos "$key" "$value" ;;
|
|
134
|
-
pass) dot_secrets_store_pass "$key" "$value" ;;
|
|
135
|
-
plain-enc) dot_secrets_store_plain_enc "$key" "$value" ;;
|
|
136
|
-
*)
|
|
137
|
-
echo "No supported secrets provider detected." >&2
|
|
138
|
-
return 1
|
|
139
|
-
;;
|
|
140
|
-
esac
|
|
141
|
-
dot_secrets_index_add "$key"
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
dot_secrets_get() {
|
|
145
|
-
local key="${1:-}" provider value rc=0
|
|
146
|
-
[[ -n "$key" ]] || {
|
|
147
|
-
printf 'dot_secrets_get: empty key\n' >&2
|
|
148
|
-
return 1
|
|
149
|
-
}
|
|
150
|
-
provider="$(dot_secrets_provider)"
|
|
151
|
-
case "$provider" in
|
|
152
|
-
macos-keychain) value="$(dot_secrets_get_macos "$key")" || rc=$? ;;
|
|
153
|
-
pass) value="$(dot_secrets_get_pass "$key")" || rc=$? ;;
|
|
154
|
-
plain-enc) value="$(dot_secrets_get_plain_enc "$key")" || rc=$? ;;
|
|
155
|
-
none)
|
|
156
|
-
# No usable provider on this host — silent miss is wrong;
|
|
157
|
-
# callers need to know whether to fall back.
|
|
158
|
-
printf 'dot_secrets_get: no provider configured for key=%s\n' "$key" >&2
|
|
159
|
-
return 2
|
|
160
|
-
;;
|
|
161
|
-
*)
|
|
162
|
-
printf 'dot_secrets_get: unknown provider %q\n' "$provider" >&2
|
|
163
|
-
return 1
|
|
164
|
-
;;
|
|
165
|
-
esac
|
|
166
|
-
if [[ "$rc" -ne 0 ]]; then
|
|
167
|
-
printf 'dot_secrets_get: provider %q failed (rc=%d) for key=%s\n' \
|
|
168
|
-
"$provider" "$rc" "$key" >&2
|
|
169
|
-
return "$rc"
|
|
170
|
-
fi
|
|
171
|
-
if [[ -z "$value" ]]; then
|
|
172
|
-
# An empty return from a successful provider call usually means
|
|
173
|
-
# "key not found" — distinguish from "provider crashed" so the
|
|
174
|
-
# caller's fallback can be different.
|
|
175
|
-
printf 'dot_secrets_get: provider %q returned empty for key=%s (not found?)\n' \
|
|
176
|
-
"$provider" "$key" >&2
|
|
177
|
-
return 3
|
|
178
|
-
fi
|
|
179
|
-
printf '%s' "$value"
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
dot_secrets_bucket_keys() {
|
|
183
|
-
local data_file="${1:-}" bucket="${2:-}"
|
|
184
|
-
[[ -f "$data_file" ]] || return 1
|
|
185
|
-
[[ -n "$bucket" ]] || return 1
|
|
186
|
-
awk -v b="$bucket" '
|
|
187
|
-
$0 ~ "^[[:space:]]*" b "[[:space:]]*=" {
|
|
188
|
-
line=$0
|
|
189
|
-
gsub(/^.*\[/, "", line)
|
|
190
|
-
gsub(/\].*$/, "", line)
|
|
191
|
-
gsub(/"/, "", line)
|
|
192
|
-
n=split(line, arr, ",")
|
|
193
|
-
for (i=1; i<=n; i++) {
|
|
194
|
-
gsub(/^[[:space:]]+|[[:space:]]+$/, "", arr[i])
|
|
195
|
-
if (arr[i] != "") print arr[i]
|
|
196
|
-
}
|
|
197
|
-
exit
|
|
198
|
-
}
|
|
199
|
-
' "$data_file"
|
|
200
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
-- Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
2
|
-
-- headless-upgrade.lua — plugin/tool refresh for `dot upgrade`.
|
|
3
|
-
--
|
|
4
|
-
-- Runs Lazy sync and then waits for Mason's async install queue to drain
|
|
5
|
-
-- before exiting. The naive invocation
|
|
6
|
-
-- nvim --headless "+Lazy! sync" +qa
|
|
7
|
-
-- races on two fronts:
|
|
8
|
-
-- 1. Lazy's own async ops (git fetch/checkout, `build` hooks) can outlive
|
|
9
|
-
-- the `Lazy! sync` command return.
|
|
10
|
-
-- 2. `mason-nvim-dap` and `mason-lspconfig` fire `ensure_installed` on
|
|
11
|
-
-- plugin load; those installs are enqueued to mason.nvim and run
|
|
12
|
-
-- async, so `+qa` aborts them mid-download (leaving codelldb / debugpy
|
|
13
|
-
-- / delve half-installed, per repeated user reports on `dot upgrade`).
|
|
14
|
-
--
|
|
15
|
-
-- We explicitly wait for both queues before quitting.
|
|
16
|
-
|
|
17
|
-
local LAZY_TIMEOUT_MS = 300000 -- 5 min per phase
|
|
18
|
-
local MASON_TIMEOUT_MS = 300000
|
|
19
|
-
|
|
20
|
-
local function log(msg)
|
|
21
|
-
io.stderr:write(("[headless-upgrade] %s\n"):format(msg))
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
-- ---------------------------------------------------------------------------
|
|
25
|
-
-- Phase 1: Lazy sync (blocking)
|
|
26
|
-
-- ---------------------------------------------------------------------------
|
|
27
|
-
local ok_lazy, lazy = pcall(require, "lazy")
|
|
28
|
-
if not ok_lazy then
|
|
29
|
-
log("lazy.nvim not available; skipping plugin update")
|
|
30
|
-
vim.cmd("quitall!")
|
|
31
|
-
return
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
lazy.sync({ wait = true, show = false })
|
|
35
|
-
|
|
36
|
-
-- Belt-and-braces: give any residual runner tasks a chance to drain even if
|
|
37
|
-
-- `wait = true` returned early on the last task in a batch.
|
|
38
|
-
pcall(function()
|
|
39
|
-
local ok_runner, runner = pcall(require, "lazy.manage.runner")
|
|
40
|
-
if not ok_runner then return end
|
|
41
|
-
vim.wait(LAZY_TIMEOUT_MS, function()
|
|
42
|
-
return not (runner.running and runner.running())
|
|
43
|
-
end, 200)
|
|
44
|
-
end)
|
|
45
|
-
|
|
46
|
-
-- ---------------------------------------------------------------------------
|
|
47
|
-
-- Phase 2: drain Mason's async install queue
|
|
48
|
-
-- ---------------------------------------------------------------------------
|
|
49
|
-
pcall(function()
|
|
50
|
-
local ok_reg, registry = pcall(require, "mason-registry")
|
|
51
|
-
if not ok_reg then return end
|
|
52
|
-
|
|
53
|
-
-- Refresh the remote registry so ensure_installed picks up latest versions.
|
|
54
|
-
local refreshed = false
|
|
55
|
-
registry.refresh(function() refreshed = true end)
|
|
56
|
-
vim.wait(30000, function() return refreshed end, 200)
|
|
57
|
-
|
|
58
|
-
local function any_installing()
|
|
59
|
-
for _, pkg in ipairs(registry.get_all_packages() or {}) do
|
|
60
|
-
if pkg.is_installing and pkg:is_installing() then
|
|
61
|
-
return true
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
return false
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
-- Small settle time so installs triggered by ensure_installed hooks have
|
|
68
|
-
-- a chance to enter the installing state before we start polling.
|
|
69
|
-
vim.wait(2000, function() return false end, 200)
|
|
70
|
-
|
|
71
|
-
local done = vim.wait(MASON_TIMEOUT_MS, function()
|
|
72
|
-
return not any_installing()
|
|
73
|
-
end, 500)
|
|
74
|
-
|
|
75
|
-
if not done then
|
|
76
|
-
log(("Mason install queue still active after %ds; exiting anyway"):format(
|
|
77
|
-
MASON_TIMEOUT_MS / 1000))
|
|
78
|
-
end
|
|
79
|
-
end)
|
|
80
|
-
|
|
81
|
-
vim.cmd("quitall!")
|
package/scripts/ops/ai-setup.sh
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Universal AI Toolchain Setup & Authentication.
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
9
|
-
# shellcheck disable=SC1091
|
|
10
|
-
source "$SCRIPT_DIR/../lib/dot/ui.sh"
|
|
11
|
-
|
|
12
|
-
ui_header "Universal AI Toolchain Setup"
|
|
13
|
-
|
|
14
|
-
setup_tool() {
|
|
15
|
-
local name="$1"
|
|
16
|
-
local cmd="$2"
|
|
17
|
-
shift 2
|
|
18
|
-
# Remaining args are the auth command — passed as an array to avoid eval.
|
|
19
|
-
local -a auth_argv=("$@")
|
|
20
|
-
|
|
21
|
-
ui_section "Setting up $name"
|
|
22
|
-
if command -v "$cmd" >/dev/null 2>&1; then
|
|
23
|
-
if [[ ! -t 0 && "${auth_argv[*]}" != *"--version"* ]]; then
|
|
24
|
-
ui_info "$name" "non-interactive shell; skipping login. Run '${auth_argv[*]}' in a terminal."
|
|
25
|
-
return 0
|
|
26
|
-
fi
|
|
27
|
-
ui_info "Tool found, initiating authentication..."
|
|
28
|
-
"${auth_argv[@]}" || ui_warn "$name" "Setup/Auth skipped or failed."
|
|
29
|
-
else
|
|
30
|
-
ui_err "$name" "Binary not found. Run 'dot apply' or install via mise first."
|
|
31
|
-
fi
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
# 1. Claude
|
|
35
|
-
setup_tool "Claude CLI" "claude" claude --version # Claude handles auth via web flow or env
|
|
36
|
-
|
|
37
|
-
# 2. Antigravity CLI
|
|
38
|
-
setup_tool "Antigravity CLI" "agy" agy --version
|
|
39
|
-
|
|
40
|
-
# 3. Codex
|
|
41
|
-
setup_tool "Codex CLI" "codex" codex --version
|
|
42
|
-
|
|
43
|
-
# 4. Copilot
|
|
44
|
-
setup_tool "Copilot CLI" "copilot" copilot --version
|
|
45
|
-
|
|
46
|
-
# 5. Goose
|
|
47
|
-
setup_tool "Goose" "goose" goose --version
|
|
48
|
-
|
|
49
|
-
# 6. Kiro
|
|
50
|
-
setup_tool "Kiro CLI" "kiro-cli" kiro-cli login
|
|
51
|
-
|
|
52
|
-
# 7. Kimi
|
|
53
|
-
setup_tool "Kimi CLI" "kimi" kimi --version
|
|
54
|
-
|
|
55
|
-
# 8. Aider
|
|
56
|
-
setup_tool "Aider" "aider" aider --version
|
|
57
|
-
|
|
58
|
-
# 9. Autohand Code
|
|
59
|
-
setup_tool "Autohand Code" "autohand" autohand --version
|
|
60
|
-
|
|
61
|
-
# 10. Mistral Vibe
|
|
62
|
-
setup_tool "Mistral Vibe" "vibe" vibe --version
|
|
63
|
-
|
|
64
|
-
# 11. Qwen Code
|
|
65
|
-
setup_tool "Qwen Code" "qwen" qwen --version
|
|
66
|
-
|
|
67
|
-
# 12. ZAI
|
|
68
|
-
setup_tool "ZAI" "zai" zai --version
|
|
69
|
-
|
|
70
|
-
ui_header "AI Setup Complete"
|
|
71
|
-
ui_info "All tools are ready. Use 'dot ai' to check status."
|
package/scripts/ops/bundle.sh
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Create an offline bundle of the dotfiles environment for air-gapped systems.
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
_cleanup_files=()
|
|
9
|
-
trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
|
|
10
|
-
|
|
11
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
12
|
-
# shellcheck disable=SC1091
|
|
13
|
-
source "$SCRIPT_DIR/../lib/dot/ui.sh"
|
|
14
|
-
# shellcheck disable=SC1091
|
|
15
|
-
source "$SCRIPT_DIR/../lib/dot/log.sh"
|
|
16
|
-
export DOT_COMMAND="bundle"
|
|
17
|
-
|
|
18
|
-
usage() {
|
|
19
|
-
cat <<'EOF'
|
|
20
|
-
Usage: bundle.sh [output-dir]
|
|
21
|
-
|
|
22
|
-
Create an offline dotfiles bundle as a .tar.zst archive.
|
|
23
|
-
EOF
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
case "${1:-}" in
|
|
27
|
-
--help | -h)
|
|
28
|
-
usage
|
|
29
|
-
exit 0
|
|
30
|
-
;;
|
|
31
|
-
-*)
|
|
32
|
-
printf 'Unknown option: %s\n' "$1" >&2
|
|
33
|
-
usage >&2
|
|
34
|
-
exit 2
|
|
35
|
-
;;
|
|
36
|
-
esac
|
|
37
|
-
|
|
38
|
-
# Concurrency guard
|
|
39
|
-
LOCK_DIR="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}"
|
|
40
|
-
if [[ ! -d "$LOCK_DIR" || ! -w "$LOCK_DIR" ]]; then
|
|
41
|
-
LOCK_DIR="${TMPDIR:-/tmp}"
|
|
42
|
-
fi
|
|
43
|
-
LOCK_FILE="$LOCK_DIR/dotfiles-bundle.lock"
|
|
44
|
-
if command -v flock >/dev/null 2>&1; then
|
|
45
|
-
exec 9>"$LOCK_FILE"
|
|
46
|
-
if ! flock -n 9; then
|
|
47
|
-
ui_warn "Already running" "Another bundle instance is active"
|
|
48
|
-
exit 0
|
|
49
|
-
fi
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
OUTPUT_DIR="${1:-$HOME/Downloads}"
|
|
53
|
-
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
|
54
|
-
BUNDLE_FILE="$OUTPUT_DIR/dotfiles_offline_bundle_$TIMESTAMP.tar.zst"
|
|
55
|
-
|
|
56
|
-
dot_log info "bundle_start"
|
|
57
|
-
ui_header "Creating Offline Bundle (Zero-Network Mode)"
|
|
58
|
-
|
|
59
|
-
# Ensure target directory exists
|
|
60
|
-
mkdir -p "$OUTPUT_DIR"
|
|
61
|
-
|
|
62
|
-
ui_info "Gathering artifacts..."
|
|
63
|
-
# We use zstd for much faster compression of binary artifacts compared to gzip/xz
|
|
64
|
-
if ! command -v tar >/dev/null || ! command -v zstd >/dev/null; then
|
|
65
|
-
ui_err "tar and zstd are required for bundling."
|
|
66
|
-
exit 1
|
|
67
|
-
fi
|
|
68
|
-
|
|
69
|
-
# Define paths to bundle
|
|
70
|
-
declare -a paths_to_bundle=(
|
|
71
|
-
"$HOME/.dotfiles"
|
|
72
|
-
"$HOME/.config/chezmoi"
|
|
73
|
-
"$HOME/.local/share/mise"
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
# Optional: Add nix store if present and requested
|
|
77
|
-
if [[ -d "/nix/store" ]] && [[ "${DOTFILES_BUNDLE_NIX:-0}" == "1" ]]; then
|
|
78
|
-
ui_warn "Including Nix store. This will be very large."
|
|
79
|
-
paths_to_bundle+=("/nix/store" "/nix/var/nix" "$HOME/.nix-profile")
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# Filter only existing paths
|
|
83
|
-
declare -a valid_paths=()
|
|
84
|
-
for p in "${paths_to_bundle[@]}"; do
|
|
85
|
-
if [[ -e "$p" ]]; then
|
|
86
|
-
valid_paths+=("$p")
|
|
87
|
-
ui_bullet "Adding: $p"
|
|
88
|
-
fi
|
|
89
|
-
done
|
|
90
|
-
|
|
91
|
-
ui_info "Compressing artifacts (this may take a while)..."
|
|
92
|
-
# Use absolute paths and store them relative to / to preserve structure
|
|
93
|
-
tar --zstd -cf "$BUNDLE_FILE" -P "${valid_paths[@]}" 2>/dev/null || {
|
|
94
|
-
ui_err "Failed to create bundle."
|
|
95
|
-
exit 1
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
bundle_size=$(stat -c '%s' "$BUNDLE_FILE" 2>/dev/null || stat -f '%z' "$BUNDLE_FILE" 2>/dev/null || echo 0)
|
|
99
|
-
dot_log info "bundle_end" "file=$BUNDLE_FILE"
|
|
100
|
-
dot_metric "bundle_size" "$bundle_size" "bytes"
|
|
101
|
-
ui_ok "Bundle created" "$BUNDLE_FILE"
|
|
102
|
-
ui_info "To restore on an offline machine:"
|
|
103
|
-
ui_bullet "tar --zstd -xf $BUNDLE_FILE -P"
|
|
104
|
-
ui_bullet "cd ~/.dotfiles && ./install.sh --force"
|
package/scripts/ops/chaos.sh
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Chaos Engineering: Randomly corrupt config files to test self-healing (dot heal)
|
|
5
|
-
# USE WITH CAUTION: This intentionally breaks your environment.
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
13
|
-
ui_init
|
|
14
|
-
|
|
15
|
-
if [[ "${1:-}" != "--force" ]]; then
|
|
16
|
-
ui_err "WARNING" "This script will intentionally break your dotfiles configuration."
|
|
17
|
-
ui_info "Purpose" "Tests 'dot heal' auto-repair capabilities."
|
|
18
|
-
echo ""
|
|
19
|
-
ui_info "To run, execute" "${0} --force"
|
|
20
|
-
exit 1
|
|
21
|
-
fi
|
|
22
|
-
|
|
23
|
-
ui_warn "Initiating Chaos Engineering Sequence..."
|
|
24
|
-
|
|
25
|
-
# Target files for corruption/deletion
|
|
26
|
-
TARGETS=(
|
|
27
|
-
"$HOME/.config/starship.toml"
|
|
28
|
-
"$HOME/.zshrc"
|
|
29
|
-
"$HOME/.config/alacritty/alacritty.toml"
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
# 1. Configuration Deletion
|
|
33
|
-
for target in "${TARGETS[@]}"; do
|
|
34
|
-
if [[ -f "$target" ]] || [[ -L "$target" ]]; then
|
|
35
|
-
ui_err "Destroying" "$target"
|
|
36
|
-
rm -f "$target"
|
|
37
|
-
fi
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
# 2. Symlink Corruption
|
|
41
|
-
ui_err "Creating" "broken symlinks..."
|
|
42
|
-
ln -sf /tmp/nonexistent_file_xyz "$HOME/.config/broken_symlink_test"
|
|
43
|
-
|
|
44
|
-
# 3. Path Mutation
|
|
45
|
-
ui_err "Corrupting" "PATH..."
|
|
46
|
-
export PATH="/bin"
|
|
47
|
-
|
|
48
|
-
echo ""
|
|
49
|
-
ui_ok "Chaos injected" "State is drifted and broken."
|
|
50
|
-
ui_info "Recover" "dot heal"
|