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