@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,147 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- ## Verify workstation attestation evidence with the WebAssembly verifier.
5
- ##
6
- ## Runs `lib/wasm-tools` built for `wasm32-wasip1` under `wasmtime` and feeds
7
- ## it an evidence record on stdin. The module has no filesystem, no network
8
- ## and no environment: it reads the document, applies the policy and writes a
9
- ## verdict. Nothing about the verdict depends on the tools installed on the
10
- ## machine under review — which is the point, since that machine is the one
11
- ## making the claims.
12
- ##
13
- ## Usage: dot attest --verify [--json|-j] [--max-age SECS] [FILE]
14
- ## dot attest --json | bash scripts/diagnostics/attest-verify.sh
15
- ##
16
- ## Exit codes: 0 every check passed, 1 a check failed, 2 the evidence or the
17
- ## toolchain was unusable.
18
-
19
- set -euo pipefail
20
-
21
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
23
- export REPO_ROOT
24
-
25
- # shellcheck source=../../lib/dot/ui.sh
26
- # shellcheck disable=SC1091
27
- source "$SCRIPT_DIR/../../lib/dot/ui.sh"
28
-
29
- CRATE_DIR="$REPO_ROOT/lib/wasm-tools"
30
- WASM_TARGET="wasm32-wasip1"
31
- DEFAULT_MODULE="$CRATE_DIR/target/$WASM_TARGET/release/dot-sys.wasm"
32
-
33
- JSON_MODE=0
34
- MAX_AGE=""
35
- EVIDENCE_FILE=""
36
- while [[ $# -gt 0 ]]; do
37
- case "$1" in
38
- --json | -j)
39
- JSON_MODE=1
40
- shift
41
- ;;
42
- --max-age | -a)
43
- MAX_AGE="${2:-}"
44
- shift 2
45
- ;;
46
- --verify | -V)
47
- # Accepted so the flag can be forwarded verbatim from `dot attest`.
48
- shift
49
- ;;
50
- --help | -h)
51
- cat <<'USAGE'
52
- Usage: dot attest --verify [--json|-j] [--max-age SECS] [FILE]
53
-
54
- Runs the wasm32-wasip1 build of lib/wasm-tools under wasmtime and checks an
55
- evidence record against the workstation policy. Reads FILE, or stdin, or a
56
- fresh `dot attest --json` when given neither.
57
-
58
- --json, -j emit the machine-readable verdict
59
- --max-age SECS freshness window for `generated_at` (`any` to lift it)
60
- --help, -h print this text
61
-
62
- Exit codes: 0 every check passed, 1 a check failed, 2 unusable input or
63
- toolchain.
64
- USAGE
65
- exit 0
66
- ;;
67
- --)
68
- shift
69
- break
70
- ;;
71
- -*)
72
- echo "attest-verify: unknown option $1" >&2
73
- exit 2
74
- ;;
75
- *)
76
- EVIDENCE_FILE="$1"
77
- shift
78
- ;;
79
- esac
80
- done
81
-
82
- # Resolve the WebAssembly runtime. `wasmtime` is pinned in mise.toml, shipped
83
- # by flake.nix and the Brewfile, and checked by `dot doctor`.
84
- WASMTIME_BIN="${WASMTIME:-wasmtime}"
85
- if ! command -v "$WASMTIME_BIN" >/dev/null 2>&1; then
86
- echo "attest-verify: no WebAssembly runtime found (looked for '$WASMTIME_BIN')." >&2
87
- echo "attest-verify: install it with 'mise install wasmtime' or set WASMTIME." >&2
88
- exit 2
89
- fi
90
-
91
- # Resolve the module, building it on demand when a Rust toolchain is present.
92
- MODULE="${DOT_SYS_WASM:-$DEFAULT_MODULE}"
93
- if [[ ! -f "$MODULE" ]]; then
94
- if [[ -n "${DOT_SYS_WASM:-}" ]]; then
95
- echo "attest-verify: DOT_SYS_WASM points at a missing file: $MODULE" >&2
96
- exit 2
97
- fi
98
- if ! command -v cargo >/dev/null 2>&1; then
99
- echo "attest-verify: no verifier at $MODULE and no cargo to build one." >&2
100
- echo "attest-verify: build it with:" >&2
101
- echo " cargo build --release --target $WASM_TARGET --manifest-path lib/wasm-tools/Cargo.toml" >&2
102
- exit 2
103
- fi
104
- echo "attest-verify: building the verifier for $WASM_TARGET ..." >&2
105
- cargo build --quiet --release --target "$WASM_TARGET" \
106
- --manifest-path "$CRATE_DIR/Cargo.toml" --bin dot-sys >&2
107
- fi
108
-
109
- # Collect the evidence: an explicit file, a pipe, or a fresh attestation.
110
- evidence=""
111
- if [[ -n "$EVIDENCE_FILE" ]]; then
112
- if [[ ! -f "$EVIDENCE_FILE" ]]; then
113
- echo "attest-verify: no such evidence file: $EVIDENCE_FILE" >&2
114
- exit 2
115
- fi
116
- evidence="$(cat "$EVIDENCE_FILE")"
117
- elif [[ ! -t 0 ]]; then
118
- evidence="$(cat)"
119
- else
120
- evidence="$(bash "$SCRIPT_DIR/workstation-attestation.sh" --json)"
121
- fi
122
-
123
- module_args=(verify)
124
- [[ "$JSON_MODE" -eq 1 ]] && module_args+=(--json)
125
- [[ -n "$MAX_AGE" ]] && module_args+=(--max-age "$MAX_AGE")
126
-
127
- set +e
128
- verdict="$(printf '%s' "$evidence" | "$WASMTIME_BIN" run "$MODULE" "${module_args[@]}")"
129
- status=$?
130
- set -e
131
-
132
- if [[ "$JSON_MODE" -eq 1 ]]; then
133
- printf '%s\n' "$verdict"
134
- exit "$status"
135
- fi
136
-
137
- ui_init
138
- ui_dot_banner "Diagnostics"
139
- ui_header "Attestation Verification"
140
- printf '%s\n' "$verdict"
141
- if [[ "$status" -eq 0 ]]; then
142
- ui_ok "Verdict" "every check passed"
143
- else
144
- ui_err "Verdict" "see the failed checks above"
145
- fi
146
- ui_info "Verifier" "$MODULE (wasm32-wasip1, $("$WASMTIME_BIN" --version | head -n 1))"
147
- exit "$status"
@@ -1,408 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR 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: Apache-2.0 OR 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,43 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR 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
- # scripts/ops/health-check.sh has never existed in this tree, so
24
- # `dot doctor --audit` died with "Script not found" for every user who
25
- # tried it. The health dashboard is what that name meant: it is the
26
- # audit-shaped diagnostic, and `dot health-check` already aliases it.
27
- --audit | -a) target="scripts/diagnostics/health.sh" ;;
28
- --score | -s) target="scripts/diagnostics/scorecard.sh" ;;
29
- --smoke | -m) target="scripts/diagnostics/smoke-test.sh" ;;
30
- --drift | -d) target="scripts/diagnostics/drift-dashboard.sh" ;;
31
- --benchmark | -b) target="tests/benchmark.sh" ;;
32
- --json | -j | --ai | -A) passthrough+=("$arg") ;;
33
- *) passthrough+=("$arg") ;;
34
- esac
35
- done
36
-
37
- script="$REPO_ROOT/$target"
38
- if [[ ! -f "$script" ]]; then
39
- ui_err "Script not found" "$target"
40
- exit 1
41
- fi
42
-
43
- exec bash "$script" "${passthrough[@]+"${passthrough[@]}"}"