@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,111 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- #
5
- # scripts/security/check-disclosure-key-expiry.sh
6
- #
7
- # Reads the disclosure public key from `docs/security/security-pubkey.asc`,
8
- # parses its expiry, and exits non-zero when the remaining lifetime is
9
- # below threshold. Closes the R3 audit N2 finding (no automated alert
10
- # for the 2029-05-15 expiry).
11
- #
12
- # Two thresholds:
13
- # --warn-days N Emit a `::warning::` if expiry is < N days away.
14
- # Default 90.
15
- # --fail-days N Exit 1 (CI failure) if expiry is < N days away.
16
- # Default 30.
17
- #
18
- # Usage:
19
- # bash scripts/security/check-disclosure-key-expiry.sh
20
- # bash scripts/security/check-disclosure-key-expiry.sh --warn-days 180 --fail-days 60
21
- #
22
- # Designed to run from `.github/workflows/verify-gpg-wkd.yml` on the
23
- # weekly schedule, and from a maintainer's local pre-release sanity
24
- # check. Does NOT require network — reads the in-repo .asc only.
25
-
26
- set -euo pipefail
27
-
28
- WARN_DAYS=90
29
- FAIL_DAYS=30
30
-
31
- while [[ $# -gt 0 ]]; do
32
- case "$1" in
33
- --warn-days)
34
- WARN_DAYS="$2"
35
- shift 2
36
- ;;
37
- --fail-days)
38
- FAIL_DAYS="$2"
39
- shift 2
40
- ;;
41
- -h | --help)
42
- sed -n '5,25p' "${BASH_SOURCE[0]}"
43
- exit 0
44
- ;;
45
- *)
46
- echo "Unknown arg: $1" >&2
47
- exit 2
48
- ;;
49
- esac
50
- done
51
-
52
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
53
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
54
- ASC="$REPO_ROOT/docs/security/security-pubkey.asc"
55
-
56
- if [[ ! -f "$ASC" ]]; then
57
- echo "::error::no public key at $ASC" >&2
58
- exit 2
59
- fi
60
-
61
- if ! command -v gpg >/dev/null 2>&1; then
62
- echo "::warning::gpg not installed — cannot verify key expiry" >&2
63
- exit 0
64
- fi
65
-
66
- # Import into a throwaway keyring so we don't pollute the user's real one.
67
- GNUPGHOME="$(mktemp -d -t dot-disclosure-key.XXXXXX)"
68
- export GNUPGHOME
69
- chmod 700 "$GNUPGHOME"
70
- trap 'rm -rf "$GNUPGHOME"' EXIT
71
-
72
- # gpg can emit harmless warnings ("keyboxd older than us", "gpg-agent
73
- # IPC failed" in fresh GNUPGHOME, etc.) and exit non-zero under
74
- # `set -e` even when the import itself succeeded. Verify success by
75
- # checking the err log for the literal `imported: N` (N >= 1) line
76
- # rather than trusting gpg's exit code.
77
- gpg --batch --import "$ASC" >/dev/null 2>"$GNUPGHOME/import.err" || true
78
- if ! grep -qE '^gpg:[[:space:]]*imported: [1-9]' "$GNUPGHOME/import.err"; then
79
- echo "::error::gpg import failed for $ASC" >&2
80
- cat "$GNUPGHOME/import.err" >&2
81
- exit 2
82
- fi
83
-
84
- # `--with-colons` field 7 of the `pub:` line is the expiry in Unix
85
- # seconds; 0 means no expiry.
86
- expires=$(gpg --with-colons --fingerprint 2>/dev/null | awk -F: '/^pub:/{print $7; exit}')
87
-
88
- if [[ -z "$expires" || "$expires" == "0" ]]; then
89
- echo "::warning::disclosure key has no expiry — set one per docs/security/KEY_ROTATION.md" >&2
90
- exit 0
91
- fi
92
-
93
- now=$(date -u +%s)
94
- remaining_days=$(((expires - now) / 86400))
95
-
96
- expires_date=$(date -u -r "$expires" '+%Y-%m-%d' 2>/dev/null || date -u -d "@$expires" '+%Y-%m-%d' 2>/dev/null || echo "(date format unknown)")
97
-
98
- echo "Disclosure key expires: $expires_date ($remaining_days days from now)"
99
- echo " warn threshold: $WARN_DAYS days"
100
- echo " fail threshold: $FAIL_DAYS days"
101
-
102
- if ((remaining_days < FAIL_DAYS)); then
103
- echo "::error::Disclosure key expires in $remaining_days days. Rotate now per docs/security/KEY_ROTATION.md." >&2
104
- exit 1
105
- fi
106
-
107
- if ((remaining_days < WARN_DAYS)); then
108
- echo "::warning::Disclosure key expires in $remaining_days days. Schedule rotation per docs/security/KEY_ROTATION.md." >&2
109
- fi
110
-
111
- exit 0
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- # shellcheck source=../../lib/dot/ui.sh
8
- # shellcheck disable=SC1091
9
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
10
- # shellcheck source=../../lib/dot/platform.sh
11
- # shellcheck disable=SC1091
12
- source "$SCRIPT_DIR/../../lib/dot/platform.sh"
13
-
14
- DRY_RUN=0
15
- for arg in "$@"; do
16
- case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
17
- done
18
- _run_cmd() {
19
- if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
20
- }
21
-
22
- ui_init
23
- ui_header "DNS-over-HTTPS"
24
-
25
- if [[ "$DRY_RUN" -eq 1 ]]; then
26
- ui_info "Mode" "dry-run (no changes will be made)"
27
- elif [ "${DOTFILES_DOH:-}" != "1" ]; then
28
- ui_warn "DoH" "disabled by default"
29
- ui_info "Re-run" "DOTFILES_DOH=1"
30
- exit 1
31
- fi
32
-
33
- case "$(dot_platform_id)" in
34
- linux | wsl)
35
- if command -v resolvectl >/dev/null; then
36
- ui_info "Enabling" "systemd-resolved DoH (Cloudflare)"
37
- _run_cmd sudo resolvectl dns-over-https on
38
- _run_cmd sudo resolvectl dns 1.1.1.1 1.0.0.1
39
- else
40
- ui_err "systemd-resolved" "not detected"
41
- exit 1
42
- fi
43
- ;;
44
- macos)
45
- ui_info "Configure" "DoH in your browser"
46
- exit 0
47
- ;;
48
- *)
49
- ui_err "Unsupported OS" "DoH config"
50
- exit 1
51
- ;;
52
- esac
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- # shellcheck source=../../lib/dot/ui.sh
8
- # shellcheck disable=SC1091
9
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
10
- # shellcheck source=../../lib/dot/platform.sh
11
- # shellcheck disable=SC1091
12
- source "$SCRIPT_DIR/../../lib/dot/platform.sh"
13
-
14
- ui_init
15
- ui_header "Encryption Check"
16
-
17
- case "$(dot_platform_id)" in
18
- macos)
19
- if command -v fdesetup >/dev/null; then
20
- status=$(fdesetup status || true)
21
- echo "$status"
22
- echo "$status" | grep -qi "FileVault is On" && {
23
- ui_ok "FileVault" "On"
24
- exit 0
25
- }
26
- ui_warn "FileVault" "appears to be off"
27
- exit 1
28
- else
29
- ui_err "fdesetup" "not found"
30
- exit 1
31
- fi
32
- ;;
33
- linux | wsl)
34
- if command -v lsblk >/dev/null; then
35
- lsblk_output=$(lsblk -f)
36
- if command -v rg >/dev/null; then
37
- if echo "$lsblk_output" | rg -i "crypto|luks" >/dev/null; then
38
- ui_ok "LUKS" "encrypted block device detected"
39
- exit 0
40
- fi
41
- else
42
- if echo "$lsblk_output" | grep -Ei "crypto|luks" >/dev/null; then
43
- ui_ok "LUKS" "encrypted block device detected"
44
- exit 0
45
- fi
46
- fi
47
- ui_warn "LUKS" "no crypto volume detected"
48
- exit 1
49
- fi
50
- ;;
51
- *)
52
- ui_err "Unsupported OS" "encryption check"
53
- exit 1
54
- ;;
55
- esac
@@ -1,335 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Security Policy Enforcement Script
5
- # This script enforces security policies across the dotfiles repository
6
-
7
- set -euo pipefail
8
-
9
- # Script configuration
10
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
- readonly SCRIPT_DIR
12
- REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
13
- readonly REPO_ROOT
14
- readonly POLICIES_DIR="${REPO_ROOT}/.github/security-policies"
15
- readonly LOG_FILE="${REPO_ROOT}/.security-audit.log"
16
-
17
- # shellcheck source=../../lib/dot/ui.sh
18
- # shellcheck disable=SC1091
19
- source "${SCRIPT_DIR}/../../lib/dot/ui.sh"
20
- ui_init
21
-
22
- # Logging function (also writes to log file)
23
- log() {
24
- local level="$1"
25
- shift
26
- local message="$*"
27
- local timestamp
28
- timestamp=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
29
- echo "[${timestamp}] [${level}] ${message}" | tee -a "${LOG_FILE}"
30
- }
31
-
32
- # Error handling
33
- error_exit() {
34
- log "ERROR" "$1"
35
- exit 1
36
- }
37
-
38
- # Check if required tools are installed
39
- check_dependencies() {
40
- log "INFO" "Checking dependencies..."
41
-
42
- local missing_tools=()
43
-
44
- # Required tools
45
- local tools=("opa" "gitleaks" "shellcheck" "grep" "find")
46
-
47
- for tool in "${tools[@]}"; do
48
- if ! command -v "$tool" &>/dev/null; then
49
- missing_tools+=("$tool")
50
- fi
51
- done
52
-
53
- if [[ ${#missing_tools[@]} -gt 0 ]]; then
54
- error_exit "Missing required tools: ${missing_tools[*]}"
55
- fi
56
-
57
- log "INFO" "All dependencies satisfied"
58
- }
59
-
60
- # Scan for hardcoded secrets
61
- scan_secrets() {
62
- log "INFO" "Scanning for hardcoded secrets..."
63
-
64
- local violations=0
65
-
66
- # Run gitleaks
67
- if gitleaks detect --source="${REPO_ROOT}" --config="${REPO_ROOT}/config/gitleaks.toml" --no-git >/dev/null 2>&1; then
68
- log "INFO" "✅ No secrets detected by gitleaks"
69
- else
70
- log "WARN" "❌ Potential secrets detected by gitleaks"
71
- violations=$((violations + 1))
72
- fi
73
-
74
- # Manual pattern checks
75
- local secret_patterns=(
76
- 'password\s*=\s*["\047][^"\047]*["\047]'
77
- 'token\s*=\s*["\047][^"\047]*["\047]'
78
- 'secret\s*=\s*["\047][^"\047]*["\047]'
79
- 'key\s*=\s*["\047][^"\047]*["\047]'
80
- 'AKIA[0-9A-Z]{16}' # AWS Access Key
81
- '[0-9a-f]{32,}' # Potential hash/token
82
- )
83
-
84
- for pattern in "${secret_patterns[@]}"; do
85
- if grep -r -E -i "${pattern}" "${REPO_ROOT}" \
86
- --exclude-dir=".git" \
87
- --exclude="*.log" \
88
- --exclude="enforce-policies.sh" \
89
- --exclude="environment-template.env" >/dev/null 2>&1; then
90
- log "WARN" "❌ Potential hardcoded credential pattern found: ${pattern}"
91
- violations=$((violations + 1))
92
- fi
93
- done
94
-
95
- if [[ $violations -eq 0 ]]; then
96
- log "INFO" "✅ No hardcoded secrets detected"
97
- fi
98
-
99
- return $violations
100
- }
101
-
102
- # Check file permissions
103
- check_file_permissions() {
104
- log "INFO" "Checking file permissions..."
105
-
106
- local violations=0
107
-
108
- # Check for overly permissive files
109
- while IFS= read -r -d '' file; do
110
- if [[ -f "$file" ]]; then
111
- local perms
112
- perms=$(stat -c %a "$file" 2>/dev/null || stat -f %OLp "$file")
113
- if [[ $perms -gt 755 ]]; then
114
- log "WARN" "❌ Overly permissive file: ${file} (${perms})"
115
- violations=$((violations + 1))
116
- fi
117
- fi
118
- done < <(find "${REPO_ROOT}" -type f -not -path "*/.git/*" -print0)
119
-
120
- # Check for executable text files
121
- local text_extensions=("md" "txt" "json" "yaml" "yml" "toml")
122
-
123
- for ext in "${text_extensions[@]}"; do
124
- while IFS= read -r -d '' file; do
125
- if [[ -x "$file" ]]; then
126
- log "WARN" "❌ Executable text file: ${file}"
127
- violations=$((violations + 1))
128
- fi
129
- done < <(find "${REPO_ROOT}" -name "*.${ext}" -executable -not -path "*/.git/*" -print0)
130
- done
131
-
132
- if [[ $violations -eq 0 ]]; then
133
- log "INFO" "✅ File permissions are appropriate"
134
- fi
135
-
136
- return $violations
137
- }
138
-
139
- # Validate shell scripts
140
- validate_shell_scripts() {
141
- log "INFO" "Validating shell scripts..."
142
-
143
- local violations=0
144
-
145
- while IFS= read -r -d '' script; do
146
- if ! shellcheck "$script" >/dev/null 2>&1; then
147
- log "WARN" "❌ ShellCheck violations in: ${script}"
148
- violations=$((violations + 1))
149
- fi
150
- done < <(find "${REPO_ROOT}" -name "*.sh" -not -path "*/.git/*" -print0)
151
-
152
- if [[ $violations -eq 0 ]]; then
153
- log "INFO" "✅ All shell scripts pass validation"
154
- fi
155
-
156
- return $violations
157
- }
158
-
159
- # Check environment variable usage
160
- check_environment_variables() {
161
- log "INFO" "Checking environment variable usage..."
162
-
163
- local violations=0
164
-
165
- # Look for unprotected variable assignments
166
- while IFS= read -r -d '' file; do
167
- # Skip binary files and specific files
168
- if file "$file" | grep -q "text" && [[ ! "$file" =~ \.(log|env)$ ]]; then
169
- # Check for variables that should use default patterns
170
- if grep -E '^[A-Z_]+=.+$' "$file" >/dev/null 2>&1; then
171
- # Check if they use proper defaulting
172
- if ! grep -E '\$\{[A-Z_]+:-[^}]*\}' "$file" >/dev/null 2>&1; then
173
- local suspicious_vars
174
- suspicious_vars=$(grep -E '^[A-Z_]+=.+$' "$file" | head -3)
175
- if [[ -n "$suspicious_vars" ]]; then
176
- log "WARN" "❌ Potential hardcoded variables in ${file}: ${suspicious_vars}"
177
- violations=$((violations + 1))
178
- fi
179
- fi
180
- fi
181
- fi
182
- done < <(find "${REPO_ROOT}" -type f -not -path "*/.git/*" -not -path "*/.github/security-policies/*" -print0)
183
-
184
- if [[ $violations -eq 0 ]]; then
185
- log "INFO" "✅ Environment variable usage is appropriate"
186
- fi
187
-
188
- return $violations
189
- }
190
-
191
- # Validate OPA policies
192
- validate_policies() {
193
- log "INFO" "Validating OPA policies..."
194
-
195
- if [[ ! -f "${POLICIES_DIR}/security.rego" ]]; then
196
- log "WARN" "❌ Security policy file not found"
197
- return 1
198
- fi
199
-
200
- if opa test "${POLICIES_DIR}" >/dev/null 2>&1; then
201
- log "INFO" "✅ OPA policies are valid"
202
- return 0
203
- else
204
- log "WARN" "❌ OPA policy validation failed"
205
- return 1
206
- fi
207
- }
208
-
209
- # Check for sensitive files
210
- check_sensitive_files() {
211
- log "INFO" "Checking for sensitive files..."
212
-
213
- local violations=0
214
- local sensitive_patterns=(
215
- "*.key"
216
- "*.pem"
217
- "*.p12"
218
- "*.pfx"
219
- "*.jks"
220
- "*.keystore"
221
- ".env"
222
- ".env.*"
223
- "credentials.json"
224
- "service-account.json"
225
- "id_rsa"
226
- "id_dsa"
227
- "id_ecdsa"
228
- "id_ed25519"
229
- )
230
-
231
- for pattern in "${sensitive_patterns[@]}"; do
232
- while IFS= read -r -d '' file; do
233
- # Skip allowed files
234
- if [[ ! "$file" =~ (environment-template\.env|\.pub$) ]]; then
235
- log "WARN" "❌ Sensitive file detected: ${file}"
236
- violations=$((violations + 1))
237
- fi
238
- done < <(find "${REPO_ROOT}" -name "${pattern}" -not -path "*/.git/*" -print0)
239
- done
240
-
241
- if [[ $violations -eq 0 ]]; then
242
- log "INFO" "✅ No sensitive files detected"
243
- fi
244
-
245
- return $violations
246
- }
247
-
248
- # Generate security report
249
- generate_report() {
250
- local total_violations="$1"
251
- local report_file="${REPO_ROOT}/security-report.md"
252
-
253
- log "INFO" "Generating security report..."
254
-
255
- cat >"${report_file}" <<EOF
256
- # Security Policy Enforcement Report
257
-
258
- **Generated:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')
259
- **Repository:** $(basename "${REPO_ROOT}")
260
- **Total Violations:** ${total_violations}
261
-
262
- ## Security Checks Performed
263
-
264
- - ✅ Secrets scanning (gitleaks + manual patterns)
265
- - ✅ File permissions validation
266
- - ✅ Shell script analysis (shellcheck)
267
- - ✅ Environment variable usage check
268
- - ✅ OPA policy validation
269
- - ✅ Sensitive files detection
270
-
271
- ## Security Score
272
-
273
- $(if [[ $total_violations -eq 0 ]]; then echo "🟢 **PASSED** - No security violations detected"; else echo "🔴 **FAILED** - ${total_violations} violations detected"; fi)
274
-
275
- ## Recommendations
276
-
277
- 1. Review any flagged violations in the audit log
278
- 2. Update hardcoded values to use environment variables
279
- 3. Ensure proper file permissions (644 for files, 755 for executables)
280
- 4. Use the provided environment template for configuration
281
- 5. Run this script regularly as part of your development workflow
282
-
283
- ## Next Steps
284
-
285
- - Fix any identified violations
286
- - Run \`scripts/security/enforce-policies.sh\` again to verify fixes
287
- - Consider setting up automated policy enforcement in CI/CD
288
-
289
- ---
290
- *This report was generated by the automated security policy enforcement system.*
291
- EOF
292
-
293
- log "INFO" "Security report generated: ${report_file}"
294
- }
295
-
296
- # Main execution
297
- main() {
298
- log "INFO" "Starting security policy enforcement..."
299
-
300
- # Initialize log file
301
- echo "# Security Audit Log - $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >"${LOG_FILE}"
302
-
303
- check_dependencies
304
-
305
- local total_violations=0
306
-
307
- # Run all checks
308
- scan_secrets || total_violations=$((total_violations + $?))
309
- check_file_permissions || total_violations=$((total_violations + $?))
310
- validate_shell_scripts || total_violations=$((total_violations + $?))
311
- check_environment_variables || total_violations=$((total_violations + $?))
312
- validate_policies || total_violations=$((total_violations + 1))
313
- check_sensitive_files || total_violations=$((total_violations + $?))
314
-
315
- # Generate report
316
- generate_report "$total_violations"
317
-
318
- # Final result
319
- if [[ $total_violations -eq 0 ]]; then
320
- ui_ok "All security checks passed"
321
- log "INFO" "Security policy enforcement completed successfully"
322
- exit 0
323
- else
324
- ui_err "$total_violations violations" "Security policy enforcement failed"
325
- ui_warn "Details" "Check ${LOG_FILE}"
326
- ui_warn "Report" "Review security-report.md"
327
- log "ERROR" "Security policy enforcement failed with ${total_violations} violations"
328
- exit 1
329
- fi
330
- }
331
-
332
- # Script entry point
333
- if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
334
- main "$@"
335
- fi
@@ -1,91 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- ## Configure system firewall with secure defaults.
5
- ##
6
- ## Enables firewall with deny-by-default policy and minimal exceptions.
7
- ## Requires explicit opt-in via DOTFILES_FIREWALL=1 to prevent accidental
8
- ## lockouts.
9
- ##
10
- ## # Usage
11
- ## DOTFILES_FIREWALL=1 dot firewall
12
- ##
13
- ## # Dependencies
14
- ## - macOS: socketfilterfw (built-in)
15
- ## - Linux: ufw (Uncomplicated Firewall)
16
- ##
17
- ## # Platform Notes
18
- ## ### Platform: macOS
19
- ## - Enables Application Firewall via socketfilterfw
20
- ## - Enables stealth mode (no ICMP responses)
21
- ## - Allows signed applications
22
- ##
23
- ## ### Platform: Linux
24
- ## - Configures UFW with deny incoming / allow outgoing
25
- ## - Allows OpenSSH to prevent lockout
26
- ## - Requires ufw package installed
27
- ##
28
- ## # Security
29
- ## **Requires sudo.** All changes logged to dotfiles.log.
30
- ##
31
- ## # Side Effects
32
- ## - Modifies system firewall rules
33
- ## - May block existing connections
34
- ##
35
- ## # Idempotency
36
- ## Safe to run repeatedly. Applies same rules each time.
37
-
38
- set -euo pipefail
39
-
40
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
41
- # shellcheck source=../../lib/dot/ui.sh
42
- # shellcheck disable=SC1091
43
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
44
- # shellcheck source=../../lib/dot/platform.sh
45
- # shellcheck disable=SC1091
46
- source "$SCRIPT_DIR/../../lib/dot/platform.sh"
47
-
48
- DRY_RUN=0
49
- for arg in "$@"; do
50
- case "$arg" in --dry-run | -n) DRY_RUN=1 ;; esac
51
- done
52
- _run_cmd() {
53
- if [[ "$DRY_RUN" -eq 1 ]]; then ui_info "[dry-run]" "$*"; else "$@"; fi
54
- }
55
-
56
- ui_init
57
- ui_header "Firewall"
58
-
59
- if [[ "$DRY_RUN" -eq 1 ]]; then
60
- ui_info "Mode" "dry-run (no changes will be made)"
61
- elif [ "${DOTFILES_FIREWALL:-}" != "1" ]; then
62
- ui_warn "Firewall" "disabled by default"
63
- ui_info "Re-run" "DOTFILES_FIREWALL=1"
64
- exit 1
65
- fi
66
-
67
- case "$(dot_platform_id)" in
68
- macos)
69
- ui_info "Enabling" "macOS firewall"
70
- _run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
71
- _run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on
72
- _run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp on
73
- _run_cmd sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
74
- ;;
75
- linux | wsl)
76
- if command -v ufw >/dev/null; then
77
- ui_info "Enabling" "UFW"
78
- _run_cmd sudo ufw default deny incoming
79
- _run_cmd sudo ufw default allow outgoing
80
- _run_cmd sudo ufw allow OpenSSH
81
- _run_cmd sudo ufw --force enable
82
- else
83
- ui_err "ufw" "not installed; re-run after install"
84
- exit 1
85
- fi
86
- ;;
87
- *)
88
- ui_err "Unsupported OS" "firewall setup"
89
- exit 1
90
- ;;
91
- esac