@sebastienrousseau/dotfiles 0.2.519 → 0.2.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +200 -0
- package/LICENSE-APACHE +190 -0
- package/{LICENSE → LICENSE-MIT} +1 -1
- package/README.md +1172 -166
- package/install.sh +77 -11
- package/package.json +8 -8
- 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/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- 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 -117
- 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/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 -450
- 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 -155
- package/docs/manual/concept-index.md +0 -168
- package/docs/manual/index.md +0 -66
- 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/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 -43
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- 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/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 -242
- 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 -114
- 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 -138
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -39
- package/scripts/diagnostics/doctor.sh +0 -751
- package/scripts/diagnostics/drift-dashboard.sh +0 -202
- package/scripts/diagnostics/health.sh +0 -623
- 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 -119
- 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 -187
- package/scripts/dot/commands/agent.sh +0 -485
- package/scripts/dot/commands/agents.sh +0 -336
- package/scripts/dot/commands/ai.sh +0 -587
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -134
- 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 -688
- 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 -333
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -419
- 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 -556
- 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 -185
- 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 -63
- 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 -604
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-version-consistency.sh +0 -124
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -112
- 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 -117
- package/scripts/qa/validate-examples.sh +0 -27
- 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 -335
- 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 -742
- 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 -544
- package/scripts/theme/switch.sh +0 -449
- 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/version-sync.sh +0 -654
- 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,144 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-011: Keep Nushell as Tier-3 Reference with Minimum-Viable Caching
|
|
6
|
-
|
|
7
|
-
## Status
|
|
8
|
-
|
|
9
|
-
Accepted
|
|
10
|
-
|
|
11
|
-
## Date
|
|
12
|
-
|
|
13
|
-
2026-05-13
|
|
14
|
-
|
|
15
|
-
## Context
|
|
16
|
-
|
|
17
|
-
ADR-007 (Multi-Shell Parity Strategy) classified the three supported
|
|
18
|
-
shells:
|
|
19
|
-
|
|
20
|
-
| Tier | Shells | Definition |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| Tier 1 (Full) | zsh, bash | Native aliases, functions, lazy loading, `_cached_eval` |
|
|
23
|
-
| Tier 2 (Bridged) | fish | Aliases + functions via bridge, `_cached_eval` |
|
|
24
|
-
| Tier 3 (Compatible) | nushell | Simple aliases only, functions via bash delegation |
|
|
25
|
-
|
|
26
|
-
The 2026 audit (slice 3 of #880's deep-dive) flagged Nushell as a
|
|
27
|
-
maintenance candidate:
|
|
28
|
-
|
|
29
|
-
- < 5% feature parity with zsh.
|
|
30
|
-
- No async / deferred-load support.
|
|
31
|
-
- No equivalent of `_cached_eval` — meaning every Nushell start spawns
|
|
32
|
-
`starship init nu`, `mise activate nu`, `zoxide init nushell`,
|
|
33
|
-
`atuin init nu` as fresh subprocesses, costing 100–200 ms aggregated.
|
|
34
|
-
- 5 config files (`config.nu.tmpl`, `env.nu.tmpl`, `aliases.nu`,
|
|
35
|
-
`completions.nu.tmpl`, `functions.nu.tmpl`) totalling ~270 lines —
|
|
36
|
-
enough to be meaningful, not enough to be self-sustaining.
|
|
37
|
-
|
|
38
|
-
Three paths were proposed:
|
|
39
|
-
|
|
40
|
-
1. **Keep as-is** — accept the gap, defer maintenance.
|
|
41
|
-
2. **Reduce to a stub** — leave the config but stop investing.
|
|
42
|
-
3. **Remove entirely** — delete all references.
|
|
43
|
-
|
|
44
|
-
## Decision
|
|
45
|
-
|
|
46
|
-
**Keep Nushell as Tier-3 with explicit limitations + a minimum-viable
|
|
47
|
-
`_cached_eval` equivalent.**
|
|
48
|
-
|
|
49
|
-
Specifically:
|
|
50
|
-
|
|
51
|
-
- Ship `dot_config/nushell/cached_eval.nu` — a Nushell module that
|
|
52
|
-
ports the binary-mtime-based init caching pattern from zsh/fish.
|
|
53
|
-
It handles the four tools that matter most for shell start:
|
|
54
|
-
starship, mise, zoxide, atuin. See the Nushell-specific tradeoffs
|
|
55
|
-
in the "Consequences" section below.
|
|
56
|
-
- Wire `env.nu.tmpl` to use the new module so subsequent shells skip
|
|
57
|
-
the subprocess spawns when binaries haven't moved.
|
|
58
|
-
- Continue maintaining the existing `aliases.nu` (hand-curated simple
|
|
59
|
-
aliases — `l`, `ll`, `la`, etc.) but accept that the bash-bridge
|
|
60
|
-
approach for full alias parity isn't worth the complexity.
|
|
61
|
-
- Update `README.md`'s shell list to call Nushell out as "best-effort
|
|
62
|
-
/ Tier-3" so users have correct expectations.
|
|
63
|
-
- Reject the "remove entirely" option for now (see Rationale below).
|
|
64
|
-
|
|
65
|
-
## Rationale
|
|
66
|
-
|
|
67
|
-
**Why not remove**: Nushell is shipped with the canonical `mise`
|
|
68
|
-
toolchain in this repo (it's installable via `mise install nushell`)
|
|
69
|
-
and is gaining adoption in the Rust + data-engineering communities
|
|
70
|
-
that overlap with this distribution's audience. Removing it would
|
|
71
|
-
break promises to a small-but-vocal segment of users. The maintenance
|
|
72
|
-
cost of the current 270-line surface is low.
|
|
73
|
-
|
|
74
|
-
**Why not reduce to a stub**: A stub config is worse than the current
|
|
75
|
-
moderate config — users who type `nu` and get a featureless shell
|
|
76
|
-
without any of the integrations the README promised would feel
|
|
77
|
-
betrayed. Either we keep the shell working well enough to use, or we
|
|
78
|
-
delete it.
|
|
79
|
-
|
|
80
|
-
**Why the minimum-viable cache layer**: The biggest waste on every
|
|
81
|
-
Nushell start was the four uncached subprocess spawns
|
|
82
|
-
(`starship init nu` etc.). Adding mtime-based caching for those costs
|
|
83
|
-
~50 lines of Nushell code and saves 100–200 ms per shell. That's the
|
|
84
|
-
cheapest meaningful improvement; deeper investments (async hydration,
|
|
85
|
-
plugin system, bash bridge for aliases) await an actual user request.
|
|
86
|
-
|
|
87
|
-
## Consequences
|
|
88
|
-
|
|
89
|
-
### Positive
|
|
90
|
-
|
|
91
|
-
- Nushell starts substantially faster than before (TBD — needs
|
|
92
|
-
measurement on a host with all four tools installed). The
|
|
93
|
-
subprocess elimination saves ~50–80 ms per cached tool, per cold
|
|
94
|
-
shell after the cache is populated.
|
|
95
|
-
- The mtime-invalidation pattern matches what zsh / fish do, so a
|
|
96
|
-
contributor familiar with one of the other shells can read the
|
|
97
|
-
Nushell code without learning a new mental model.
|
|
98
|
-
- Explicit Tier-3 documentation avoids the "wait, this is supposed to
|
|
99
|
-
be at parity" surprise.
|
|
100
|
-
|
|
101
|
-
### Negative
|
|
102
|
-
|
|
103
|
-
- Nushell's parse-time evaluator means we can't wrap source calls in
|
|
104
|
-
the cache function — the caller has to `source <path>` directly.
|
|
105
|
-
Slightly more boilerplate than the zsh/fish APIs.
|
|
106
|
-
- No malware-pattern screening in the cached output. The zsh / fish
|
|
107
|
-
implementations grep for `curl ... | sh`, `nc -e`, etc. before
|
|
108
|
-
sourcing; the Nushell version trusts its inputs. For the four tools
|
|
109
|
-
we ship (`starship`, `mise`, `zoxide`, `atuin`) this is acceptable
|
|
110
|
-
— they're official binaries pinned via `mise.toml`. Future tools
|
|
111
|
-
added to the cache must be similarly trusted.
|
|
112
|
-
- No per-tool timing telemetry. The `EVALCACHE_TIMING` infrastructure
|
|
113
|
-
zsh has (#863) isn't ported. If Nushell perf becomes a sustained
|
|
114
|
-
user concern, this is the next layer to add.
|
|
115
|
-
|
|
116
|
-
### Risks
|
|
117
|
-
|
|
118
|
-
- Nushell's syntax evolves quickly between 0.x releases. The
|
|
119
|
-
`cached_eval.nu` module uses `path exists`, `ls | get -i modified`,
|
|
120
|
-
and `run-external` which have been stable since 0.86 (Q3 2024).
|
|
121
|
-
If a future Nushell release breaks the API, the module fails fast
|
|
122
|
-
(saving an empty cache file) rather than corrupting state.
|
|
123
|
-
- Cache invalidation by mtime is fragile when the user installs a
|
|
124
|
-
tool via a non-mtime-respecting method (e.g. unpacking a tarball
|
|
125
|
-
with `--no-touch-mtimes`). The fallback is the user running
|
|
126
|
-
`dot prewarm` or deleting `~/.cache/nushell/*.nu`. Documented in
|
|
127
|
-
`docs/operations/PERFORMANCE.md`.
|
|
128
|
-
|
|
129
|
-
## Alternatives Considered
|
|
130
|
-
|
|
131
|
-
| Alternative | Why rejected |
|
|
132
|
-
|---|---|
|
|
133
|
-
| **Bash bridge for full alias parity** | Adds a `bash --norc --noprofile -c '...'` subprocess on every Nushell start (~30 ms). Defeats the perf gain from the cache layer. |
|
|
134
|
-
| **Port `_cached_eval` 1:1 (malware screen + JSONL telemetry)** | The full zsh implementation is 100+ lines. The Nushell version covers the 80% case at 50 lines; the remaining 20% (advanced features) aren't load-bearing for Tier-3 status. |
|
|
135
|
-
| **Delete Nushell entirely** | See "Why not remove" above. |
|
|
136
|
-
| **Reduce to a stub** | See "Why not reduce to a stub" above. |
|
|
137
|
-
|
|
138
|
-
## References
|
|
139
|
-
|
|
140
|
-
- [`dot_config/nushell/cached_eval.nu`](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/nushell/cached_eval.nu) — the new module.
|
|
141
|
-
- [`dot_config/nushell/env.nu.tmpl`](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/nushell/env.nu.tmpl) — adopter.
|
|
142
|
-
- ADR-007 (Multi-Shell Parity Strategy) — establishes the tier definitions.
|
|
143
|
-
- ADR-002 (Shell Performance Optimization Strategy) — establishes `_cached_eval` semantics this module ports.
|
|
144
|
-
- Issue [#880](https://github.com/sebastienrousseau/dotfiles/issues/880).
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# ADR-012: AI Fleet — Native Local Claude Proxy and Cockpit
|
|
6
|
-
|
|
7
|
-
## Status
|
|
8
|
-
|
|
9
|
-
Accepted
|
|
10
|
-
|
|
11
|
-
## Date
|
|
12
|
-
|
|
13
|
-
2026-06-27
|
|
14
|
-
|
|
15
|
-
## Context
|
|
16
|
-
|
|
17
|
-
The dotfiles manage a fleet of ~18 AI CLIs (claude, codex, copilot, goose,
|
|
18
|
-
crush, amp, cursor-agent, grok, aider, opencode, agy, sgpt, ollama, autohand, vibe,
|
|
19
|
-
qwen, zai, kiro-cli). Three problems had accumulated:
|
|
20
|
-
|
|
21
|
-
1. **Incoherent command surface.** The fleet was driven by three incompatible
|
|
22
|
-
shapes — `dot ai <thing>`, `dot <tool>`, and `dot ai-<thing>` — with opaque
|
|
23
|
-
names (`cl`, `agy`, `dash`) and no stated reason to prefer `dot ai` over
|
|
24
|
-
running a tool directly.
|
|
25
|
-
2. **No way to share one subscription.** Each tool needed its own provider/key.
|
|
26
|
-
Running the whole fleet on a single Claude subscription required a gateway,
|
|
27
|
-
but adding a third-party proxy (e.g. Meridian) meant a new runtime dependency
|
|
28
|
-
and 7k+ lines of engine to track.
|
|
29
|
-
3. **No unified cockpit.** Status, cost, and launching were scattered.
|
|
30
|
-
|
|
31
|
-
## Decision
|
|
32
|
-
|
|
33
|
-
Build the capability **in-tree**, with no third-party runtime dependency, and
|
|
34
|
-
present it behind a flat, verb-first surface modelled on the Claude CLI.
|
|
35
|
-
|
|
36
|
-
- **Command surface.** A single `dot ai` namespace: bare opens a cockpit; a
|
|
37
|
-
bare prompt runs a one-shot on Claude; `<tool> "<prompt>"` targets a tool;
|
|
38
|
-
plus `chat`, `tools`, `install`, `serve`, `cost`, `login`, `doctor`, and a
|
|
39
|
-
`--style` steering flag. Old forms remain as deprecated aliases that print a
|
|
40
|
-
one-line hint. (`scripts/dot/commands/ai.sh`, `lib/dot/ai-commands.sh`.)
|
|
41
|
-
- **Local gateway (`dot ai serve`).** `dot-ai-serve` is a stdlib-only Python
|
|
42
|
-
server that wraps the already-installed `claude` CLI in headless
|
|
43
|
-
`stream-json` mode and exposes the Anthropic (`/v1/messages`) and OpenAI
|
|
44
|
-
(`/v1/chat/completions`) protocols. The `claude` CLI owns auth, caching, and
|
|
45
|
-
rate limits — the server only translates wire formats. There is **no API key
|
|
46
|
-
anywhere**; the native Claude session is the credential.
|
|
47
|
-
- **Routing safety.** The primary `claude` is **never** routed through the
|
|
48
|
-
gateway (it keeps its native session and claude.ai connectors). Routing is
|
|
49
|
-
applied per-invocation to non-Claude tools only and is never written into the
|
|
50
|
-
interactive shell environment.
|
|
51
|
-
- **Cockpit (`dot-ai-tui`).** A Bubble Tea (Go) TUI built on `chezmoi apply`
|
|
52
|
-
via the mise-managed Go toolchain. It shells out to the `dot ai` verbs so
|
|
53
|
-
behaviour has one source of truth.
|
|
54
|
-
|
|
55
|
-
## Consequences
|
|
56
|
-
|
|
57
|
-
- **No new dependency for the headline feature.** The gateway leans on the
|
|
58
|
-
`claude` CLI the user already has; the cockpit is the only Go artefact and is
|
|
59
|
-
opt-in (built when `DOTFILES_AI` is set or already installed).
|
|
60
|
-
- **Single source of truth.** The cockpit and completions both derive from the
|
|
61
|
-
`ai.sh` verb dispatch; a completion-parity test and the docs-coverage contract
|
|
62
|
-
keep them from drifting.
|
|
63
|
-
- **Scope (v2).** The gateway does chat/completions for both protocols with
|
|
64
|
-
real token-by-token streaming, model routing/aliases, cost metering
|
|
65
|
-
(`/metrics`, `/v1/usage`), an optional daily budget cap, `/v1/models`, and
|
|
66
|
-
`/health`. Because it wraps the `claude` CLI (an agent, not the raw API),
|
|
67
|
-
tool-call passthrough and multimodal image input are handled gracefully but
|
|
68
|
-
not forwarded, and session resumption stays out of scope — documented in
|
|
69
|
-
[`docs/AI.md`](../AI.md).
|
|
70
|
-
- **Naming churn.** Existing muscle memory (`dot cl`, `dot ai dashboard`,
|
|
71
|
-
`dot ai proxy`) is preserved via deprecated aliases, so nothing breaks while
|
|
72
|
-
users migrate.
|
|
73
|
-
|
|
74
|
-
## References
|
|
75
|
-
|
|
76
|
-
- [`docs/AI.md`](../AI.md) — user guide for the full surface
|
|
77
|
-
- [ADR-004](ADR-004-cli-architecture.md) — the `dot` CLI wrapper this extends
|
|
78
|
-
- [ADR-008](ADR-008-alias-system-architecture.md) — the alias system the
|
|
79
|
-
deprecated bridges live in
|
package/docs/adr/README.md
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Architecture Decision Records
|
|
6
|
-
|
|
7
|
-
This directory contains Architecture Decision Records (ADRs) that document
|
|
8
|
-
significant architectural decisions made in this project.
|
|
9
|
-
|
|
10
|
-
## Index
|
|
11
|
-
|
|
12
|
-
| ADR | Title | Status |
|
|
13
|
-
|-----|-------|--------|
|
|
14
|
-
| [ADR-001](ADR-001-ci-cd-pipeline.md) | Multi-stage CI/CD Pipeline Design | Accepted |
|
|
15
|
-
| [ADR-002](ADR-002-shell-performance.md) | Shell Performance Optimization Strategy | Accepted |
|
|
16
|
-
| [ADR-003](ADR-003-security-first.md) | Security-First Approach | Accepted |
|
|
17
|
-
| [ADR-004](ADR-004-cli-architecture.md) | Chezmoi + Custom CLI Wrapper Architecture | Accepted |
|
|
18
|
-
| [ADR-005](ADR-005-chezmoi-choice.md) | Chezmoi as Dotfiles Manager | Accepted |
|
|
19
|
-
| [ADR-006](ADR-006-shell-selection.md) | Zsh as Default Shell | Accepted |
|
|
20
|
-
| [ADR-007](ADR-007-multi-shell-parity.md) | Multi-Shell Parity Strategy | Accepted |
|
|
21
|
-
| [ADR-008](ADR-008-alias-system-architecture.md) | Alias System Architecture | Accepted |
|
|
22
|
-
| [ADR-009](ADR-009-wallpaper-driven-theming.md) | Wallpaper-Driven Theming Engine | Accepted |
|
|
23
|
-
| [ADR-010](ADR-010-starship-transient-prompt.md) | Enable Starship Transient Prompt in Zsh and Fish | Accepted |
|
|
24
|
-
| [ADR-011](ADR-011-nushell-tier3-keep.md) | Keep Nushell as Tier-3 Reference with Minimum-Viable Caching | Accepted |
|
|
25
|
-
| [ADR-012](ADR-012-ai-fleet-local-proxy.md) | AI Fleet — Native Local Claude Proxy and Cockpit | Accepted |
|
|
26
|
-
|
|
27
|
-
## ADR Format
|
|
28
|
-
|
|
29
|
-
Each ADR follows this structure:
|
|
30
|
-
|
|
31
|
-
- **Status**: Proposed, Accepted, Deprecated, Superseded
|
|
32
|
-
- **Context**: The situation and forces at play
|
|
33
|
-
- **Decision**: The change being made
|
|
34
|
-
- **Consequences**: The resulting context after applying the decision
|
|
35
|
-
|
|
36
|
-
## References
|
|
37
|
-
|
|
38
|
-
- [Documenting Architecture Decisions](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)
|
|
39
|
-
- [ADR Tools](https://github.com/npryce/adr-tools)
|
|
40
|
-
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "AI Cost Optimization"
|
|
3
|
-
date: 2026-05-24
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# AI Cost Optimization
|
|
7
|
-
|
|
8
|
-
This dotfiles framework ships an opinionated AI-cost layer designed to
|
|
9
|
-
keep token spend predictable and low while still using the smartest
|
|
10
|
-
model for orchestration. Two ideas drive it:
|
|
11
|
-
|
|
12
|
-
1. **Delegate the grunt work.** Have the expensive smart model
|
|
13
|
-
orchestrate, and a cheap fast model do the file reads, edits, and
|
|
14
|
-
verification. The smart model sees one tool call and the final
|
|
15
|
-
`git diff` instead of every intermediate read.
|
|
16
|
-
2. **Account every call.** Every invocation through `dot ai <provider>`
|
|
17
|
-
appends a JSONL entry so you can see spend across all providers in
|
|
18
|
-
one report, not just per-tool dashboards.
|
|
19
|
-
|
|
20
|
-
## Quick reference
|
|
21
|
-
|
|
22
|
-
```sh
|
|
23
|
-
dot ai delegate "rename every UserService method that starts with get to fetch"
|
|
24
|
-
dot ai cost # all-time overview
|
|
25
|
-
dot ai cost --since 7 # last 7 days
|
|
26
|
-
dot ai cost --fails # only failures + breakdown by failure type
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Inside Claude Code: `/vibe`, `/vibe-report`, `/vibeon`, `/vibeoff`,
|
|
30
|
-
`/vibestatus`, `/vibe-model-pick`, `/vibe-model-clear`.
|
|
31
|
-
|
|
32
|
-
## The delegator pattern
|
|
33
|
-
|
|
34
|
-
The pattern comes from [pcx-wave/vibe-skill][vibe-skill]. Mistral Vibe
|
|
35
|
-
is the default delegate but the same wrapper accepts any model Vibe
|
|
36
|
-
knows about (DeepSeek V4 Flash, Gemini Flash, etc.).
|
|
37
|
-
|
|
38
|
-
[vibe-skill]: https://github.com/pcx-wave/vibe-skill
|
|
39
|
-
|
|
40
|
-
Cost comparison (May 2026 list prices, blended 85 in / 15 out typical
|
|
41
|
-
of coding tasks):
|
|
42
|
-
|
|
43
|
-
| Task | Claude Sonnet 4.6 ($3 / $15) | Mistral Medium 3.5 ($1.50 / $7.50) | DeepSeek V4 Flash ($0.14 / $0.28) |
|
|
44
|
-
|---|---|---|---|
|
|
45
|
-
| 1-file tweak (800 tok) | ~$0.004 | ~$0.002 | ~$0.0001 |
|
|
46
|
-
| 6-read task (4,800 tok) | ~$0.023 | ~$0.012 | ~$0.0008 |
|
|
47
|
-
| Multi-file refactor (12,000 tok) | ~$0.058 | ~$0.029 | ~$0.002 |
|
|
48
|
-
|
|
49
|
-
Real-world stats from 254 vibe-skill runs over 10 days (May 2026):
|
|
50
|
-
|
|
51
|
-
| | Amount |
|
|
52
|
-
|---|---|
|
|
53
|
-
| Actually paid (Mistral Pro prorated + DeepSeek pay-as-you-go) | **$10.35** |
|
|
54
|
-
| Same workload pay-as-you-go via Mistral API | $46.61 |
|
|
55
|
-
| Same workload on Claude Sonnet 4.6 | $179.91 |
|
|
56
|
-
| Saved vs Claude | **$169.56 (17.4× cheaper)** |
|
|
57
|
-
|
|
58
|
-
Claude itself contributes ~500-1500 tokens per delegation as
|
|
59
|
-
orchestration overhead. Even with that overhead the savings dominate
|
|
60
|
-
for anything beyond a one-line edit.
|
|
61
|
-
|
|
62
|
-
## Pieces deployed by this repo
|
|
63
|
-
|
|
64
|
-
| Component | Source path | Deployed to | Role |
|
|
65
|
-
|---|---|---|---|
|
|
66
|
-
| `vibe` skill | `defaults/dot_claude/skills/vibe/` | `~/.claude/skills/vibe/` | Claude Code slash commands (`/vibe`, `/vibe-report`, etc.) |
|
|
67
|
-
| Delegator binary | `defaults/dot_claude/skills/vibe/tools/executable_vibe-delegate` | `~/.claude/skills/vibe/tools/vibe-delegate` | Runs the cheap-model task in a pseudo-TTY, parses streaming JSON, syntax-checks changes, logs the run |
|
|
68
|
-
| Reporter | `defaults/dot_claude/skills/vibe/tools/executable_delegate-report` | `~/.claude/skills/vibe/tools/delegate-report` | Reads the JSONL log, prints overview / by-model / by-project / failure tables |
|
|
69
|
-
| CLI shim | `scripts/dot/commands/ai.sh` | `bin/dot ai delegate` / `bin/dot ai cost` | Same delegator + reporter, callable from the terminal without Claude Code |
|
|
70
|
-
| Unified log hook | `_ai_log_run` in `ai.sh` | runs inside `run_ai_with_context` | Appends one JSONL line per `dot ai <provider>` invocation |
|
|
71
|
-
| Log file | runtime-managed | `~/.local/share/delegate-runs.jsonl` | One line per run; `dot ai cost` reads it |
|
|
72
|
-
|
|
73
|
-
## State files
|
|
74
|
-
|
|
75
|
-
| File | Owner | Purpose |
|
|
76
|
-
|---|---|---|
|
|
77
|
-
| `~/.local/share/delegate-runs.jsonl` | runtime | One JSONL entry per AI invocation (vibe + every other provider) |
|
|
78
|
-
| `~/.local/share/vibe-auto.flag` | `/vibeon` / `/vibeoff` | When present, Claude auto-delegates coding tasks to Vibe |
|
|
79
|
-
| `~/.local/share/vibe-model.flag` | `/vibe-model-pick` | Override the Vibe model for the next runs; cleared by `/vibe-model-clear` |
|
|
80
|
-
| `~/.vibe/config.toml` | user | Vibe's own provider / model configuration |
|
|
81
|
-
|
|
82
|
-
## Reading the report
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
DELEGATE REPORT 2026-05-17 → 2026-05-24
|
|
86
|
-
Runs : 27 (ok: 25, failed: 2, timeout: 0)
|
|
87
|
-
Success rate : 92%
|
|
88
|
-
Avg duration : 18.4s
|
|
89
|
-
Tokens total : 4,231,082
|
|
90
|
-
Delegate cost : $1.4711
|
|
91
|
-
Claude equiv : $14.8294
|
|
92
|
-
Saved : $13.3583 (90% cheaper than Claude)
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
`Claude equiv` is what the same workload would have cost on Claude
|
|
96
|
-
Sonnet 4.6 ($3 / $15 per M tokens, blended at the same in/out ratio).
|
|
97
|
-
The savings line is the difference. Failure types are broken out per
|
|
98
|
-
model so you can see which delegate is most reliable for your repo.
|
|
99
|
-
|
|
100
|
-
## Provider coverage
|
|
101
|
-
|
|
102
|
-
Every provider exposed via `dot ai <provider>` is logged best-effort.
|
|
103
|
-
For providers that don't surface token counts in their CLI output, the
|
|
104
|
-
report still tracks: timestamp, project, exit code, duration, prompt
|
|
105
|
-
word count. Token / cost fields stay zero for those providers — the
|
|
106
|
-
report tolerates the gap and aggregates by `model` regardless.
|
|
107
|
-
|
|
108
|
-
Providers tracked today:
|
|
109
|
-
|
|
110
|
-
| Provider | Binary | Logged | Tokens surfaced? |
|
|
111
|
-
|---|---|---|---|
|
|
112
|
-
| Claude Code | `claude` | yes | no (CLI doesn't expose) |
|
|
113
|
-
| Codex | `codex` | yes | no |
|
|
114
|
-
| Copilot CLI | `copilot` | yes | no |
|
|
115
|
-
| Gemini CLI | `gemini` | yes | no |
|
|
116
|
-
| Goose | `goose` | yes | no |
|
|
117
|
-
| Kimi CLI | `kimi` | yes | no |
|
|
118
|
-
| Aider | `aider` | yes | no |
|
|
119
|
-
| OpenCode | `opencode` | yes | no |
|
|
120
|
-
| Autohand | `autohand` | yes | no |
|
|
121
|
-
| Mistral Vibe | `vibe` | yes | **yes** (via delegator) |
|
|
122
|
-
| Qwen | `qwen` | yes | no |
|
|
123
|
-
| ZAI | `zai` | yes | no |
|
|
124
|
-
| Shell-GPT | `sgpt` | yes | no |
|
|
125
|
-
| Ollama (local) | `ollama` | yes | n/a (no cost) |
|
|
126
|
-
| Kiro CLI | `kiro-cli` | yes | no |
|
|
127
|
-
|
|
128
|
-
## Future work
|
|
129
|
-
|
|
130
|
-
Not implemented yet, ordered roughly by likely impact:
|
|
131
|
-
|
|
132
|
-
1. **Provider-level budget guard.** `dot ai budget --set 50/month`
|
|
133
|
-
would warn at 80% and refuse new requests at 100% (overridable).
|
|
134
|
-
Needs per-provider cost estimation hooks beyond what each CLI
|
|
135
|
-
surfaces today.
|
|
136
|
-
2. **Prompt response cache.** Many coding-helper queries are
|
|
137
|
-
deterministic ("syntax for X in Y"). A local cache keyed on prompt
|
|
138
|
-
hash + provider could short-circuit repeat queries.
|
|
139
|
-
3. **Per-task-class model routing.** `dot ai delegate --class refactor`
|
|
140
|
-
would pick the cheapest model that meets the quality bar for the
|
|
141
|
-
task class. Today the user picks the model.
|
|
142
|
-
4. **Rate-limit awareness.** Track API rate limits from response
|
|
143
|
-
headers, queue requests, surface a `dot ai cost --limits` view that
|
|
144
|
-
shows time-to-reset for every provider with an active limit.
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Architecture
|
|
6
|
-
|
|
7
|
-
Core architectural decisions and system design of the dotfiles shell distribution.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Philosophy
|
|
12
|
-
|
|
13
|
-
- **XDG-First**: Configuration lives under `~/.config/` to keep the home directory clean.
|
|
14
|
-
- **Multi-Shell**: First-class support for Zsh, Fish, and Nushell with a shared logic core.
|
|
15
|
-
- **Fast Startup**: Heavy features are deferred or autoloaded to keep the first prompt under 50ms.
|
|
16
|
-
- **Deterministic**: Nix Flakes provide bit-for-bit identical environments across machines.
|
|
17
|
-
- **Non-Blocking**: Background daemons (Pueue) handle upgrades and builds without stalling the shell.
|
|
18
|
-
|
|
19
|
-
## System Layout
|
|
20
|
-
|
|
21
|
-
```text
|
|
22
|
-
~/.dotfiles/
|
|
23
|
-
├── dot_config/ # Managed application configurations (~/.config/)
|
|
24
|
-
│ ├── zsh/ # Modular Zsh rc.d architecture
|
|
25
|
-
│ ├── fish/ # Autoloading Fish configuration
|
|
26
|
-
│ ├── nushell/ # Structured data shell config
|
|
27
|
-
│ ├── shell/ # Shared logic (aliases, paths, functions)
|
|
28
|
-
│ └── ... # 50+ tool configurations (nvim, tmux, ghostty, etc.)
|
|
29
|
-
├── dot_local/ # Local binaries and scripts (~/.local/bin/)
|
|
30
|
-
├── .chezmoitemplates/ # Unified source for aliases, functions, and paths
|
|
31
|
-
├── scripts/ # Internal libraries and diagnostics
|
|
32
|
-
├── nix/ # Nix Flake for deterministic toolchains
|
|
33
|
-
├── lib/wasm-tools/ # Rust source for Wasm utilities
|
|
34
|
-
└── install.sh # Universal bootstrap script (zero dependencies)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Shell Startup Strategies
|
|
40
|
-
|
|
41
|
-
### Shared: `_cached_eval`
|
|
42
|
-
|
|
43
|
-
Across Zsh, Fish, and Bash, an idempotent caching wrapper avoids redundant tool initialization (Starship, Zoxide, Atuin).
|
|
44
|
-
|
|
45
|
-
1. **Intercept** — check if a cached version of the tool's `eval` output exists in `~/.cache/shell/`.
|
|
46
|
-
2. **Validate** — compare the cache timestamp against the tool binary's mtime.
|
|
47
|
-
3. **Bypass** — if valid, `source` the cached text directly, saving 20-50ms per tool.
|
|
48
|
-
|
|
49
|
-
### Lazy-Hydration Model
|
|
50
|
-
|
|
51
|
-
To reach a fluid first-prompt target (< 50ms), the shell uses a three-phase startup:
|
|
52
|
-
|
|
53
|
-
1. **Phase 1 (Visual Paint)** — render the prompt immediately using static escape codes.
|
|
54
|
-
2. **Phase 2 (Async Hydration)** — dispatch tool initializations (mise, atuin, etc.) to background workers.
|
|
55
|
-
3. **Phase 3 (On-Demand Activation)** — environment hydration occurs on first user interaction or after 500ms of idle time.
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Artifact Mode
|
|
60
|
-
|
|
61
|
-
A minimal environment triggered by `DOTFILES_ARTIFACT_MODE=1`.
|
|
62
|
-
|
|
63
|
-
- **Minimalist UI** — strips prompt complexity, leaving only a green `->`.
|
|
64
|
-
- **Intelligence Surface** — an async Bento-style dashboard rendered via `bento.sh` that provides environment context (Node version, cloud status, Git health) without blocking the main thread.
|
|
65
|
-
- **Redraw Signaling** — uses `SIGWINCH` to return control after background hydration completes.
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Ultra-Fast Mode
|
|
70
|
-
|
|
71
|
-
Set `DOTFILES_ULTRA_FAST=1` to skip all non-essential initialization. Only core paths, aliases, and the prompt are loaded. Useful for:
|
|
72
|
-
|
|
73
|
-
- CI/CD pipelines where full shell setup is unnecessary
|
|
74
|
-
- Rapid scripting sessions where startup latency matters
|
|
75
|
-
- Benchmarking baseline shell performance
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Debug and Trace Modes
|
|
80
|
-
|
|
81
|
-
### DOTFILES_DEBUG=1
|
|
82
|
-
|
|
83
|
-
Enables verbose diagnostic output during shell startup. Prints which files are sourced and their load times.
|
|
84
|
-
|
|
85
|
-
### DOTFILES_TRACE=1
|
|
86
|
-
|
|
87
|
-
Enables `set -x` tracing for the entire shell startup sequence. Output is written to `~/.local/state/dotfiles/debug.log` for post-mortem analysis.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Function Groups (groups.json)
|
|
92
|
-
|
|
93
|
-
Functions are organized into groups defined in `.chezmoitemplates/functions/groups.json`:
|
|
94
|
-
|
|
95
|
-
| Group | Functions | Description |
|
|
96
|
-
|-------|-----------|-------------|
|
|
97
|
-
| `api` | apihealth, apilatency, apiload | API testing utilities |
|
|
98
|
-
| `curl` | curlheader, curlstatus, curltime, httpdebug | HTTP debugging |
|
|
99
|
-
| `text` | encode64, kebabcase, lowercase, titlecase, ... | Text transformation |
|
|
100
|
-
| `system` | environment, freespace, hostinfo, myproc, sysinfo | System introspection |
|
|
101
|
-
| `files` | backup, extract, hexdump, hiddenfiles, size, zipf | File operations |
|
|
102
|
-
| `interactive` | banner, emoji, matrix, rainbow, stopwatch | Terminal fun |
|
|
103
|
-
| `nav` | cdls, goto, ql | Navigation shortcuts |
|
|
104
|
-
| `security` | genpass, keygen, mount_read_only | Security utilities |
|
|
105
|
-
| `misc` | dothelp, view-source, prependpath, caffeine | Miscellaneous |
|
|
106
|
-
|
|
107
|
-
Groups are lazy-loaded: stub functions are defined at startup, and the real implementation is loaded on first invocation. This keeps startup fast while providing 52+ functions on demand.
|
|
108
|
-
|
|
109
|
-
The `groups.json` schema maps group names to arrays of relative paths (including subdirectory):
|
|
110
|
-
|
|
111
|
-
```json
|
|
112
|
-
{
|
|
113
|
-
"group_name": ["group_name/function1.sh", "group_name/function2.sh"]
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Each `.sh` file lives in a subdirectory matching its group and defines a single function with the same name as the file (minus `.sh` extension).
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Cross-Platform Interoperability
|
|
6
|
-
|
|
7
|
-
How dotfiles commands and shims map across macOS, Linux, and WSL2.
|
|
8
|
-
|
|
9
|
-
## Command Mapping
|
|
10
|
-
|
|
11
|
-
| Alias / Command | macOS | Linux (Debian/Arch) | WSL2 (Windows Host) |
|
|
12
|
-
| :--- | :--- | :--- | :--- |
|
|
13
|
-
| `cb` (Clipboard) | `pbcopy` / `pbpaste` | `xclip` / `wl-copy` | `clip.exe` / `powershell.exe` |
|
|
14
|
-
| `open` | `open` | `xdg-open` | `wslview` / `explorer.exe` |
|
|
15
|
-
| `notify` | `osascript` (AppleScript) | `notify-send` / `gum log` | `powershell.exe` (Toast) / `gum` |
|
|
16
|
-
| `win` (Paths) | N/A | N/A | `wslpath` |
|
|
17
|
-
| `browser` | `open` | `xdg-open` | `powershell.exe Start-Process` |
|
|
18
|
-
|
|
19
|
-
## Infrastructure Parity
|
|
20
|
-
|
|
21
|
-
| Feature | macOS | Linux | WSL2 |
|
|
22
|
-
| :--- | :--- | :--- | :--- |
|
|
23
|
-
| **Package Manager** | Homebrew (`brew`) | `apt` / `pacman` / `nix` | `apt` + Windows binaries |
|
|
24
|
-
| **Shell Startup** | Async lazy-hydration | Async lazy-hydration | Async (optimized for IO) |
|
|
25
|
-
| **Environment** | native plist / launchctl | systemd / dbus | systemd (if enabled) / init |
|
|
26
|
-
| **Hardware** | Secure Enclave | TPM 2.0 / LUKS | Windows Hello bridge |
|
|
27
|
-
|
|
28
|
-
## Troubleshooting
|
|
29
|
-
|
|
30
|
-
### WSL2 IO Latency
|
|
31
|
-
|
|
32
|
-
Keep projects in the Linux filesystem (`~/...`), not under `/mnt/c/`.
|
|
33
|
-
|
|
34
|
-
### WSL2 Windows Binary Path
|
|
35
|
-
|
|
36
|
-
If you've disabled WSL path sharing, make sure Windows-side binaries like `clip.exe` and `explorer.exe` are still reachable in `$PATH`.
|
|
37
|
-
|
|
38
|
-
### macOS Permissions
|
|
39
|
-
|
|
40
|
-
Grant your terminal "Full Disk Access" in System Settings so dotfiles can manage all configurations.
|
|
41
|
-
|
|
42
|
-
### Linux GUI Fallbacks
|
|
43
|
-
|
|
44
|
-
In headless environments, GUI commands like `cb` and `open` fall back to `gum log` or terminal bell instead of hanging.
|