@sebastienrousseau/dotfiles 0.2.519 → 0.2.521

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