@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,139 +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
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
-
9
- mode="full"
10
- run_integration=0
11
- min_coverage="${MIN_COVERAGE:-100}"
12
-
13
- platform_name() {
14
- case "$(uname -s)" in
15
- Darwin) echo "macOS" ;;
16
- Linux)
17
- if grep -qi microsoft /proc/version 2>/dev/null; then
18
- echo "WSL"
19
- else
20
- echo "Linux"
21
- fi
22
- ;;
23
- *) echo "Unknown" ;;
24
- esac
25
- }
26
-
27
- usage() {
28
- cat <<'EOF'
29
- Reliability Audit
30
-
31
- Usage:
32
- reliability-audit.sh [--quick] [--unit-only] [--with-integration]
33
-
34
- Options:
35
- --quick Run syntax, unit, coverage, and examples
36
- --unit-only Run syntax, unit, coverage, and examples
37
- --with-integration Include integration tests
38
- EOF
39
- }
40
-
41
- run_step() {
42
- local label="$1"
43
- shift
44
- printf '\n[%s] %s\n' "$(date +%H:%M:%S)" "$label"
45
- "$@"
46
- }
47
-
48
- shell_syntax() {
49
- local failed=0
50
- local file
51
-
52
- while IFS= read -r -d '' file; do
53
- if ! bash -n "$file"; then
54
- failed=$((failed + 1))
55
- fi
56
- done < <(find "$REPO_ROOT" \
57
- \( -path "$REPO_ROOT/.git" -o -path "$REPO_ROOT/.coverage" \) -prune \
58
- -o -type f \( -name "*.sh" -o -name "*.bash" \) -print0)
59
-
60
- if [ "$failed" -ne 0 ]; then
61
- printf 'Syntax failures: %s\n' "$failed" >&2
62
- return 1
63
- fi
64
- }
65
-
66
- unit_tests() {
67
- cd "$REPO_ROOT"
68
- ./tests/framework/test_runner.sh --jobs auto
69
- }
70
-
71
- integration_tests() {
72
- cd "$REPO_ROOT"
73
- ./tests/framework/test_runner.sh --jobs auto --integration-only
74
- }
75
-
76
- coverage_gate() {
77
- cd "$REPO_ROOT"
78
- MIN_COVERAGE="$min_coverage" ./tests/framework/module_coverage.sh
79
- }
80
-
81
- example_gate() {
82
- cd "$REPO_ROOT"
83
- bash ./scripts/qa/validate-examples.sh
84
- }
85
-
86
- docs_coverage_gate() {
87
- cd "$REPO_ROOT"
88
- bash ./scripts/qa/docs-coverage.sh
89
- }
90
-
91
- traceability_gate() {
92
- cd "$REPO_ROOT"
93
- bash ./scripts/qa/traceability-coverage.sh
94
- }
95
-
96
- while [ "$#" -gt 0 ]; do
97
- case "$1" in
98
- --quick)
99
- mode="quick"
100
- ;;
101
- --unit-only)
102
- mode="unit"
103
- ;;
104
- --with-integration)
105
- run_integration=1
106
- ;;
107
- -h | --help)
108
- usage
109
- exit 0
110
- ;;
111
- *)
112
- printf 'Unknown option: %s\n' "$1" >&2
113
- usage >&2
114
- exit 1
115
- ;;
116
- esac
117
- shift
118
- done
119
-
120
- if [ "$mode" = "full" ]; then
121
- run_integration=1
122
- fi
123
-
124
- printf 'Reliability Audit\n'
125
- printf 'Platform: %s\n' "$(platform_name)"
126
- printf 'Executable module-mapping floor: %s%%\n' "$min_coverage"
127
-
128
- run_step "Shell syntax" shell_syntax
129
- run_step "Unit suite" unit_tests
130
- run_step "Executable module mapping" coverage_gate
131
- run_step "Docs coverage" docs_coverage_gate
132
- run_step "Traceability coverage" traceability_gate
133
- run_step "Executable examples" example_gate
134
-
135
- if [ "$run_integration" -eq 1 ]; then
136
- run_step "Integration suite" integration_tests
137
- fi
138
-
139
- printf '\nReliability audit passed.\n'
@@ -1,128 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- #
5
- # Fetch the current OpenSSF Scorecard result and refresh the
6
- # per-check posture table in docs/security/SCORECARD.md.
7
- #
8
- # The narrative sections (open findings, exceptions, closed-this-
9
- # cycle log) are preserved as-is — only the auto-generated
10
- # baseline block between the BEGIN/END markers is rewritten.
11
- #
12
- # Usage:
13
- # scripts/qa/scorecard-snapshot.sh # refresh
14
- # scripts/qa/scorecard-snapshot.sh --check # exit 1 if stale
15
- #
16
- # Exit codes:
17
- # 0 snapshot up-to-date / written
18
- # 1 --check mode and content drifted
19
- # 2 bad usage / Scorecard API unreachable
20
-
21
- set -euo pipefail
22
-
23
- REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
24
- cd "$REPO_ROOT"
25
-
26
- mode="write"
27
- for arg in "$@"; do
28
- case "$arg" in
29
- --check) mode="check" ;;
30
- -h | --help)
31
- sed -n '2,16p' "$0"
32
- exit 0
33
- ;;
34
- *)
35
- echo "unknown flag: $arg" >&2
36
- exit 2
37
- ;;
38
- esac
39
- done
40
-
41
- api='https://api.scorecard.dev/projects/github.com/sebastienrousseau/dotfiles'
42
- target='docs/security/SCORECARD.md'
43
-
44
- [[ -f "$target" ]] || {
45
- echo "target not found: $target" >&2
46
- exit 2
47
- }
48
-
49
- if ! command -v jq >/dev/null 2>&1; then
50
- echo "jq required" >&2
51
- exit 2
52
- fi
53
-
54
- payload="$(curl --proto '=https' --tlsv1.2 -fsSL --connect-timeout 10 --max-time 30 "$api")" || {
55
- echo "Scorecard API unreachable: $api" >&2
56
- exit 2
57
- }
58
-
59
- aggregate="$(printf '%s' "$payload" | jq -r '.score')"
60
- date="$(printf '%s' "$payload" | jq -r '.date')"
61
-
62
- # Build the auto-block: per-check status + score, one row each.
63
- block="$(mktemp)"
64
- trap 'rm -f "$block"' EXIT
65
-
66
- {
67
- printf '<!-- BEGIN scorecard-snapshot (auto-generated, do not edit by hand) -->\n'
68
- printf 'Aggregate score **%s / 10** at %s.\n\n' "$aggregate" "$date"
69
- printf '| Check | Score | Reason |\n'
70
- printf '|---|---:|---|\n'
71
- printf '%s' "$payload" |
72
- jq -r '.checks
73
- | sort_by(.name)
74
- | .[]
75
- | [.name, (.score|tostring), ((.reason // "") | gsub("\\|"; "\\|") | .[0:100])]
76
- | "| " + (. | join(" | ")) + " |"'
77
- # shellcheck disable=SC2016 # backticks here are markdown code-spans, not subshells
78
- printf '\n_Refresh: `scripts/qa/scorecard-snapshot.sh` · Monitoring: `.github/workflows/scorecard.yml`._\n'
79
- printf '<!-- END scorecard-snapshot -->\n'
80
- } >"$block"
81
-
82
- # Splice the block into the target. Find the BEGIN/END markers; if
83
- # they're not yet present, append the block after the "## Live
84
- # score" section header.
85
- out="$(mktemp)"
86
- trap 'rm -f "$block" "$out"' EXIT
87
-
88
- if grep -q '<!-- BEGIN scorecard-snapshot' "$target"; then
89
- awk -v blockfile="$block" '
90
- BEGIN { skip = 0 }
91
- /<!-- BEGIN scorecard-snapshot/ {
92
- skip = 1
93
- while ((getline line < blockfile) > 0) print line
94
- close(blockfile)
95
- next
96
- }
97
- /<!-- END scorecard-snapshot -->/ {
98
- skip = 0
99
- next
100
- }
101
- skip == 0 { print }
102
- ' "$target" >"$out"
103
- else
104
- # First run — inject right after the "## Live score" h2.
105
- awk -v blockfile="$block" '
106
- { print }
107
- /^## Live score$/ && !inserted {
108
- print ""
109
- while ((getline line < blockfile) > 0) print line
110
- close(blockfile)
111
- inserted = 1
112
- }
113
- ' "$target" >"$out"
114
- fi
115
-
116
- if [[ "$mode" == "check" ]]; then
117
- if ! diff -q "$target" "$out" >/dev/null 2>&1; then
118
- echo "SCORECARD.md snapshot is stale (live score: $aggregate)." >&2
119
- diff -u "$target" "$out" | head -50 >&2
120
- exit 1
121
- fi
122
- echo "SCORECARD.md snapshot is in sync (aggregate: $aggregate)"
123
- exit 0
124
- fi
125
-
126
- mv "$out" "$target"
127
- trap - EXIT
128
- echo "Refreshed $target (aggregate: $aggregate as of $date)"
@@ -1,117 +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
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
- TRACE_DOC="$REPO_ROOT/docs/operations/TRACEABILITY.md"
9
- MIN_TRACEABILITY_COVERAGE="${MIN_TRACEABILITY_COVERAGE:-100}"
10
-
11
- TOTAL_TRACE_CHECKS=0
12
- COVERED_TRACE_CHECKS=0
13
-
14
- extract_impl_paths() {
15
- awk '
16
- /^\| BT-/ {
17
- cols = $0
18
- sub(/^\|[[:space:]]*/, "", cols)
19
- sub(/[[:space:]]*\|[[:space:]]*$/, "", cols)
20
- n = split(cols, parts, /\|/)
21
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", parts[3])
22
- split(parts[3], impls, /,/)
23
- for (i in impls) {
24
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", impls[i])
25
- gsub(/`/, "", impls[i])
26
- print impls[i]
27
- }
28
- }
29
- ' "$TRACE_DOC" | sort -u
30
- }
31
-
32
- trim() {
33
- sed 's/^[[:space:]]*//; s/[[:space:]]*$//'
34
- }
35
-
36
- record_trace_check() {
37
- local label="$1"
38
- local target="$2"
39
-
40
- TOTAL_TRACE_CHECKS=$((TOTAL_TRACE_CHECKS + 1))
41
- if [ -e "$target" ]; then
42
- COVERED_TRACE_CHECKS=$((COVERED_TRACE_CHECKS + 1))
43
- else
44
- printf 'Missing traceability target: %s (%s)\n' "$label" "$target" >&2
45
- fi
46
- }
47
-
48
- check_path_list() {
49
- local kind="$1"
50
- local value="$2"
51
- local behavior_id="$3"
52
- local rel=""
53
-
54
- while IFS= read -r rel; do
55
- rel="$(printf '%s' "$rel" | trim)"
56
- [ -n "$rel" ] || continue
57
- rel="${rel#\`}"
58
- rel="${rel%\`}"
59
- record_trace_check "$behavior_id $kind" "$REPO_ROOT/$rel"
60
- done < <(printf '%s\n' "$value" | tr ',' '\n')
61
- }
62
-
63
- report_traceability() {
64
- local pct
65
- pct="$(awk -v c="$COVERED_TRACE_CHECKS" -v t="$TOTAL_TRACE_CHECKS" 'BEGIN{if(t==0){print "0.00"}else{printf "%.2f", (100*c/t)}}')"
66
-
67
- printf 'Traceability coverage: %s/%s (%s%%)\n' "$COVERED_TRACE_CHECKS" "$TOTAL_TRACE_CHECKS" "$pct"
68
- printf 'Threshold: %s%%\n' "$MIN_TRACEABILITY_COVERAGE"
69
-
70
- awk -v p="$pct" -v min="$MIN_TRACEABILITY_COVERAGE" 'BEGIN{exit !(p+0 >= min+0)}'
71
- }
72
-
73
- main() {
74
- local line=""
75
- local cols=""
76
- local behavior_id=""
77
- local impls=""
78
- local tests=""
79
- local docs=""
80
-
81
- while IFS= read -r line; do
82
- case "$line" in
83
- \|\ BT-*)
84
- cols="$(printf '%s\n' "$line" | sed 's/^|//; s/|$//')"
85
- behavior_id="$(printf '%s\n' "$cols" | cut -d'|' -f1 | trim)"
86
- impls="$(printf '%s\n' "$cols" | cut -d'|' -f3 | trim)"
87
- tests="$(printf '%s\n' "$cols" | cut -d'|' -f4 | trim)"
88
- docs="$(printf '%s\n' "$cols" | cut -d'|' -f5 | trim)"
89
-
90
- check_path_list "implementation" "$impls" "$behavior_id"
91
- check_path_list "test" "$tests" "$behavior_id"
92
- check_path_list "doc" "$docs" "$behavior_id"
93
- ;;
94
- esac
95
- done <"$TRACE_DOC"
96
-
97
- while IFS= read -r required; do
98
- [ -n "$required" ] || continue
99
- TOTAL_TRACE_CHECKS=$((TOTAL_TRACE_CHECKS + 1))
100
- if extract_impl_paths | grep -Fxq "$required"; then
101
- COVERED_TRACE_CHECKS=$((COVERED_TRACE_CHECKS + 1))
102
- else
103
- printf 'Missing traceability row for implementation: %s\n' "$required" >&2
104
- fi
105
- done < <(
106
- {
107
- find "$REPO_ROOT/scripts/dot/commands" -maxdepth 1 -type f -name '*.sh' | sed "s#^$REPO_ROOT/##"
108
- find "$REPO_ROOT/scripts/qa" -maxdepth 1 -type f -name '*.sh' | sed "s#^$REPO_ROOT/##"
109
- } | sort -u
110
- )
111
-
112
- report_traceability
113
-
114
- printf 'PASS: core internal behaviors have implementation, test, and documentation traceability at or above the required threshold\n'
115
- }
116
-
117
- main "$@"
@@ -1,27 +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
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
- EXAMPLES_DIR="$REPO_ROOT/examples"
9
-
10
- if [ ! -d "$EXAMPLES_DIR" ]; then
11
- echo "No examples directory found: $EXAMPLES_DIR" >&2
12
- exit 1
13
- fi
14
-
15
- found=0
16
- while IFS= read -r -d '' example; do
17
- found=1
18
- printf 'Running example: %s\n' "$(basename "$example")"
19
- bash "$example"
20
- done < <(find "$EXAMPLES_DIR" -maxdepth 1 -type f -name "*.sh" -print0 | sort -z)
21
-
22
- if [ "$found" -eq 0 ]; then
23
- echo "No executable examples found in $EXAMPLES_DIR" >&2
24
- exit 1
25
- fi
26
-
27
- printf 'Examples passed.\n'
@@ -1,12 +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
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
8
-
9
- cd "$REPO_ROOT"
10
-
11
- bash tests/unit/install/test_os_detection_comprehensive.sh
12
- bash tests/unit/functions/test_platform_detection_behavior.sh
@@ -1,82 +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
- 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: 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: 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: 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"