@sebastienrousseau/dotfiles 0.2.520 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -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,82 +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
|
-
SECRETS_DIR="$HOME/.config/chezmoi"
|
|
7
|
-
KEY_FILE="$SECRETS_DIR/key.txt"
|
|
8
|
-
CONFIG_FILE="$SECRETS_DIR/chezmoi.toml"
|
|
9
|
-
|
|
10
|
-
mkdir -p "$SECRETS_DIR"
|
|
11
|
-
|
|
12
|
-
if ! command -v age-keygen >/dev/null; then
|
|
13
|
-
echo "age-keygen not found. Install 'age' first." >&2
|
|
14
|
-
exit 1
|
|
15
|
-
fi
|
|
16
|
-
|
|
17
|
-
if [[ ! -f "$KEY_FILE" ]]; then
|
|
18
|
-
age-keygen -o "$KEY_FILE"
|
|
19
|
-
chmod 600 "$KEY_FILE"
|
|
20
|
-
echo "Age key created at $KEY_FILE"
|
|
21
|
-
else
|
|
22
|
-
echo "Age key already exists: $KEY_FILE"
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
recipient=$(age-keygen -y "$KEY_FILE")
|
|
26
|
-
|
|
27
|
-
python3 - "$CONFIG_FILE" "$KEY_FILE" "$recipient" <<'PY'
|
|
28
|
-
import sys
|
|
29
|
-
import json
|
|
30
|
-
from pathlib import Path
|
|
31
|
-
|
|
32
|
-
config_path = Path(sys.argv[1])
|
|
33
|
-
key_file = sys.argv[2]
|
|
34
|
-
recipient = sys.argv[3]
|
|
35
|
-
|
|
36
|
-
content = ""
|
|
37
|
-
if config_path.exists():
|
|
38
|
-
content = config_path.read_text(encoding="utf-8")
|
|
39
|
-
|
|
40
|
-
lines = content.splitlines()
|
|
41
|
-
|
|
42
|
-
# Remove existing encryption keys and age blocks regardless of where a previous
|
|
43
|
-
# run placed them.
|
|
44
|
-
out = []
|
|
45
|
-
in_age = False
|
|
46
|
-
for line in lines:
|
|
47
|
-
if line.strip().startswith("[age]"):
|
|
48
|
-
in_age = True
|
|
49
|
-
continue
|
|
50
|
-
if in_age:
|
|
51
|
-
if line.strip().startswith("["):
|
|
52
|
-
in_age = False
|
|
53
|
-
out.append(line)
|
|
54
|
-
else:
|
|
55
|
-
continue
|
|
56
|
-
else:
|
|
57
|
-
if line.strip().startswith("encryption ="):
|
|
58
|
-
continue
|
|
59
|
-
out.append(line)
|
|
60
|
-
|
|
61
|
-
# Keep encryption at top level; chezmoi warns when it is nested under [data].
|
|
62
|
-
insert_at = 0
|
|
63
|
-
for i, line in enumerate(out):
|
|
64
|
-
if line.strip().startswith("["):
|
|
65
|
-
insert_at = i
|
|
66
|
-
break
|
|
67
|
-
else:
|
|
68
|
-
insert_at = len(out)
|
|
69
|
-
|
|
70
|
-
top_level = ["encryption = \"age\"", ""]
|
|
71
|
-
out[insert_at:insert_at] = top_level
|
|
72
|
-
|
|
73
|
-
# Append updated age config (use json.dumps for safe string escaping)
|
|
74
|
-
out.append("")
|
|
75
|
-
out.append("[age]")
|
|
76
|
-
out.append(f"identity = {json.dumps(key_file)}")
|
|
77
|
-
out.append(f"recipient = {json.dumps(recipient)}")
|
|
78
|
-
|
|
79
|
-
config_path.write_text("\n".join(out).rstrip() + "\n", encoding="utf-8")
|
|
80
|
-
PY
|
|
81
|
-
|
|
82
|
-
echo "Updated $CONFIG_FILE with age encryption settings."
|
|
@@ -1,46 +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
|
-
OUT_FILE="${1:-$HOME/.config/chezmoi/encrypted_secrets.env.age}"
|
|
7
|
-
KEYRING_DIR="$HOME/.config/chezmoi"
|
|
8
|
-
AGE_KEY="$KEYRING_DIR/key.txt"
|
|
9
|
-
|
|
10
|
-
if [ ! -f "$AGE_KEY" ]; then
|
|
11
|
-
echo "Age identity not found: $AGE_KEY"
|
|
12
|
-
echo "Run: dot secrets-init"
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
|
|
16
|
-
if ! command -v age >/dev/null; then
|
|
17
|
-
echo "age not found. Install it first."
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
if [ -f "$OUT_FILE" ]; then
|
|
22
|
-
echo "Secrets file already exists: $OUT_FILE"
|
|
23
|
-
exit 0
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
recipient="$(age-keygen -y "$AGE_KEY")"
|
|
27
|
-
mkdir -p "$(dirname "$OUT_FILE")"
|
|
28
|
-
|
|
29
|
-
tmp_secrets="$(umask 077 && mktemp)" || exit 1
|
|
30
|
-
tmp_recipient="$(umask 077 && mktemp)" || exit 1
|
|
31
|
-
trap 'rm -f "$tmp_secrets" "$tmp_recipient"' EXIT
|
|
32
|
-
|
|
33
|
-
printf "%s\n" "# Add secrets as KEY=VALUE" "EXAMPLE_TOKEN=change_me" >"$tmp_secrets"
|
|
34
|
-
printf "%s" "$recipient" >"$tmp_recipient"
|
|
35
|
-
|
|
36
|
-
age -R "$tmp_recipient" -o "$OUT_FILE" "$tmp_secrets"
|
|
37
|
-
|
|
38
|
-
chmod 600 "$OUT_FILE"
|
|
39
|
-
|
|
40
|
-
cat <<MSG
|
|
41
|
-
Created encrypted secrets file:
|
|
42
|
-
$OUT_FILE
|
|
43
|
-
|
|
44
|
-
Edit it with:
|
|
45
|
-
dot secrets
|
|
46
|
-
MSG
|
|
@@ -1,44 +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
|
-
KEY_PATH="${1:-$HOME/.ssh/id_ed25519}"
|
|
7
|
-
OUT_FILE="${2:-$HOME/.config/chezmoi/encrypted_id_ed25519.age}"
|
|
8
|
-
KEYRING_DIR="$HOME/.config/chezmoi"
|
|
9
|
-
AGE_KEY="$KEYRING_DIR/key.txt"
|
|
10
|
-
|
|
11
|
-
if [ ! -f "$KEY_PATH" ]; then
|
|
12
|
-
echo "SSH key not found: $KEY_PATH"
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
|
|
16
|
-
if [ ! -f "$AGE_KEY" ]; then
|
|
17
|
-
echo "Age identity not found: $AGE_KEY"
|
|
18
|
-
echo "Run: dot secrets-init"
|
|
19
|
-
exit 1
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
if ! command -v age >/dev/null; then
|
|
23
|
-
echo "age not found. Install it first."
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
recipient="$(age-keygen -y "$AGE_KEY")"
|
|
28
|
-
mkdir -p "$(dirname "$OUT_FILE")"
|
|
29
|
-
|
|
30
|
-
if [ -f "$OUT_FILE" ]; then
|
|
31
|
-
echo "Encrypted file already exists: $OUT_FILE"
|
|
32
|
-
exit 0
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
age -R <(printf "%s" "$recipient") -o "$OUT_FILE" "$KEY_PATH"
|
|
36
|
-
chmod 600 "$OUT_FILE"
|
|
37
|
-
|
|
38
|
-
cat <<MSG
|
|
39
|
-
Encrypted SSH key written to:
|
|
40
|
-
$OUT_FILE
|
|
41
|
-
|
|
42
|
-
This file is local only. If you want to track it in dotfiles, run:
|
|
43
|
-
chezmoi add --encrypt $OUT_FILE
|
|
44
|
-
MSG
|
|
@@ -1,58 +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 compressed backup of home directory.
|
|
5
|
-
##
|
|
6
|
-
## Archives the home directory (excluding cache and trash) to a timestamped
|
|
7
|
-
# shellcheck disable=SC1091
|
|
8
|
-
## .tgz file. Supports custom source and destination directories via
|
|
9
|
-
## environment variables.
|
|
10
|
-
##
|
|
11
|
-
## # Usage
|
|
12
|
-
## dot backup
|
|
13
|
-
## DOTFILES_BACKUP_DIR=/mnt/backup dot backup
|
|
14
|
-
##
|
|
15
|
-
## # Dependencies
|
|
16
|
-
## - tar: Archive creation
|
|
17
|
-
##
|
|
18
|
-
## # Environment Variables
|
|
19
|
-
## | Variable | Default | Description |
|
|
20
|
-
## |----------|---------|-------------|
|
|
21
|
-
## | DOTFILES_BACKUP_DIR | ~/.backups | Backup destination |
|
|
22
|
-
## | DOTFILES_BACKUP_SRC | ~/ | Source directory |
|
|
23
|
-
##
|
|
24
|
-
## # Platform Notes
|
|
25
|
-
## - macOS: Uses BSD tar
|
|
26
|
-
## - Linux: Uses GNU tar
|
|
27
|
-
## - WSL: Backup stored in Linux filesystem for performance
|
|
28
|
-
##
|
|
29
|
-
## # Security
|
|
30
|
-
## Does not encrypt backups. Use age/gpg for sensitive data.
|
|
31
|
-
##
|
|
32
|
-
## # Idempotency
|
|
33
|
-
## Creates new timestamped backup on each run.
|
|
34
|
-
|
|
35
|
-
set -euo pipefail
|
|
36
|
-
|
|
37
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
38
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
39
|
-
# shellcheck disable=SC1091
|
|
40
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
41
|
-
|
|
42
|
-
ui_init
|
|
43
|
-
ui_header "Backup"
|
|
44
|
-
|
|
45
|
-
BACKUP_DIR="${DOTFILES_BACKUP_DIR:-$HOME/.backups}"
|
|
46
|
-
SRC_DIR="${DOTFILES_BACKUP_SRC:-$HOME}"
|
|
47
|
-
STAMP=$(date +%Y%m%d-%H%M%S)
|
|
48
|
-
OUT="$BACKUP_DIR/dotfiles-backup-$STAMP.tgz"
|
|
49
|
-
|
|
50
|
-
mkdir -p "$BACKUP_DIR"
|
|
51
|
-
|
|
52
|
-
if ! tar --exclude="$HOME/.cache" --exclude="$HOME/.local/share/Trash" -czf "$OUT" "$SRC_DIR"; then
|
|
53
|
-
ui_err "Backup failed"
|
|
54
|
-
rm -f "$OUT"
|
|
55
|
-
exit 1
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
ui_ok "Backup written" "$OUT"
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
#
|
|
5
|
-
# scripts/security/check-disclosure-key-expiry.sh
|
|
6
|
-
#
|
|
7
|
-
# Reads the disclosure public key from `docs/security/security-pubkey.asc`,
|
|
8
|
-
# parses its expiry, and exits non-zero when the remaining lifetime is
|
|
9
|
-
# below threshold. Closes the R3 audit N2 finding (no automated alert
|
|
10
|
-
# for the 2029-05-15 expiry).
|
|
11
|
-
#
|
|
12
|
-
# Two thresholds:
|
|
13
|
-
# --warn-days N Emit a `::warning::` if expiry is < N days away.
|
|
14
|
-
# Default 90.
|
|
15
|
-
# --fail-days N Exit 1 (CI failure) if expiry is < N days away.
|
|
16
|
-
# Default 30.
|
|
17
|
-
#
|
|
18
|
-
# Usage:
|
|
19
|
-
# bash scripts/security/check-disclosure-key-expiry.sh
|
|
20
|
-
# bash scripts/security/check-disclosure-key-expiry.sh --warn-days 180 --fail-days 60
|
|
21
|
-
#
|
|
22
|
-
# Designed to run from `.github/workflows/verify-gpg-wkd.yml` on the
|
|
23
|
-
# weekly schedule, and from a maintainer's local pre-release sanity
|
|
24
|
-
# check. Does NOT require network — reads the in-repo .asc only.
|
|
25
|
-
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
|
|
28
|
-
WARN_DAYS=90
|
|
29
|
-
FAIL_DAYS=30
|
|
30
|
-
|
|
31
|
-
while [[ $# -gt 0 ]]; do
|
|
32
|
-
case "$1" in
|
|
33
|
-
--warn-days)
|
|
34
|
-
WARN_DAYS="$2"
|
|
35
|
-
shift 2
|
|
36
|
-
;;
|
|
37
|
-
--fail-days)
|
|
38
|
-
FAIL_DAYS="$2"
|
|
39
|
-
shift 2
|
|
40
|
-
;;
|
|
41
|
-
-h | --help)
|
|
42
|
-
sed -n '5,25p' "${BASH_SOURCE[0]}"
|
|
43
|
-
exit 0
|
|
44
|
-
;;
|
|
45
|
-
*)
|
|
46
|
-
echo "Unknown arg: $1" >&2
|
|
47
|
-
exit 2
|
|
48
|
-
;;
|
|
49
|
-
esac
|
|
50
|
-
done
|
|
51
|
-
|
|
52
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
53
|
-
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
54
|
-
ASC="$REPO_ROOT/docs/security/security-pubkey.asc"
|
|
55
|
-
|
|
56
|
-
if [[ ! -f "$ASC" ]]; then
|
|
57
|
-
echo "::error::no public key at $ASC" >&2
|
|
58
|
-
exit 2
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
if ! command -v gpg >/dev/null 2>&1; then
|
|
62
|
-
echo "::warning::gpg not installed — cannot verify key expiry" >&2
|
|
63
|
-
exit 0
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# Import into a throwaway keyring so we don't pollute the user's real one.
|
|
67
|
-
GNUPGHOME="$(mktemp -d -t dot-disclosure-key.XXXXXX)"
|
|
68
|
-
export GNUPGHOME
|
|
69
|
-
chmod 700 "$GNUPGHOME"
|
|
70
|
-
trap 'rm -rf "$GNUPGHOME"' EXIT
|
|
71
|
-
|
|
72
|
-
# gpg can emit harmless warnings ("keyboxd older than us", "gpg-agent
|
|
73
|
-
# IPC failed" in fresh GNUPGHOME, etc.) and exit non-zero under
|
|
74
|
-
# `set -e` even when the import itself succeeded. Verify success by
|
|
75
|
-
# checking the err log for the literal `imported: N` (N >= 1) line
|
|
76
|
-
# rather than trusting gpg's exit code.
|
|
77
|
-
gpg --batch --import "$ASC" >/dev/null 2>"$GNUPGHOME/import.err" || true
|
|
78
|
-
if ! grep -qE '^gpg:[[:space:]]*imported: [1-9]' "$GNUPGHOME/import.err"; then
|
|
79
|
-
echo "::error::gpg import failed for $ASC" >&2
|
|
80
|
-
cat "$GNUPGHOME/import.err" >&2
|
|
81
|
-
exit 2
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# `--with-colons` field 7 of the `pub:` line is the expiry in Unix
|
|
85
|
-
# seconds; 0 means no expiry.
|
|
86
|
-
expires=$(gpg --with-colons --fingerprint 2>/dev/null | awk -F: '/^pub:/{print $7; exit}')
|
|
87
|
-
|
|
88
|
-
if [[ -z "$expires" || "$expires" == "0" ]]; then
|
|
89
|
-
echo "::warning::disclosure key has no expiry — set one per docs/security/KEY_ROTATION.md" >&2
|
|
90
|
-
exit 0
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
now=$(date -u +%s)
|
|
94
|
-
remaining_days=$(((expires - now) / 86400))
|
|
95
|
-
|
|
96
|
-
expires_date=$(date -u -r "$expires" '+%Y-%m-%d' 2>/dev/null || date -u -d "@$expires" '+%Y-%m-%d' 2>/dev/null || echo "(date format unknown)")
|
|
97
|
-
|
|
98
|
-
echo "Disclosure key expires: $expires_date ($remaining_days days from now)"
|
|
99
|
-
echo " warn threshold: $WARN_DAYS days"
|
|
100
|
-
echo " fail threshold: $FAIL_DAYS days"
|
|
101
|
-
|
|
102
|
-
if ((remaining_days < FAIL_DAYS)); then
|
|
103
|
-
echo "::error::Disclosure key expires in $remaining_days days. Rotate now per docs/security/KEY_ROTATION.md." >&2
|
|
104
|
-
exit 1
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
if ((remaining_days < WARN_DAYS)); then
|
|
108
|
-
echo "::warning::Disclosure key expires in $remaining_days days. Schedule rotation per docs/security/KEY_ROTATION.md." >&2
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
exit 0
|
|
@@ -1,52 +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
|
-
# shellcheck source=../../lib/dot/platform.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
13
|
-
|
|
14
|
-
DRY_RUN=0
|
|
15
|
-
for arg in "$@"; do
|
|
16
|
-
case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
|
|
17
|
-
done
|
|
18
|
-
_run_cmd() {
|
|
19
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
ui_init
|
|
23
|
-
ui_header "DNS-over-HTTPS"
|
|
24
|
-
|
|
25
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then
|
|
26
|
-
ui_info "Mode" "dry-run (no changes will be made)"
|
|
27
|
-
elif [ "${DOTFILES_DOH:-}" != "1" ]; then
|
|
28
|
-
ui_warn "DoH" "disabled by default"
|
|
29
|
-
ui_info "Re-run" "DOTFILES_DOH=1"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
case "$(dot_platform_id)" in
|
|
34
|
-
linux | wsl)
|
|
35
|
-
if command -v resolvectl >/dev/null; then
|
|
36
|
-
ui_info "Enabling" "systemd-resolved DoH (Cloudflare)"
|
|
37
|
-
_run_cmd sudo resolvectl dns-over-https on
|
|
38
|
-
_run_cmd sudo resolvectl dns 1.1.1.1 1.0.0.1
|
|
39
|
-
else
|
|
40
|
-
ui_err "systemd-resolved" "not detected"
|
|
41
|
-
exit 1
|
|
42
|
-
fi
|
|
43
|
-
;;
|
|
44
|
-
macos)
|
|
45
|
-
ui_info "Configure" "DoH in your browser"
|
|
46
|
-
exit 0
|
|
47
|
-
;;
|
|
48
|
-
*)
|
|
49
|
-
ui_err "Unsupported OS" "DoH config"
|
|
50
|
-
exit 1
|
|
51
|
-
;;
|
|
52
|
-
esac
|
|
@@ -1,55 +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
|
-
# shellcheck source=../../lib/dot/platform.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/platform.sh"
|
|
13
|
-
|
|
14
|
-
ui_init
|
|
15
|
-
ui_header "Encryption Check"
|
|
16
|
-
|
|
17
|
-
case "$(dot_platform_id)" in
|
|
18
|
-
macos)
|
|
19
|
-
if command -v fdesetup >/dev/null; then
|
|
20
|
-
status=$(fdesetup status || true)
|
|
21
|
-
echo "$status"
|
|
22
|
-
echo "$status" | grep -qi "FileVault is On" && {
|
|
23
|
-
ui_ok "FileVault" "On"
|
|
24
|
-
exit 0
|
|
25
|
-
}
|
|
26
|
-
ui_warn "FileVault" "appears to be off"
|
|
27
|
-
exit 1
|
|
28
|
-
else
|
|
29
|
-
ui_err "fdesetup" "not found"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
;;
|
|
33
|
-
linux | wsl)
|
|
34
|
-
if command -v lsblk >/dev/null; then
|
|
35
|
-
lsblk_output=$(lsblk -f)
|
|
36
|
-
if command -v rg >/dev/null; then
|
|
37
|
-
if echo "$lsblk_output" | rg -i "crypto|luks" >/dev/null; then
|
|
38
|
-
ui_ok "LUKS" "encrypted block device detected"
|
|
39
|
-
exit 0
|
|
40
|
-
fi
|
|
41
|
-
else
|
|
42
|
-
if echo "$lsblk_output" | grep -Ei "crypto|luks" >/dev/null; then
|
|
43
|
-
ui_ok "LUKS" "encrypted block device detected"
|
|
44
|
-
exit 0
|
|
45
|
-
fi
|
|
46
|
-
fi
|
|
47
|
-
ui_warn "LUKS" "no crypto volume detected"
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
;;
|
|
51
|
-
*)
|
|
52
|
-
ui_err "Unsupported OS" "encryption check"
|
|
53
|
-
exit 1
|
|
54
|
-
;;
|
|
55
|
-
esac
|