@sebastienrousseau/dotfiles 0.2.519 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +200 -0
- package/LICENSE-APACHE +190 -0
- package/{LICENSE → LICENSE-MIT} +1 -1
- package/README.md +1172 -166
- package/install.sh +77 -11
- package/package.json +8 -8
- 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/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- 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 -117
- 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/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 -450
- 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 -155
- package/docs/manual/concept-index.md +0 -168
- package/docs/manual/index.md +0 -66
- 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/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 -43
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- 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/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 -242
- 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 -114
- 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 -138
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -39
- package/scripts/diagnostics/doctor.sh +0 -751
- package/scripts/diagnostics/drift-dashboard.sh +0 -202
- package/scripts/diagnostics/health.sh +0 -623
- 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 -119
- 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 -187
- package/scripts/dot/commands/agent.sh +0 -485
- package/scripts/dot/commands/agents.sh +0 -336
- package/scripts/dot/commands/ai.sh +0 -587
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -134
- 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 -688
- 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 -333
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -419
- 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 -556
- 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 -185
- 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 -63
- 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 -604
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-version-consistency.sh +0 -124
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -112
- 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 -117
- package/scripts/qa/validate-examples.sh +0 -27
- 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 -335
- 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 -742
- 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 -544
- package/scripts/theme/switch.sh +0 -449
- 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/version-sync.sh +0 -654
- 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,67 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# MIT License
|
|
3
|
-
# SPDX-License-Identifier: MIT
|
|
4
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
5
|
-
# See LICENSE file for details.
|
|
6
|
-
|
|
7
|
-
# Script: lock-configs.sh
|
|
8
|
-
# Description: Toggles immutability flags on critical configuration files.
|
|
9
|
-
# Usage: lock-configs [lock|unlock]
|
|
10
|
-
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
|
|
13
|
-
ACTION="${1:-lock}"
|
|
14
|
-
CRITICAL_FILES=(
|
|
15
|
-
"$HOME/.zshrc"
|
|
16
|
-
"$HOME/.bashrc"
|
|
17
|
-
"$HOME/.profile"
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
# Determine OS command for immutability
|
|
21
|
-
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
22
|
-
LOCK_CMD="chflags uchg"
|
|
23
|
-
UNLOCK_CMD="chflags nouchg"
|
|
24
|
-
CHECK_CMD="ls -lO"
|
|
25
|
-
else
|
|
26
|
-
# Linux (chattr +i requires root; fail loudly when sudo is missing
|
|
27
|
-
# rather than printing a confusing error per file in automation)
|
|
28
|
-
if command -v chattr >/dev/null; then
|
|
29
|
-
if ! command -v sudo >/dev/null; then
|
|
30
|
-
echo " 'sudo' not found; chattr requires root. Aborting." >&2
|
|
31
|
-
exit 1
|
|
32
|
-
fi
|
|
33
|
-
if ! sudo -n true 2>/dev/null && [[ ! -t 0 ]]; then
|
|
34
|
-
echo " sudo requires a password but no TTY is attached. Aborting." >&2
|
|
35
|
-
exit 1
|
|
36
|
-
fi
|
|
37
|
-
LOCK_CMD="sudo chattr +i"
|
|
38
|
-
UNLOCK_CMD="sudo chattr -i"
|
|
39
|
-
CHECK_CMD="lsattr"
|
|
40
|
-
else
|
|
41
|
-
echo " 'chattr' not found. Cannot set immutability on Linux without it." >&2
|
|
42
|
-
exit 1
|
|
43
|
-
fi
|
|
44
|
-
fi
|
|
45
|
-
|
|
46
|
-
if [[ "$ACTION" == "lock" ]]; then
|
|
47
|
-
echo " Locking critical configuration files..."
|
|
48
|
-
CMD="$LOCK_CMD"
|
|
49
|
-
elif [[ "$ACTION" == "unlock" ]]; then
|
|
50
|
-
echo " Unlocking critical configuration files..."
|
|
51
|
-
CMD="$UNLOCK_CMD"
|
|
52
|
-
else
|
|
53
|
-
echo "Usage: $0 [lock|unlock]"
|
|
54
|
-
exit 1
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
for file in "${CRITICAL_FILES[@]}"; do
|
|
58
|
-
if [[ -f "$file" ]]; then
|
|
59
|
-
echo "Processing: $file"
|
|
60
|
-
$CMD "$file" || echo "️ Failed to modify flags for $file (permission denied?)"
|
|
61
|
-
fi
|
|
62
|
-
done
|
|
63
|
-
|
|
64
|
-
echo "Done. Environment state:"
|
|
65
|
-
for file in "${CRITICAL_FILES[@]}"; do
|
|
66
|
-
[[ -f "$file" ]] && $CHECK_CMD "$file"
|
|
67
|
-
done
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
8
|
-
# shellcheck disable=SC1091
|
|
9
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
10
|
-
# 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 "Lock Screen"
|
|
24
|
-
|
|
25
|
-
if [[ "$DRY_RUN" -eq 1 ]]; then
|
|
26
|
-
ui_info "Mode" "dry-run (no changes will be made)"
|
|
27
|
-
elif [ "${DOTFILES_LOCK:-}" != "1" ]; then
|
|
28
|
-
ui_warn "Lock screen" "disabled by default"
|
|
29
|
-
ui_info "Re-run" "DOTFILES_LOCK=1"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
case "$(dot_platform_id)" in
|
|
34
|
-
linux | wsl)
|
|
35
|
-
if command -v gsettings >/dev/null; then
|
|
36
|
-
ui_info "Enabling" "screen lock and idle timeout"
|
|
37
|
-
_run_cmd gsettings set org.gnome.desktop.screensaver lock-enabled true || true
|
|
38
|
-
_run_cmd gsettings set org.gnome.desktop.session idle-delay 300 || true
|
|
39
|
-
_run_cmd gsettings set org.gnome.desktop.screensaver lock-delay 0 || true
|
|
40
|
-
else
|
|
41
|
-
ui_err "gsettings" "not found"
|
|
42
|
-
exit 1
|
|
43
|
-
fi
|
|
44
|
-
;;
|
|
45
|
-
macos)
|
|
46
|
-
ui_info "Enabling" "lock on sleep and screensaver (macOS)"
|
|
47
|
-
_run_cmd defaults write com.apple.screensaver askForPassword -int 1 || true
|
|
48
|
-
_run_cmd defaults write com.apple.screensaver askForPasswordDelay -int 0 || true
|
|
49
|
-
# 5-minute idle timeout
|
|
50
|
-
_run_cmd defaults -currentHost write com.apple.screensaver idleTime -int 300 || true
|
|
51
|
-
;;
|
|
52
|
-
*)
|
|
53
|
-
ui_err "Unsupported OS" "lock screen hardening"
|
|
54
|
-
exit 1
|
|
55
|
-
;;
|
|
56
|
-
esac
|
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
## Secure Configuration Management.
|
|
5
|
-
##
|
|
6
|
-
## Manages environment variables and secrets across local development.
|
|
7
|
-
## Provides init, validate, rotate, and audit capabilities for credentials.
|
|
8
|
-
##
|
|
9
|
-
## # Usage
|
|
10
|
-
## manage-secrets.sh init # Create .env.local from template
|
|
11
|
-
## manage-secrets.sh validate # Check configuration integrity
|
|
12
|
-
## manage-secrets.sh check # Scan for hardcoded secrets
|
|
13
|
-
## manage-secrets.sh rotate github # Secret rotation guide
|
|
14
|
-
## manage-secrets.sh clean # Remove temporary files
|
|
15
|
-
##
|
|
16
|
-
## # Dependencies
|
|
17
|
-
## - stat: Permission checking
|
|
18
|
-
## - grep: Pattern matching
|
|
19
|
-
## - find: File discovery
|
|
20
|
-
##
|
|
21
|
-
## # Platform Notes
|
|
22
|
-
## - macOS: Uses BSD stat syntax
|
|
23
|
-
## - Linux: Uses GNU stat syntax
|
|
24
|
-
## - WSL: Works with Linux filesystem permissions
|
|
25
|
-
##
|
|
26
|
-
## # Security
|
|
27
|
-
## - Creates .env.local with 600 permissions
|
|
28
|
-
## - Automatically adds .env.local to .gitignore
|
|
29
|
-
## - Never commits secrets to version control
|
|
30
|
-
##
|
|
31
|
-
## # Idempotency
|
|
32
|
-
## Safe to run repeatedly. init requires --force to overwrite.
|
|
33
|
-
|
|
34
|
-
set -euo pipefail
|
|
35
|
-
|
|
36
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
37
|
-
readonly SCRIPT_DIR
|
|
38
|
-
REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
39
|
-
readonly REPO_ROOT
|
|
40
|
-
readonly ENV_TEMPLATE="${REPO_ROOT}/.github/security-policies/environment-template.env"
|
|
41
|
-
readonly ENV_LOCAL="${REPO_ROOT}/.env.local"
|
|
42
|
-
|
|
43
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
44
|
-
# shellcheck disable=SC1091
|
|
45
|
-
source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
|
|
46
|
-
ui_init
|
|
47
|
-
|
|
48
|
-
# Help text
|
|
49
|
-
show_help() {
|
|
50
|
-
cat <<EOF
|
|
51
|
-
Secure Configuration Management
|
|
52
|
-
|
|
53
|
-
USAGE:
|
|
54
|
-
$0 <command> [options]
|
|
55
|
-
|
|
56
|
-
COMMANDS:
|
|
57
|
-
init Initialize secure environment configuration
|
|
58
|
-
validate Validate environment variables and security
|
|
59
|
-
template Show environment variable template
|
|
60
|
-
check Check for hardcoded secrets
|
|
61
|
-
rotate Help rotate secrets and tokens
|
|
62
|
-
clean Clean temporary files and logs
|
|
63
|
-
|
|
64
|
-
OPTIONS:
|
|
65
|
-
-h, --help Show this help message
|
|
66
|
-
-v, --verbose Verbose output
|
|
67
|
-
-f, --force Force operations (use with caution)
|
|
68
|
-
|
|
69
|
-
EXAMPLES:
|
|
70
|
-
$0 init # Initialize .env.local from template
|
|
71
|
-
$0 validate # Validate current configuration
|
|
72
|
-
$0 check # Scan for hardcoded secrets
|
|
73
|
-
$0 rotate github # Guide for rotating GitHub tokens
|
|
74
|
-
$0 clean # Clean up temporary files
|
|
75
|
-
|
|
76
|
-
SECURITY NOTES:
|
|
77
|
-
- Never commit .env.local to version control
|
|
78
|
-
- Use different tokens for different environments
|
|
79
|
-
- Rotate secrets regularly (every 90 days)
|
|
80
|
-
- Use least-privilege principle
|
|
81
|
-
EOF
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
# Logging functions — delegate to shared ui.sh
|
|
85
|
-
log_info() { ui_info "$@"; }
|
|
86
|
-
log_success() { ui_ok "$@"; }
|
|
87
|
-
log_warning() { ui_warn "$@"; }
|
|
88
|
-
log_error() { ui_err "$@"; }
|
|
89
|
-
|
|
90
|
-
# Initialize environment configuration
|
|
91
|
-
init_config() {
|
|
92
|
-
local force_init=false
|
|
93
|
-
if [[ "${1:-}" == "--force" ]]; then
|
|
94
|
-
force_init=true
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
log_info "Initializing secure environment configuration..."
|
|
98
|
-
|
|
99
|
-
if [[ -f "$ENV_LOCAL" ]] && [[ "$force_init" == "false" ]]; then
|
|
100
|
-
log_warning ".env.local already exists"
|
|
101
|
-
echo "Use --force to overwrite, or edit the existing file manually"
|
|
102
|
-
return 1
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
if [[ ! -f "$ENV_TEMPLATE" ]]; then
|
|
106
|
-
log_error "Environment template not found: $ENV_TEMPLATE"
|
|
107
|
-
return 1
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
# Copy template
|
|
111
|
-
cp "$ENV_TEMPLATE" "$ENV_LOCAL"
|
|
112
|
-
|
|
113
|
-
# Set secure permissions
|
|
114
|
-
chmod 600 "$ENV_LOCAL"
|
|
115
|
-
|
|
116
|
-
log_success ".env.local created from template"
|
|
117
|
-
log_info "Next steps:"
|
|
118
|
-
echo " 1. Edit .env.local and configure required variables"
|
|
119
|
-
echo " 2. Run '$0 validate' to check configuration"
|
|
120
|
-
# shellcheck disable=SC1091
|
|
121
|
-
echo " 3. Source the file: source .env.local"
|
|
122
|
-
|
|
123
|
-
# Add to .gitignore if not present
|
|
124
|
-
if [[ -f "${REPO_ROOT}/.gitignore" ]]; then
|
|
125
|
-
if ! grep -q "\.env\.local" "${REPO_ROOT}/.gitignore"; then
|
|
126
|
-
echo ".env.local" >>"${REPO_ROOT}/.gitignore"
|
|
127
|
-
log_info "Added .env.local to .gitignore"
|
|
128
|
-
fi
|
|
129
|
-
fi
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
# Validate environment configuration
|
|
133
|
-
validate_config() {
|
|
134
|
-
log_info "Validating environment configuration..."
|
|
135
|
-
|
|
136
|
-
local issues=0
|
|
137
|
-
|
|
138
|
-
# Check if .env.local exists
|
|
139
|
-
if [[ ! -f "$ENV_LOCAL" ]]; then
|
|
140
|
-
log_error ".env.local not found. Run '$0 init' to create it."
|
|
141
|
-
return 1
|
|
142
|
-
fi
|
|
143
|
-
|
|
144
|
-
# Check file permissions
|
|
145
|
-
local perms
|
|
146
|
-
perms=$(stat -c %a "$ENV_LOCAL" 2>/dev/null || stat -f %OLp "$ENV_LOCAL")
|
|
147
|
-
if [[ "$perms" != "600" ]]; then
|
|
148
|
-
log_warning ".env.local has incorrect permissions ($perms). Should be 600."
|
|
149
|
-
log_info "Fix with: chmod 600 $ENV_LOCAL"
|
|
150
|
-
issues=$((issues + 1))
|
|
151
|
-
fi
|
|
152
|
-
|
|
153
|
-
# Source and validate environment
|
|
154
|
-
# shellcheck source=/dev/null
|
|
155
|
-
# shellcheck disable=SC1091
|
|
156
|
-
if source "$ENV_LOCAL" 2>/dev/null; then
|
|
157
|
-
log_success ".env.local loads successfully"
|
|
158
|
-
else
|
|
159
|
-
log_error ".env.local has syntax errors"
|
|
160
|
-
issues=$((issues + 1))
|
|
161
|
-
fi
|
|
162
|
-
|
|
163
|
-
# Check for required variables
|
|
164
|
-
local required_vars=("GITHUB_TOKEN")
|
|
165
|
-
|
|
166
|
-
for var in "${required_vars[@]}"; do
|
|
167
|
-
if [[ -z "${!var:-}" ]]; then
|
|
168
|
-
log_warning "Required variable $var is not set or empty"
|
|
169
|
-
issues=$((issues + 1))
|
|
170
|
-
else
|
|
171
|
-
log_success "$var is configured"
|
|
172
|
-
fi
|
|
173
|
-
done
|
|
174
|
-
|
|
175
|
-
# Check for security patterns
|
|
176
|
-
if grep -E '(password|secret|key|token)="[^"]{1,}"' "$ENV_LOCAL" >/dev/null 2>&1; then
|
|
177
|
-
log_warning "Found configured credentials (this is expected)"
|
|
178
|
-
fi
|
|
179
|
-
|
|
180
|
-
if [[ $issues -eq 0 ]]; then
|
|
181
|
-
log_success "Environment configuration is valid"
|
|
182
|
-
return 0
|
|
183
|
-
else
|
|
184
|
-
log_error "Found $issues configuration issues"
|
|
185
|
-
return 1
|
|
186
|
-
fi
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
# Show template
|
|
190
|
-
show_template() {
|
|
191
|
-
if [[ -f "$ENV_TEMPLATE" ]]; then
|
|
192
|
-
log_info "Environment variable template:"
|
|
193
|
-
echo "----------------------------------------"
|
|
194
|
-
cat "$ENV_TEMPLATE"
|
|
195
|
-
else
|
|
196
|
-
log_error "Template file not found: $ENV_TEMPLATE"
|
|
197
|
-
return 1
|
|
198
|
-
fi
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
# Check for hardcoded secrets
|
|
202
|
-
check_secrets() {
|
|
203
|
-
log_info "Scanning for hardcoded secrets..."
|
|
204
|
-
|
|
205
|
-
local violations=0
|
|
206
|
-
|
|
207
|
-
# Define patterns to search for
|
|
208
|
-
local patterns=(
|
|
209
|
-
'password\s*=\s*["\047][^"\047]*["\047]'
|
|
210
|
-
'token\s*=\s*["\047][^"\047]*["\047]'
|
|
211
|
-
'secret\s*=\s*["\047][^"\047]*["\047]'
|
|
212
|
-
'key\s*=\s*["\047][^"\047]*["\047]'
|
|
213
|
-
'AKIA[0-9A-Z]{16}' # AWS Access Key
|
|
214
|
-
'ghp_[A-Za-z0-9_]{36}' # GitHub Personal Access Token
|
|
215
|
-
'[0-9a-f]{32,64}' # Potential hash/token
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
# Search in specific file types
|
|
219
|
-
local file_patterns=("*.sh" "*.yml" "*.yaml" "*.toml" "*.json" "*.tmpl")
|
|
220
|
-
|
|
221
|
-
for file_pattern in "${file_patterns[@]}"; do
|
|
222
|
-
while IFS= read -r -d '' file; do
|
|
223
|
-
# Skip the security management files themselves
|
|
224
|
-
if [[ "$file" =~ (environment-template\.env|manage-secrets\.sh|\.env\.local) ]]; then
|
|
225
|
-
continue
|
|
226
|
-
fi
|
|
227
|
-
|
|
228
|
-
for pattern in "${patterns[@]}"; do
|
|
229
|
-
if grep -H -n -E -i "$pattern" "$file" 2>/dev/null; then
|
|
230
|
-
log_warning "Potential secret in $file"
|
|
231
|
-
violations=$((violations + 1))
|
|
232
|
-
fi
|
|
233
|
-
done
|
|
234
|
-
done < <(find "$REPO_ROOT" -name "$file_pattern" -not -path "*/.git/*" -print0)
|
|
235
|
-
done
|
|
236
|
-
|
|
237
|
-
if [[ $violations -eq 0 ]]; then
|
|
238
|
-
log_success "No hardcoded secrets detected"
|
|
239
|
-
else
|
|
240
|
-
log_error "Found $violations potential hardcoded secrets"
|
|
241
|
-
log_info "Review the output above and replace with environment variables"
|
|
242
|
-
fi
|
|
243
|
-
|
|
244
|
-
return $violations
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
# Guide for rotating secrets
|
|
248
|
-
rotate_secrets() {
|
|
249
|
-
local service="${1:-}"
|
|
250
|
-
|
|
251
|
-
if [[ -z "$service" ]]; then
|
|
252
|
-
log_info "Available rotation guides:"
|
|
253
|
-
echo " github - GitHub Personal Access Tokens"
|
|
254
|
-
echo " aws - AWS Access Keys"
|
|
255
|
-
echo " gcp - GCP Service Account Keys"
|
|
256
|
-
echo " ssh - SSH Keys"
|
|
257
|
-
echo ""
|
|
258
|
-
echo "Usage: $0 rotate <service>"
|
|
259
|
-
return 0
|
|
260
|
-
fi
|
|
261
|
-
|
|
262
|
-
case "$service" in
|
|
263
|
-
"github")
|
|
264
|
-
cat <<'EOF'
|
|
265
|
-
GitHub Token Rotation Guide:
|
|
266
|
-
|
|
267
|
-
1. Create new Personal Access Token:
|
|
268
|
-
- Go to https://github.com/settings/tokens
|
|
269
|
-
- Click "Generate new token (classic)"
|
|
270
|
-
- Set expiration (90 days recommended)
|
|
271
|
-
- Select minimal required scopes:
|
|
272
|
-
• repo (for private repos)
|
|
273
|
-
• workflow (for GitHub Actions)
|
|
274
|
-
|
|
275
|
-
2. Update environment:
|
|
276
|
-
- Edit .env.local
|
|
277
|
-
- Replace GITHUB_TOKEN value
|
|
278
|
-
- Test with: gh auth status
|
|
279
|
-
|
|
280
|
-
3. Update CI/CD:
|
|
281
|
-
- Go to repository Settings → Secrets and variables → Actions
|
|
282
|
-
- Update GITHUB_TOKEN secret
|
|
283
|
-
|
|
284
|
-
4. Revoke old token:
|
|
285
|
-
- Go back to https://github.com/settings/tokens
|
|
286
|
-
- Find old token and click "Delete"
|
|
287
|
-
|
|
288
|
-
5. Verify:
|
|
289
|
-
- Run: scripts/security/manage-secrets.sh validate
|
|
290
|
-
- Test repository operations
|
|
291
|
-
EOF
|
|
292
|
-
;;
|
|
293
|
-
"aws")
|
|
294
|
-
cat <<'EOF'
|
|
295
|
-
AWS Access Key Rotation Guide:
|
|
296
|
-
|
|
297
|
-
1. Create new access key:
|
|
298
|
-
- AWS Console → IAM → Users → [Your User] → Security credentials
|
|
299
|
-
- Click "Create access key"
|
|
300
|
-
- Download credentials
|
|
301
|
-
|
|
302
|
-
2. Update environment:
|
|
303
|
-
- Edit .env.local
|
|
304
|
-
- Update AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
|
|
305
|
-
- Test with: aws sts get-caller-identity
|
|
306
|
-
|
|
307
|
-
3. Update CI/CD:
|
|
308
|
-
- Update secrets in GitHub repository
|
|
309
|
-
- Test AWS operations in pipeline
|
|
310
|
-
|
|
311
|
-
4. Deactivate old key:
|
|
312
|
-
- In AWS Console, set old key status to "Inactive"
|
|
313
|
-
- Wait 24-48 hours, monitor for issues
|
|
314
|
-
- Delete old key if no issues
|
|
315
|
-
|
|
316
|
-
5. Security best practices:
|
|
317
|
-
- Use IAM roles where possible
|
|
318
|
-
- Implement least privilege access
|
|
319
|
-
- Enable CloudTrail logging
|
|
320
|
-
EOF
|
|
321
|
-
;;
|
|
322
|
-
"ssh")
|
|
323
|
-
cat <<'EOF'
|
|
324
|
-
SSH Key Rotation Guide:
|
|
325
|
-
|
|
326
|
-
1. Generate new SSH key:
|
|
327
|
-
- Run: ssh-keygen -t ed25519 -C "your_email@example.com"
|
|
328
|
-
- Save to new file: ~/.ssh/id_ed25519_new
|
|
329
|
-
|
|
330
|
-
2. Add to SSH agent:
|
|
331
|
-
- Run: ssh-add ~/.ssh/id_ed25519_new
|
|
332
|
-
|
|
333
|
-
3. Update remote services:
|
|
334
|
-
- GitHub: Settings → SSH and GPG keys → Add new key
|
|
335
|
-
- Servers: Add to ~/.ssh/authorized_keys
|
|
336
|
-
|
|
337
|
-
4. Update local config:
|
|
338
|
-
- Edit ~/.ssh/config
|
|
339
|
-
- Update IdentityFile paths
|
|
340
|
-
|
|
341
|
-
5. Test connections:
|
|
342
|
-
- ssh -T git@github.com
|
|
343
|
-
- Test server connections
|
|
344
|
-
|
|
345
|
-
6. Remove old keys:
|
|
346
|
-
- Remove from remote authorized_keys
|
|
347
|
-
- Remove from local ~/.ssh/
|
|
348
|
-
- Remove from SSH agent
|
|
349
|
-
EOF
|
|
350
|
-
;;
|
|
351
|
-
*)
|
|
352
|
-
log_error "Unknown service: $service"
|
|
353
|
-
log_info "Available services: github, aws, gcp, ssh"
|
|
354
|
-
return 1
|
|
355
|
-
;;
|
|
356
|
-
esac
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
# Clean temporary files
|
|
360
|
-
clean_files() {
|
|
361
|
-
log_info "Cleaning temporary files and logs..."
|
|
362
|
-
|
|
363
|
-
local files_to_clean=(
|
|
364
|
-
"${REPO_ROOT}/.security-audit.log"
|
|
365
|
-
"${REPO_ROOT}/security-report.md"
|
|
366
|
-
"${REPO_ROOT}/trivy-results.sarif"
|
|
367
|
-
"${REPO_ROOT}/grype-results.sarif"
|
|
368
|
-
"${REPO_ROOT}/checkov-results.sarif"
|
|
369
|
-
"${REPO_ROOT}/shellcheck-results.sarif"
|
|
370
|
-
"${REPO_ROOT}/container-scan.sarif"
|
|
371
|
-
"${REPO_ROOT}/security-attestation.json"
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
local cleaned=0
|
|
375
|
-
for file in "${files_to_clean[@]}"; do
|
|
376
|
-
if [[ -f "$file" ]]; then
|
|
377
|
-
rm "$file"
|
|
378
|
-
log_success "Removed $file"
|
|
379
|
-
cleaned=$((cleaned + 1))
|
|
380
|
-
fi
|
|
381
|
-
done
|
|
382
|
-
|
|
383
|
-
if [[ $cleaned -eq 0 ]]; then
|
|
384
|
-
log_info "No temporary files to clean"
|
|
385
|
-
else
|
|
386
|
-
log_success "Cleaned $cleaned temporary files"
|
|
387
|
-
fi
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
# Main function
|
|
391
|
-
main() {
|
|
392
|
-
local command="${1:-}"
|
|
393
|
-
shift || true
|
|
394
|
-
|
|
395
|
-
case "$command" in
|
|
396
|
-
"init")
|
|
397
|
-
init_config "$@"
|
|
398
|
-
;;
|
|
399
|
-
"validate")
|
|
400
|
-
validate_config
|
|
401
|
-
;;
|
|
402
|
-
"template")
|
|
403
|
-
show_template
|
|
404
|
-
;;
|
|
405
|
-
"check")
|
|
406
|
-
check_secrets
|
|
407
|
-
;;
|
|
408
|
-
"rotate")
|
|
409
|
-
rotate_secrets "$@"
|
|
410
|
-
;;
|
|
411
|
-
"clean")
|
|
412
|
-
clean_files
|
|
413
|
-
;;
|
|
414
|
-
"-h" | "--help" | "help" | "")
|
|
415
|
-
show_help
|
|
416
|
-
;;
|
|
417
|
-
*)
|
|
418
|
-
log_error "Unknown command: $command"
|
|
419
|
-
echo ""
|
|
420
|
-
show_help
|
|
421
|
-
exit 1
|
|
422
|
-
;;
|
|
423
|
-
esac
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
# Execute if run directly
|
|
427
|
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
428
|
-
main "$@"
|
|
429
|
-
fi
|