@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.
- package/CHANGELOG.md +18 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +43 -37
- package/install.sh +76 -10
- package/package.json +7 -7
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/ARCHITECTURE.md +0 -117
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/ECOSYSTEM.md +0 -220
- package/docs/GOLD-STANDARD-AUDIT.md +0 -352
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/MINIMUM-TOOLCHAIN.md +0 -100
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -20
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -475
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -175
- package/docs/manual/concept-index.md +0 -170
- package/docs/manual/index.md +0 -66
- package/docs/migration/README.md +0 -81
- package/docs/migration/from-bare-git-repo.md +0 -156
- package/docs/migration/from-gnu-stow.md +0 -165
- package/docs/migration/from-plain-chezmoi.md +0 -148
- package/docs/migration/from-yadm.md +0 -187
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -44
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/packaging.md +0 -222
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURE-MATRIX.md +0 -646
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -243
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -209
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -165
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/attest-verify.sh +0 -147
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -43
- package/scripts/diagnostics/doctor.sh +0 -797
- package/scripts/diagnostics/drift-dashboard.sh +0 -203
- package/scripts/diagnostics/health.sh +0 -656
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -120
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -212
- package/scripts/dot/commands/agent.sh +0 -535
- package/scripts/dot/commands/agents.sh +0 -352
- package/scripts/dot/commands/ai.sh +0 -600
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -171
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -711
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -438
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -455
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -570
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -200
- package/scripts/nvim/headless-upgrade.lua +0 -81
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -67
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -613
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-feature-matrix.sh +0 -296
- package/scripts/qa/check-version-consistency.sh +0 -12
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -118
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -124
- package/scripts/qa/validate-examples.sh +0 -90
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -552
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -1020
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -603
- package/scripts/theme/switch.sh +0 -476
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/verify-release-versions +0 -156
- package/scripts/version-sync.sh +0 -714
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- 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[@]}"}"
|