@sebastienrousseau/dotfiles 0.2.520 → 0.2.522
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 +52 -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,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-002: Shell Performance Optimization Strategy
|
|
6
|
-
|
|
7
|
-
**Status**: Accepted
|
|
8
|
-
**Date**: 2026-02-09
|
|
9
|
-
**Authors**: @sebastienrousseau
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
Shell startup time directly impacts developer productivity. Every new terminal,
|
|
14
|
-
tmux pane, or shell command execution incurs this cost. With rich shell
|
|
15
|
-
configurations (completions, prompts, plugins), startup can easily exceed 1-2
|
|
16
|
-
seconds.
|
|
17
|
-
|
|
18
|
-
Goals:
|
|
19
|
-
|
|
20
|
-
- Target startup time: <500ms for interactive shells
|
|
21
|
-
- Maintain full functionality (completions, syntax highlighting, git info)
|
|
22
|
-
- Support both zsh and bash
|
|
23
|
-
- Work across macOS and Linux
|
|
24
|
-
|
|
25
|
-
## Decision
|
|
26
|
-
|
|
27
|
-
Implement a **multi-layer performance optimization strategy**:
|
|
28
|
-
|
|
29
|
-
### Layer 1: Compilation and Caching
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# Compile zsh files to .zwc format
|
|
33
|
-
_cached_eval() {
|
|
34
|
-
local cache="$HOME/.cache/zsh/$1.zwc"
|
|
35
|
-
if [[ ! -f "$cache" || "$2" -nt "$cache" ]]; then
|
|
36
|
-
eval "$($2)" > "$cache.tmp"
|
|
37
|
-
zcompile "$cache.tmp" "$cache"
|
|
38
|
-
fi
|
|
39
|
-
source "$cache"
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
- Compile frequently-sourced files to bytecode
|
|
44
|
-
- Cache command output (brew shellenv, mise activate)
|
|
45
|
-
- Invalidate cache when source files change
|
|
46
|
-
|
|
47
|
-
### Layer 2: Lazy Loading
|
|
48
|
-
|
|
49
|
-
Defer loading of heavy components until first use:
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
# Lazy load completions
|
|
53
|
-
function kubectl() {
|
|
54
|
-
unfunction kubectl
|
|
55
|
-
source <(kubectl completion zsh)
|
|
56
|
-
kubectl "$@"
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
- Completions loaded on first command use
|
|
61
|
-
- NVM/RVM loaded only when node/ruby commands invoked
|
|
62
|
-
- Heavy plugins deferred via zinit's `wait` modifier
|
|
63
|
-
|
|
64
|
-
### Layer 3: Zinit Turbo Mode
|
|
65
|
-
|
|
66
|
-
```zsh
|
|
67
|
-
zinit ice wait lucid
|
|
68
|
-
zinit light zsh-users/zsh-autosuggestions
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
- Plugins load asynchronously after prompt
|
|
72
|
-
- Critical plugins (syntax highlighting) load synchronously
|
|
73
|
-
- Most plugins have 0ms impact on startup
|
|
74
|
-
|
|
75
|
-
### Layer 4: Conditional Loading
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Only load if command exists
|
|
79
|
-
[[ -x /opt/homebrew/bin/brew ]] && eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
80
|
-
|
|
81
|
-
# Skip in non-interactive shells
|
|
82
|
-
[[ $- != *i* ]] && return
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
- Platform-specific code guarded by OS detection
|
|
86
|
-
- Heavy features opt-in via environment variables
|
|
87
|
-
- Non-interactive shells get minimal config
|
|
88
|
-
|
|
89
|
-
### Monitoring
|
|
90
|
-
|
|
91
|
-
Benchmark script to track startup time:
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
hyperfine --warmup 3 --runs 10 "zsh -i -c exit"
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
CI enforces 500ms threshold with warnings.
|
|
98
|
-
|
|
99
|
-
## Consequences
|
|
100
|
-
|
|
101
|
-
### Positive
|
|
102
|
-
|
|
103
|
-
- Consistent <500ms startup across platforms
|
|
104
|
-
- Full functionality preserved
|
|
105
|
-
- Easy to add new tools without performance regression
|
|
106
|
-
- Clear patterns for contributors to follow
|
|
107
|
-
|
|
108
|
-
### Negative
|
|
109
|
-
|
|
110
|
-
- First invocation of lazy-loaded commands is slower
|
|
111
|
-
- Cache invalidation bugs can cause stale behavior
|
|
112
|
-
- Complexity in understanding load order
|
|
113
|
-
|
|
114
|
-
### Neutral
|
|
115
|
-
|
|
116
|
-
- Profiling required when adding new plugins
|
|
117
|
-
- Trade-off between convenience and performance explicit
|
|
118
|
-
|
|
119
|
-
## Measurements
|
|
120
|
-
|
|
121
|
-
| Configuration | Startup Time |
|
|
122
|
-
|---------------|--------------|
|
|
123
|
-
| Vanilla zsh | ~50ms |
|
|
124
|
-
| With oh-my-zsh | ~800ms |
|
|
125
|
-
| This approach | ~200-400ms |
|
|
126
|
-
|
|
127
|
-
## References
|
|
128
|
-
|
|
129
|
-
- [Zsh Startup Optimization](https://htr3n.github.io/2018/07/faster-zsh/)
|
|
130
|
-
- [Zinit Turbo Mode](https://zdharma-continuum.github.io/zinit/wiki/INTRODUCTION/)
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-003: Security-First Approach
|
|
6
|
-
|
|
7
|
-
**Status**: Accepted
|
|
8
|
-
**Date**: 2026-02-09
|
|
9
|
-
**Authors**: @sebastienrousseau
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
Dotfiles repositories present unique security challenges:
|
|
14
|
-
|
|
15
|
-
- They configure system behavior and permissions
|
|
16
|
-
- They may contain or reference secrets (API keys, tokens)
|
|
17
|
-
- They execute scripts with user privileges
|
|
18
|
-
- They're often cloned to multiple machines
|
|
19
|
-
|
|
20
|
-
A security breach in dotfiles can compromise all systems using them.
|
|
21
|
-
|
|
22
|
-
## Decision
|
|
23
|
-
|
|
24
|
-
Implement a **defense-in-depth security model** with multiple layers:
|
|
25
|
-
|
|
26
|
-
### Layer 1: Secrets Protection
|
|
27
|
-
|
|
28
|
-
**Never commit secrets:**
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# .gitleaks.toml - block common secret patterns
|
|
32
|
-
[[rules]]
|
|
33
|
-
id = "generic-api-key"
|
|
34
|
-
regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9]{20,})'''
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Encrypted secrets with age:**
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
# Secrets stored encrypted, decrypted at apply time
|
|
41
|
-
chezmoi.encryption = "age"
|
|
42
|
-
chezmoi.age.identity = "~/.config/chezmoi/key.txt"
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**CI enforcement:**
|
|
46
|
-
|
|
47
|
-
- Gitleaks runs on every PR
|
|
48
|
-
- TruffleHog for verified secrets detection
|
|
49
|
-
- Block merge if secrets detected
|
|
50
|
-
|
|
51
|
-
### Layer 2: Input Validation
|
|
52
|
-
|
|
53
|
-
**Path traversal prevention:**
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
# Validate all user inputs
|
|
57
|
-
if [[ ! "$template_lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
58
|
-
die "Invalid template name: $template_lang"
|
|
59
|
-
fi
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Safe file operations:**
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
# Use absolute paths, validate before operations
|
|
66
|
-
local real_path
|
|
67
|
-
real_path="$(realpath -m "$user_input")"
|
|
68
|
-
if [[ "$real_path" != "$allowed_base"/* ]]; then
|
|
69
|
-
die "Path outside allowed directory"
|
|
70
|
-
fi
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Layer 3: Opt-in System Modifications
|
|
74
|
-
|
|
75
|
-
**Dangerous operations require explicit consent:**
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Security scripts are opt-in
|
|
79
|
-
if [ "${DOTFILES_SECURITY:-0}" != "1" ]; then
|
|
80
|
-
echo "Security hardening is opt-in. Set DOTFILES_SECURITY=1 to enable."
|
|
81
|
-
exit 0
|
|
82
|
-
fi
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Comprehensive logging:**
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
# All system modifications logged
|
|
89
|
-
log_security_change() {
|
|
90
|
-
echo "[$(date -Iseconds)] $1" >> "$HOME/.local/share/dotfiles-security.log"
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Layer 4: CI Security Scanning
|
|
95
|
-
|
|
96
|
-
**Multi-tool approach:**
|
|
97
|
-
|
|
98
|
-
- **Gitleaks**: Secrets in git history
|
|
99
|
-
- **Shellcheck**: Shell script vulnerabilities
|
|
100
|
-
- **Checkov**: Infrastructure misconfigurations
|
|
101
|
-
- **Trivy**: Container vulnerabilities (when applicable)
|
|
102
|
-
- **CodeQL**: Static analysis for Python/JavaScript
|
|
103
|
-
|
|
104
|
-
**Weekly deep scans:**
|
|
105
|
-
|
|
106
|
-
```yaml
|
|
107
|
-
schedule:
|
|
108
|
-
- cron: '0 2 * * 0' # Weekly security audit
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Layer 5: Minimal Privileges
|
|
112
|
-
|
|
113
|
-
**Scripts request only needed permissions:**
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
# Don't run as root unless necessary
|
|
117
|
-
if [ "$(id -u)" = "0" ]; then
|
|
118
|
-
die "This script should not run as root"
|
|
119
|
-
fi
|
|
120
|
-
|
|
121
|
-
# Use sudo only for specific commands
|
|
122
|
-
sudo sysctl -w net.ipv4.tcp_keepalive_time=60
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Consequences
|
|
126
|
-
|
|
127
|
-
### Positive
|
|
128
|
-
|
|
129
|
-
- Secrets never enter git history
|
|
130
|
-
- System modifications are auditable
|
|
131
|
-
- Multiple layers catch different vulnerability types
|
|
132
|
-
- Contributors have clear security patterns to follow
|
|
133
|
-
|
|
134
|
-
### Negative
|
|
135
|
-
|
|
136
|
-
- Additional complexity in scripts
|
|
137
|
-
- Encrypted secrets require key management
|
|
138
|
-
- Some features disabled by default (friction)
|
|
139
|
-
|
|
140
|
-
### Neutral
|
|
141
|
-
|
|
142
|
-
- Security vs convenience trade-offs explicit
|
|
143
|
-
- Regular security audits via scheduled CI
|
|
144
|
-
|
|
145
|
-
## Security Checklist for Contributors
|
|
146
|
-
|
|
147
|
-
- [ ] No hardcoded secrets (use environment variables or age encryption)
|
|
148
|
-
- [ ] Validate all user inputs
|
|
149
|
-
- [ ] Use absolute paths for file operations
|
|
150
|
-
- [ ] Document any system modifications
|
|
151
|
-
- [ ] Test scripts with shellcheck
|
|
152
|
-
- [ ] Add appropriate permission checks
|
|
153
|
-
|
|
154
|
-
## References
|
|
155
|
-
|
|
156
|
-
- [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/)
|
|
157
|
-
- [Age Encryption](https://github.com/FiloSottile/age)
|
|
158
|
-
- [Gitleaks](https://github.com/gitleaks/gitleaks)
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-004: Chezmoi + Custom CLI Wrapper Architecture
|
|
6
|
-
|
|
7
|
-
**Status**: Accepted
|
|
8
|
-
**Date**: 2026-02-09
|
|
9
|
-
**Authors**: @sebastienrousseau
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
Managing dotfiles requires:
|
|
14
|
-
|
|
15
|
-
- Tracking file changes and applying them consistently
|
|
16
|
-
- Handling platform-specific configurations
|
|
17
|
-
- Supporting encrypted secrets
|
|
18
|
-
- Providing a good developer experience
|
|
19
|
-
|
|
20
|
-
Options considered:
|
|
21
|
-
|
|
22
|
-
1. **Bare git repository**: Simple but poor UX, no templating
|
|
23
|
-
2. **GNU Stow**: Symlink-based, limited features
|
|
24
|
-
3. **Chezmoi only**: Powerful but complex CLI
|
|
25
|
-
4. **Custom from scratch**: High maintenance burden
|
|
26
|
-
5. **Chezmoi + wrapper**: Best of both worlds
|
|
27
|
-
|
|
28
|
-
## Decision
|
|
29
|
-
|
|
30
|
-
Use **Chezmoi as the core engine** with a **custom `dot` CLI wrapper** that:
|
|
31
|
-
|
|
32
|
-
### Architecture
|
|
33
|
-
|
|
34
|
-
```text
|
|
35
|
-
┌─────────────────────────────────────────────┐
|
|
36
|
-
│ dot CLI │
|
|
37
|
-
│ (User-friendly interface, custom commands) │
|
|
38
|
-
├─────────────────────────────────────────────┤
|
|
39
|
-
│ Command Modules │
|
|
40
|
-
│ core │ diagnostics │ tools │ appearance │
|
|
41
|
-
│ secrets │ security │ meta │
|
|
42
|
-
├─────────────────────────────────────────────┤
|
|
43
|
-
│ Shared Library │
|
|
44
|
-
│ utils.sh (resolve_source_dir, run_script) │
|
|
45
|
-
├─────────────────────────────────────────────┤
|
|
46
|
-
│ Chezmoi │
|
|
47
|
-
│ (Template engine, state management, apply) │
|
|
48
|
-
└─────────────────────────────────────────────┘
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Core Principles
|
|
52
|
-
|
|
53
|
-
**1. Chezmoi handles complexity:**
|
|
54
|
-
|
|
55
|
-
- Template rendering with Go text/template
|
|
56
|
-
- Encrypted secrets with age
|
|
57
|
-
- State tracking (what's applied vs source)
|
|
58
|
-
- Cross-platform path handling
|
|
59
|
-
|
|
60
|
-
**2. dot CLI handles UX:**
|
|
61
|
-
|
|
62
|
-
- Memorable command names (`dot sync` vs `chezmoi apply`)
|
|
63
|
-
- Domain-specific commands (`dot doctor`, `dot theme`)
|
|
64
|
-
- Integration with external tools (Nix, Docker, Neovim)
|
|
65
|
-
- Consistent help and error messages
|
|
66
|
-
|
|
67
|
-
**3. Modular command structure:**
|
|
68
|
-
|
|
69
|
-
```text
|
|
70
|
-
scripts/dot/
|
|
71
|
-
├── lib/
|
|
72
|
-
│ └── utils.sh # Shared functions
|
|
73
|
-
└── commands/
|
|
74
|
-
├── core.sh # apply, sync, update, add, diff
|
|
75
|
-
├── diagnostics.sh # doctor, heal, health, benchmark
|
|
76
|
-
├── tools.sh # tools, new, packages
|
|
77
|
-
├── appearance.sh # theme, wallpaper, fonts
|
|
78
|
-
├── secrets.sh # secrets-init, secrets
|
|
79
|
-
├── security.sh # firewall, backup, encrypt-check
|
|
80
|
-
└── meta.sh # upgrade, docs, learn
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**4. Delegation pattern:**
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
# Main dispatcher in dot CLI
|
|
87
|
-
dispatch() {
|
|
88
|
-
local module="$1" cmd="$2"
|
|
89
|
-
shift 2
|
|
90
|
-
exec bash "$src_dir/scripts/dot/commands/$module.sh" "$cmd" "$@"
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Chezmoi Integration Points
|
|
95
|
-
|
|
96
|
-
| Feature | Chezmoi | dot CLI |
|
|
97
|
-
|---------|---------|---------|
|
|
98
|
-
| Apply changes | `chezmoi apply` | `dot sync` |
|
|
99
|
-
| View diff | `chezmoi diff` | `dot diff` |
|
|
100
|
-
| Edit secrets | `chezmoi edit --encrypted` | `dot secrets` |
|
|
101
|
-
| Source directory | `chezmoi source-path` | `dot cd` |
|
|
102
|
-
| Health check | `chezmoi doctor` | `dot doctor` (extended) |
|
|
103
|
-
|
|
104
|
-
### Extension Points
|
|
105
|
-
|
|
106
|
-
Custom commands can:
|
|
107
|
-
|
|
108
|
-
1. Wrap chezmoi commands with better defaults
|
|
109
|
-
2. Add entirely new functionality (benchmarks, themes)
|
|
110
|
-
3. Integrate with system tools (nix, docker, brew)
|
|
111
|
-
4. Provide interactive experiences (tour, learn)
|
|
112
|
-
|
|
113
|
-
## Consequences
|
|
114
|
-
|
|
115
|
-
### Positive
|
|
116
|
-
|
|
117
|
-
- Leverage Chezmoi's battle-tested engine
|
|
118
|
-
- User-friendly interface for common tasks
|
|
119
|
-
- Easy to add domain-specific commands
|
|
120
|
-
- Modular structure enables testing and maintenance
|
|
121
|
-
- Single entry point (`dot`) for all operations
|
|
122
|
-
|
|
123
|
-
### Negative
|
|
124
|
-
|
|
125
|
-
- Two layers to understand (chezmoi + dot)
|
|
126
|
-
- Version coupling between chezmoi and scripts
|
|
127
|
-
- Some chezmoi features not exposed via dot
|
|
128
|
-
|
|
129
|
-
### Neutral
|
|
130
|
-
|
|
131
|
-
- Advanced users can still use chezmoi directly
|
|
132
|
-
- Documentation needed for both layers
|
|
133
|
-
- Upgrade path when chezmoi adds new features
|
|
134
|
-
|
|
135
|
-
## Implementation Notes
|
|
136
|
-
|
|
137
|
-
### Adding a New Command
|
|
138
|
-
|
|
139
|
-
1. Identify the appropriate module (or create new one)
|
|
140
|
-
2. Add function `cmd_<name>()` to module
|
|
141
|
-
3. Add case to module's dispatch
|
|
142
|
-
4. Add case to main dot CLI dispatcher
|
|
143
|
-
5. Update help text
|
|
144
|
-
6. Add tests if complex
|
|
145
|
-
|
|
146
|
-
### Module Template
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
#!/usr/bin/env bash
|
|
150
|
-
# Dotfiles CLI - <Category> Commands
|
|
151
|
-
|
|
152
|
-
set -e
|
|
153
|
-
|
|
154
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
155
|
-
source "$SCRIPT_DIR/../lib/utils.sh"
|
|
156
|
-
|
|
157
|
-
cmd_example() {
|
|
158
|
-
# Implementation
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
case "${1:-}" in
|
|
162
|
-
example) shift; cmd_example "$@" ;;
|
|
163
|
-
*) echo "Unknown command: ${1:-}" >&2; exit 1 ;;
|
|
164
|
-
esac
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
## References
|
|
168
|
-
|
|
169
|
-
- [Chezmoi Documentation](https://www.chezmoi.io/)
|
|
170
|
-
- [Command Pattern](https://refactoring.guru/design-patterns/command)
|
|
171
|
-
- [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy)
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
{% raw %}
|
|
5
|
-
|
|
6
|
-
# ADR-005: Chezmoi as Dotfiles Manager
|
|
7
|
-
|
|
8
|
-
**Status**: Accepted
|
|
9
|
-
**Date**: 2026-02-09
|
|
10
|
-
**Authors**: @sebastienrousseau
|
|
11
|
-
|
|
12
|
-
## Context
|
|
13
|
-
|
|
14
|
-
Managing dotfiles across multiple machines requires:
|
|
15
|
-
|
|
16
|
-
- Version control for configuration files
|
|
17
|
-
- Template support for machine-specific values
|
|
18
|
-
- Cross-platform compatibility (macOS, Linux, WSL)
|
|
19
|
-
- Encrypted secrets management
|
|
20
|
-
- Easy installation and updates
|
|
21
|
-
|
|
22
|
-
Several approaches were considered for dotfiles management.
|
|
23
|
-
|
|
24
|
-
## Decision
|
|
25
|
-
|
|
26
|
-
Use **chezmoi** as the primary dotfiles management tool.
|
|
27
|
-
|
|
28
|
-
### Alternatives Considered
|
|
29
|
-
|
|
30
|
-
| Tool | Pros | Cons |
|
|
31
|
-
|------|------|------|
|
|
32
|
-
| **GNU Stow** | Simple, no dependencies | No templating, symlink-only |
|
|
33
|
-
| **yadm** | Git-based, encryption | Limited templating |
|
|
34
|
-
| **Bare Git** | Simple, no tools | No templating, manual management |
|
|
35
|
-
| **Ansible** | Powerful, idempotent | Heavy, complex for dotfiles |
|
|
36
|
-
| **Nix Home Manager** | Declarative, reproducible | Steep learning curve, Nix dependency |
|
|
37
|
-
|
|
38
|
-
### Why Chezmoi
|
|
39
|
-
|
|
40
|
-
1. **Template Support**: Go text/template for machine-specific configuration
|
|
41
|
-
2. **Encryption**: Built-in age/gpg encryption for secrets
|
|
42
|
-
3. **Cross-Platform**: Native support for macOS, Linux, Windows
|
|
43
|
-
4. **Single Binary**: No runtime dependencies
|
|
44
|
-
5. **Git Integration**: Works with any Git host
|
|
45
|
-
6. **Dry-Run**: Preview changes before applying
|
|
46
|
-
7. **Active Development**: Well-maintained with responsive maintainer
|
|
47
|
-
|
|
48
|
-
## Implementation
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
# Installation
|
|
52
|
-
sh -c "$(curl -fsLS get.chezmoi.io)"
|
|
53
|
-
|
|
54
|
-
# Initialize from repository
|
|
55
|
-
chezmoi init https://github.com/user/dotfiles.git
|
|
56
|
-
|
|
57
|
-
# Apply configuration
|
|
58
|
-
chezmoi apply
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Template Example
|
|
62
|
-
|
|
63
|
-
```go
|
|
64
|
-
{{- if eq .chezmoi.os "darwin" }}
|
|
65
|
-
# macOS-specific configuration
|
|
66
|
-
{{- else if eq .chezmoi.os "linux" }}
|
|
67
|
-
# Linux-specific configuration
|
|
68
|
-
{{- end }}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Consequences
|
|
72
|
-
|
|
73
|
-
### Positive
|
|
74
|
-
|
|
75
|
-
- Consistent configuration across all machines
|
|
76
|
-
- Secure secrets management with age encryption
|
|
77
|
-
- Easy to add new machines to the fleet
|
|
78
|
-
- Template-driven configuration reduces duplication
|
|
79
|
-
- Built-in diff and dry-run for safe updates
|
|
80
|
-
|
|
81
|
-
### Negative
|
|
82
|
-
|
|
83
|
-
- Learning curve for Go templates
|
|
84
|
-
- Additional abstraction layer over raw Git
|
|
85
|
-
- Requires chezmoi binary installation
|
|
86
|
-
- Some features (scripts) require careful ordering
|
|
87
|
-
|
|
88
|
-
### Neutral
|
|
89
|
-
|
|
90
|
-
- Configuration stored in `~/.local/share/chezmoi` by default
|
|
91
|
-
- Custom wrapper CLI (`dot`) provides simpler interface
|
|
92
|
-
- Regular `git` commands still work in source directory
|
|
93
|
-
|
|
94
|
-
## References
|
|
95
|
-
|
|
96
|
-
- [Chezmoi Documentation](https://www.chezmoi.io/)
|
|
97
|
-
- [Chezmoi Quick Start](https://www.chezmoi.io/quick-start/)
|
|
98
|
-
- [Comparison with Other Tools](https://www.chezmoi.io/comparison-table/)
|
|
99
|
-
{% endraw %}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-006: Zsh as Default Shell
|
|
6
|
-
|
|
7
|
-
**Status**: Accepted
|
|
8
|
-
**Date**: 2026-02-09
|
|
9
|
-
**Authors**: @sebastienrousseau
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
Choosing a default shell impacts:
|
|
14
|
-
|
|
15
|
-
- Developer productivity and workflow
|
|
16
|
-
- Plugin ecosystem and extensibility
|
|
17
|
-
- Cross-platform compatibility
|
|
18
|
-
- Startup performance
|
|
19
|
-
- Learning curve for new users
|
|
20
|
-
|
|
21
|
-
## Decision
|
|
22
|
-
|
|
23
|
-
Use **Zsh** as the default interactive shell with **Zinit** as the plugin manager.
|
|
24
|
-
|
|
25
|
-
### Alternatives Considered
|
|
26
|
-
|
|
27
|
-
| Shell | Pros | Cons |
|
|
28
|
-
|-------|------|------|
|
|
29
|
-
| **Bash** | Universal, stable, POSIX | Limited interactive features |
|
|
30
|
-
| **Zsh** | Rich features, great plugins | Slower than bash (mitigated) |
|
|
31
|
-
| **Fish** | Modern, user-friendly | Not POSIX, less portable |
|
|
32
|
-
| **Nushell** | Structured data, modern | Breaking changes, immature |
|
|
33
|
-
|
|
34
|
-
### Why Zsh
|
|
35
|
-
|
|
36
|
-
1. **Default on macOS**: Pre-installed since Catalina
|
|
37
|
-
2. **Plugin Ecosystem**: Massive library of plugins and themes
|
|
38
|
-
3. **Compatibility**: POSIX-compatible, smooth migration from bash
|
|
39
|
-
4. **Completion System**: Superior tab completion
|
|
40
|
-
5. **Customization**: Highly configurable prompt and behavior
|
|
41
|
-
6. **Community**: Large community, well-documented
|
|
42
|
-
|
|
43
|
-
### Why Zinit
|
|
44
|
-
|
|
45
|
-
| Plugin Manager | Load Time | Features |
|
|
46
|
-
|----------------|-----------|----------|
|
|
47
|
-
| Oh-My-Zsh | ~800ms | Monolithic, many plugins |
|
|
48
|
-
| Prezto | ~400ms | Faster, modular |
|
|
49
|
-
| **Zinit** | ~200ms | Turbo mode, fine control |
|
|
50
|
-
| Antibody | ~300ms | Simple, fast |
|
|
51
|
-
|
|
52
|
-
Zinit provides:
|
|
53
|
-
|
|
54
|
-
- **Turbo Mode**: Deferred loading after prompt
|
|
55
|
-
- **Ice Modifiers**: Fine-grained control over plugin loading
|
|
56
|
-
- **Binary Installation**: Install completions and binaries
|
|
57
|
-
- **Profiling**: Built-in load time profiling
|
|
58
|
-
|
|
59
|
-
## Implementation
|
|
60
|
-
|
|
61
|
-
### Shell Layer System
|
|
62
|
-
|
|
63
|
-
```text
|
|
64
|
-
dot_config/zsh/rc.d/
|
|
65
|
-
├── 00-10: Core (env, history, options)
|
|
66
|
-
├── 20-49: Middleware (zinit, completions)
|
|
67
|
-
├── 50-89: Toolchain (languages, tools)
|
|
68
|
-
└── 90-99: UX (prompt, aliases, keybindings)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Zinit Configuration
|
|
72
|
-
|
|
73
|
-
```zsh
|
|
74
|
-
# Turbo mode: load after prompt displays
|
|
75
|
-
zinit ice wait lucid
|
|
76
|
-
zinit light zsh-users/zsh-autosuggestions
|
|
77
|
-
|
|
78
|
-
# Synchronous: needed immediately
|
|
79
|
-
zinit light zdharma-continuum/fast-syntax-highlighting
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Performance Targets
|
|
83
|
-
|
|
84
|
-
| Metric | Target | Achieved |
|
|
85
|
-
|--------|--------|----------|
|
|
86
|
-
| Cold Start | <500ms | ~300ms |
|
|
87
|
-
| Warm Start | <200ms | ~150ms |
|
|
88
|
-
| Plugin Load | Async | Yes |
|
|
89
|
-
|
|
90
|
-
## Consequences
|
|
91
|
-
|
|
92
|
-
### Positive
|
|
93
|
-
|
|
94
|
-
- Fast, responsive shell experience
|
|
95
|
-
- Rich plugin ecosystem (autosuggestions, syntax highlighting)
|
|
96
|
-
- Powerful completion system
|
|
97
|
-
- Compatible with existing bash scripts
|
|
98
|
-
- Modern prompt with Starship
|
|
99
|
-
|
|
100
|
-
### Negative
|
|
101
|
-
|
|
102
|
-
- Requires zsh installation on some Linux distros
|
|
103
|
-
- Plugin manager adds complexity
|
|
104
|
-
- Some bash-isms need adjustment
|
|
105
|
-
- Turbo mode can cause brief visual delay
|
|
106
|
-
|
|
107
|
-
### Neutral
|
|
108
|
-
|
|
109
|
-
- Users can still use bash for scripts
|
|
110
|
-
- Configuration more complex than vanilla shell
|
|
111
|
-
- Performance monitoring needed
|
|
112
|
-
|
|
113
|
-
## Performance Optimizations
|
|
114
|
-
|
|
115
|
-
1. **Caching**: Compile zsh files to `.zwc` bytecode
|
|
116
|
-
2. **Lazy Loading**: Defer heavy tools (nvm, rvm) until first use
|
|
117
|
-
3. **Turbo Mode**: Load plugins after prompt displays
|
|
118
|
-
4. **Conditional Loading**: Skip unused features
|
|
119
|
-
|
|
120
|
-
## References
|
|
121
|
-
|
|
122
|
-
- [Zsh Documentation](https://zsh.sourceforge.io/Doc/)
|
|
123
|
-
- [Zinit Wiki](https://zdharma-continuum.github.io/zinit/wiki/)
|
|
124
|
-
- [Starship Prompt](https://starship.rs/)
|