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