@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,408 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- ## Shell Performance Benchmark.
5
- ##
6
- ## Measures shell startup time with per-component profiling. Uses hyperfine
7
- ## for statistical accuracy or falls back to basic timing. Tracks history
8
- ## for regression detection.
9
- ##
10
- ## # Usage
11
- ## dot benchmark # Basic startup timing
12
- ## dot benchmark --detailed # Per-component breakdown
13
- ## dot benchmark --profile # zprof analysis
14
- ## dot benchmark --compare # Compare with history
15
- ## dot benchmark --waterfall # ASCII waterfall chart of component timings
16
- ##
17
- ## # Dependencies
18
- ## - python3: Millisecond timing (required)
19
- ## - hyperfine: Statistical benchmarking (optional, falls back to basic)
20
- ## - jq: JSON parsing for results (optional)
21
- ## - zsh: Target shell (required)
22
- ##
23
- ## # Metrics
24
- ## | Rating | Threshold | Description |
25
- ## |--------|-----------|-------------|
26
- ## | Excellent | <100ms | Instant response |
27
- ## | Good | <200ms | Responsive |
28
- ## | Acceptable | <500ms | Noticeable delay |
29
- ## | Slow | >500ms | Optimization needed |
30
- ##
31
- ## # Platform Notes
32
- ## - macOS: Full support
33
- ## - Linux: Full support
34
- ## - WSL: May show higher times due to filesystem overhead
35
- ##
36
- ## # Output Files
37
- ## Benchmarks saved to ~/.local/share/dotfiles/benchmarks/
38
- ##
39
- ## # Idempotency
40
- ## Safe to run repeatedly. Creates timestamped history files.
41
-
42
- set -euo pipefail
43
-
44
- _cleanup_files=()
45
- trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
46
-
47
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
48
- # shellcheck source=../../lib/dot/ui.sh
49
- # shellcheck disable=SC1091
50
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
51
- # shellcheck source=../../lib/dot/log.sh
52
- # shellcheck disable=SC1091
53
- source "$SCRIPT_DIR/../../lib/dot/log.sh"
54
- export DOT_COMMAND="benchmark"
55
-
56
- BENCHMARK_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/benchmarks"
57
- mkdir -p "$BENCHMARK_DIR"
58
-
59
- usage() {
60
- cat <<'EOF'
61
- Usage: dot benchmark [--detailed] [--profile] [--compare] [--waterfall]
62
-
63
- Options:
64
- -d, --detailed Show per-component timing before the benchmark
65
- -p, --profile Run zsh zprof analysis
66
- -c, --compare Compare recent benchmark history
67
- -w, --waterfall Show an ASCII component waterfall
68
- -h, --help Show this help
69
- EOF
70
- }
71
-
72
- # Parse arguments
73
- DETAILED=false
74
- PROFILE=false
75
- COMPARE=false
76
- WATERFALL=false
77
- while [[ $# -gt 0 ]]; do
78
- case "$1" in
79
- --detailed | -d)
80
- DETAILED=true
81
- shift
82
- ;;
83
- --profile | -p)
84
- PROFILE=true
85
- shift
86
- ;;
87
- --compare | -c)
88
- COMPARE=true
89
- shift
90
- ;;
91
- --waterfall | -w)
92
- WATERFALL=true
93
- shift
94
- ;;
95
- --help | -h)
96
- usage
97
- exit 0
98
- ;;
99
- *)
100
- printf 'Unknown option: %s\n' "$1" >&2
101
- usage >&2
102
- exit 2
103
- ;;
104
- esac
105
- done
106
-
107
- ui_init
108
- GREEN="${GREEN:-}"
109
- YELLOW="${YELLOW:-}"
110
- RED="${RED:-}"
111
- CYAN="${CYAN:-}"
112
- NC="${NC:-}"
113
-
114
- print_header() {
115
- echo ""
116
- ui_dot_banner "Diagnostics"
117
- ui_header "Shell Performance Benchmark"
118
- echo ""
119
- }
120
-
121
- # Basic timing function
122
- time_command() {
123
- local start end
124
- start=$(python3 -c 'import time; print(int(time.time() * 1000))')
125
- eval "$1" >/dev/null 2>&1
126
- end=$(python3 -c 'import time; print(int(time.time() * 1000))')
127
- echo $((end - start))
128
- }
129
-
130
- # Per-component profiling using zprof
131
- run_zsh_profile() {
132
- ui_header "Zsh profiler (zprof)"
133
- echo ""
134
-
135
- zsh -c '
136
- zmodload zsh/zprof
137
- # shellcheck disable=SC1091
138
- source ~/.zshenv 2>/dev/null
139
- # shellcheck disable=SC1091
140
- source ~/.config/zsh/.zshrc 2>/dev/null
141
- zprof
142
- ' 2>/dev/null | head -30
143
- }
144
-
145
- # Benchmark individual components
146
- benchmark_components() {
147
- ui_header "Per-Component Timing"
148
- echo ""
149
- printf "%-35s %8s\n" "Component" "Time (ms)"
150
- echo "───────────────────────────────────────────────"
151
-
152
- # zshenv (bootloader)
153
- local zshenv_time
154
- # shellcheck disable=SC1091
155
- zshenv_time=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
156
- printf "%-35s %8s\n" "zshenv (bootloader)" "${zshenv_time}ms"
157
-
158
- # Core shell options
159
- local options_time
160
- # shellcheck disable=SC1091
161
- options_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
162
- printf "%-35s %8s\n" "rc.d/30-options.zsh" "${options_time}ms"
163
-
164
- # Zinit plugins
165
- local zinit_time
166
- # shellcheck disable=SC1091
167
- zinit_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
168
- printf "%-35s %8s\n" "rc.d/20-zinit.zsh (plugins)" "${zinit_time}ms"
169
-
170
- # Tool initializations
171
- for tool in starship atuin zoxide fzf direnv; do
172
- if command -v "$tool" >/dev/null 2>&1; then
173
- local tool_time
174
- case "$tool" in
175
- starship) tool_time=$(time_command "starship init zsh >/dev/null") ;;
176
- atuin) tool_time=$(time_command "atuin init zsh >/dev/null") ;;
177
- zoxide) tool_time=$(time_command "zoxide init zsh >/dev/null") ;;
178
- fzf) tool_time=$(time_command "true") ;; # FZF sourced from file
179
- direnv) tool_time=$(time_command "direnv hook zsh >/dev/null") ;;
180
- esac
181
- printf "%-35s %8s\n" "$tool init" "${tool_time}ms"
182
- fi
183
- done
184
-
185
- echo "───────────────────────────────────────────────"
186
- }
187
-
188
- # Render ASCII waterfall chart from component timings
189
- render_waterfall() {
190
- ui_header "Startup Waterfall"
191
- echo ""
192
-
193
- local -a names=()
194
- local -a times=()
195
- local total_time=0
196
-
197
- # zshenv
198
- local t
199
- # shellcheck disable=SC1091
200
- t=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
201
- names+=("zshenv (bootloader)")
202
- times+=("$t")
203
- total_time=$((total_time + t))
204
-
205
- # rc.d modules
206
- # shellcheck disable=SC1091
207
- t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
208
- names+=("rc.d/30-options.zsh")
209
- times+=("$t")
210
- total_time=$((total_time + t))
211
-
212
- # shellcheck disable=SC1091
213
- t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
214
- names+=("rc.d/20-zinit (plugins)")
215
- times+=("$t")
216
- total_time=$((total_time + t))
217
-
218
- # Tool inits
219
- for tool in starship atuin zoxide fzf direnv; do
220
- if command -v "$tool" >/dev/null 2>&1; then
221
- case "$tool" in
222
- starship) t=$(time_command "starship init zsh >/dev/null") ;;
223
- atuin) t=$(time_command "atuin init zsh >/dev/null") ;;
224
- zoxide) t=$(time_command "zoxide init zsh >/dev/null") ;;
225
- fzf) t=$(time_command "true") ;;
226
- direnv) t=$(time_command "direnv hook zsh >/dev/null") ;;
227
- esac
228
- names+=("$tool init")
229
- times+=("$t")
230
- total_time=$((total_time + t))
231
- fi
232
- done
233
-
234
- if [[ "$total_time" -eq 0 ]]; then
235
- ui_warn "No timing data" "Could not measure components"
236
- return
237
- fi
238
-
239
- # Render bars
240
- local bar_width=30
241
- local i
242
- for i in "${!names[@]}"; do
243
- local name="${names[$i]}"
244
- local ms="${times[$i]}"
245
- local pct=$((ms * 100 / total_time))
246
- local filled=$((ms * bar_width / total_time))
247
- local empty=$((bar_width - filled))
248
-
249
- local bar=""
250
- local j
251
- for ((j = 0; j < filled; j++)); do bar+="$_GL_BAR_FILL"; done
252
- for ((j = 0; j < empty; j++)); do bar+="$_GL_BAR_EMPTY"; done
253
-
254
- if [[ "$UI_COLOR" = "1" ]]; then
255
- printf " %-22s %s%s%s%s%s %4dms (%2d%%)\n" \
256
- "$name" "$GREEN" "${bar:0:$filled}" "$NORMAL$GRAY" "${bar:$filled}" "$NORMAL" "$ms" "$pct"
257
- else
258
- printf " %-22s %s %4dms (%2d%%)\n" "$name" "$bar" "$ms" "$pct"
259
- fi
260
- done
261
-
262
- echo " ──────────────────────────────────────────────────────────"
263
- printf " %-22s %*s %4dms\n" "Total" "$bar_width" "" "$total_time"
264
- echo ""
265
- }
266
-
267
- # Run hyperfine benchmark
268
- run_hyperfine() {
269
- if ! command -v hyperfine >/dev/null 2>&1; then
270
- if [[ "$UI_ENABLED" = "1" ]]; then
271
- ui_warn "hyperfine" "not installed, using basic timing"
272
- else
273
- printf '%b\n' "${YELLOW}hyperfine not installed. Using basic timing.${NC}"
274
- fi
275
- local times=()
276
- for _ in {1..5}; do
277
- times+=("$(time_command "zsh -i -c exit")")
278
- done
279
- local sum=0
280
- for t in "${times[@]}"; do sum=$((sum + t)); done
281
- if [[ "$UI_ENABLED" = "1" ]]; then
282
- ui_ok "Average startup time" "$((sum / 5))ms"
283
- else
284
- printf '%b\n' "\n${GREEN}Average startup time: $((sum / 5))ms${NC}"
285
- fi
286
- return
287
- fi
288
-
289
- echo ""
290
- ui_header "Running hyperfine benchmark"
291
- echo ""
292
- hyperfine --warmup 3 --runs 10 --shell=none \
293
- --export-json "$BENCHMARK_DIR/latest.json" \
294
- 'zsh -i -c exit'
295
-
296
- # Extract and display results
297
- if [[ -f "$BENCHMARK_DIR/latest.json" ]]; then
298
- local mean_ms
299
- mean_ms=$(jq '.results[0].mean * 1000 | floor' "$BENCHMARK_DIR/latest.json")
300
- local min_ms
301
- min_ms=$(jq '.results[0].min * 1000 | floor' "$BENCHMARK_DIR/latest.json")
302
- local max_ms
303
- max_ms=$(jq '.results[0].max * 1000 | floor' "$BENCHMARK_DIR/latest.json")
304
-
305
- echo ""
306
- ui_header "Results"
307
- if [[ "$UI_ENABLED" = "1" ]]; then
308
- ui_kv "Mean:" "${mean_ms}ms"
309
- ui_kv "Min:" "${min_ms}ms"
310
- ui_kv "Max:" "${max_ms}ms"
311
- else
312
- echo " Mean: ${mean_ms}ms"
313
- echo " Min: ${min_ms}ms"
314
- echo " Max: ${max_ms}ms"
315
- fi
316
-
317
- # Performance rating
318
- if [[ $mean_ms -lt 100 ]]; then
319
- if [[ "$UI_ENABLED" = "1" ]]; then
320
- ui_ok "Performance" "Excellent (<100ms)"
321
- else
322
- printf '%b\n' "\n${GREEN}⚡ Excellent (<100ms)${NC}"
323
- fi
324
- elif [[ $mean_ms -lt 200 ]]; then
325
- if [[ "$UI_ENABLED" = "1" ]]; then
326
- ui_ok "Performance" "Good (<200ms)"
327
- else
328
- printf '%b\n' "\n${GREEN}✓ Good (<200ms)${NC}"
329
- fi
330
- elif [[ $mean_ms -lt 500 ]]; then
331
- if [[ "$UI_ENABLED" = "1" ]]; then
332
- ui_warn "Performance" "Acceptable (<500ms)"
333
- else
334
- printf '%b\n' "\n${YELLOW}⚠ Acceptable (<500ms)${NC}"
335
- fi
336
- else
337
- if [[ "$UI_ENABLED" = "1" ]]; then
338
- ui_err "Performance" "Slow (>500ms)"
339
- else
340
- printf '%b\n' "\n${RED}✗ Slow (>500ms) - optimization needed${NC}"
341
- fi
342
- fi
343
-
344
- # Save with timestamp for history
345
- cp "$BENCHMARK_DIR/latest.json" "$BENCHMARK_DIR/$(date +%Y%m%d_%H%M%S).json"
346
- dot_log info "benchmark_complete" "mean_ms=$mean_ms" "min_ms=$min_ms" "max_ms=$max_ms"
347
- dot_metric "shell_startup_mean" "$mean_ms" "ms"
348
- fi
349
- }
350
-
351
- # Compare with previous benchmarks
352
- compare_benchmarks() {
353
- ui_header "Benchmark History"
354
- echo ""
355
-
356
- local files
357
- files=$(find "$BENCHMARK_DIR" -name "*.json" -type f | sort -r | head -10)
358
-
359
- if [[ -z "$files" ]]; then
360
- echo "No benchmark history found."
361
- return
362
- fi
363
-
364
- printf "%-20s %10s %10s %10s\n" "Date" "Mean" "Min" "Max"
365
- echo "────────────────────────────────────────────────"
366
-
367
- for f in $files; do
368
- local basename
369
- basename=$(basename "$f" .json)
370
- if [[ "$basename" == "latest" ]]; then continue; fi
371
-
372
- local mean min max
373
- mean=$(jq '.results[0].mean * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
374
- min=$(jq '.results[0].min * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
375
- max=$(jq '.results[0].max * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
376
-
377
- printf "%-20s %10sms %10sms %10sms\n" "$basename" "$mean" "$min" "$max"
378
- done
379
- }
380
-
381
- # Main execution
382
- print_header
383
-
384
- if $PROFILE; then
385
- run_zsh_profile
386
- elif $COMPARE; then
387
- compare_benchmarks
388
- elif $WATERFALL; then
389
- render_waterfall
390
- elif $DETAILED; then
391
- benchmark_components
392
- echo ""
393
- run_hyperfine
394
- else
395
- run_hyperfine
396
- fi
397
-
398
- if [[ "$UI_ENABLED" = "1" ]]; then
399
- echo ""
400
- ui_info "Tip" "dot benchmark --detailed"
401
- ui_info "Tip" "dot benchmark --profile"
402
- ui_info "Tip" "dot benchmark --waterfall"
403
- else
404
- printf '%b\n' "\n${CYAN}Tip: Run 'dot benchmark --detailed' for per-component timing${NC}"
405
- printf '%b\n' "${CYAN} Run 'dot benchmark --profile' for zprof analysis${NC}"
406
- printf '%b\n' "${CYAN} Run 'dot benchmark --waterfall' for ASCII waterfall chart${NC}"
407
- fi
408
- printf '%b\n' "${CYAN} Run 'dot benchmark --compare' for history${NC}\n"
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Alias/Command Conflicts Report
5
- # Usage: dot conflicts
6
-
7
- set -euo pipefail
8
-
9
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../../lib/dot/ui.sh
11
- # shellcheck disable=SC1091
12
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
13
-
14
- ui_init
15
-
16
- resolve_source_dir() {
17
- if [[ -n "${CHEZMOI_SOURCE_DIR:-}" && -d "$CHEZMOI_SOURCE_DIR" ]]; then
18
- printf "%s\n" "$CHEZMOI_SOURCE_DIR"
19
- return
20
- fi
21
- if [[ -d "$HOME/.dotfiles" ]]; then
22
- printf "%s\n" "$HOME/.dotfiles"
23
- return
24
- fi
25
- if [[ -d "$HOME/.local/share/chezmoi" ]]; then
26
- printf "%s\n" "$HOME/.local/share/chezmoi"
27
- return
28
- fi
29
- return 1
30
- }
31
-
32
- src_dir=$(resolve_source_dir)
33
- manifest="$src_dir/scripts/diagnostics/aliases-manifest.sh"
34
- if [[ ! -x "$manifest" ]]; then
35
- ui_err "Alias manifest" "not found"
36
- exit 1
37
- fi
38
-
39
- tmp_manifest=$(umask 077 && mktemp)
40
- trap 'rm -f "$tmp_manifest"' EXIT
41
- bash "$manifest" >"$tmp_manifest"
42
-
43
- ui_header "Alias & Command Conflicts"
44
-
45
- ui_section "Duplicate alias definitions"
46
-
47
- dupes=$(awk -F$'\t' '{print $1}' "$tmp_manifest" | sort | uniq -d)
48
- if [[ -z "$dupes" ]]; then
49
- ui_ok "Aliases" "No duplicate alias names"
50
- else
51
- while IFS= read -r name; do
52
- [[ -z "$name" ]] && continue
53
- ui_warn "Alias" "${name} defined multiple times"
54
- awk -F$'\t' -v k="$name" '$1==k {printf " - %s (%s:%s)\n", $2, $3, $4}' "$tmp_manifest"
55
- done <<<"$dupes"
56
- fi
57
-
58
- ui_section "Alias shadows real commands"
59
- shadow_found=false
60
- while IFS=$'\t' read -r name value _; do
61
- if command -v "$name" >/dev/null 2>&1; then
62
- shadow_found=true
63
- ui_warn "Shadow" "${name} -> ${value} (also command)"
64
- fi
65
- done <"$tmp_manifest"
66
-
67
- if ! $shadow_found; then
68
- ui_ok "Shadowing" "No alias shadows detected"
69
- fi
70
-
71
- ui_section "Quick actions"
72
- ui_info "List aliases" "dot aliases list"
73
- ui_info "Regenerate cheatsheet" "dot aliases cheatsheet"
@@ -1,39 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Unified doctor orchestrator — parses flags and dispatches to existing scripts.
5
- set -euo pipefail
6
-
7
- _cleanup_files=()
8
- trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
9
-
10
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
12
- # shellcheck source=../../lib/dot/ui.sh
13
- # shellcheck disable=SC1091
14
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
15
- ui_init
16
-
17
- passthrough=()
18
- target="scripts/diagnostics/doctor.sh"
19
-
20
- for arg in "$@"; do
21
- case "$arg" in
22
- --heal | -H) target="scripts/ops/heal.sh" ;;
23
- --audit | -a) target="scripts/ops/health-check.sh" ;;
24
- --score | -s) target="scripts/diagnostics/scorecard.sh" ;;
25
- --smoke | -m) target="scripts/diagnostics/smoke-test.sh" ;;
26
- --drift | -d) target="scripts/diagnostics/drift-dashboard.sh" ;;
27
- --benchmark | -b) target="tests/benchmark.sh" ;;
28
- --json | -j | --ai | -A) passthrough+=("$arg") ;;
29
- *) passthrough+=("$arg") ;;
30
- esac
31
- done
32
-
33
- script="$REPO_ROOT/$target"
34
- if [[ ! -f "$script" ]]; then
35
- ui_err "Script not found" "$target"
36
- exit 1
37
- fi
38
-
39
- exec bash "$script" "${passthrough[@]+"${passthrough[@]}"}"