@sebastienrousseau/dotfiles 0.2.500 → 0.2.502
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 +154 -0
- package/README.md +113 -45
- package/docs/.vitepress/reports/localization-readability-audit.md +4 -0
- package/docs/AI.md +8 -2
- package/docs/CNAME +1 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/NAMING_CONVENTIONS.md +7 -0
- package/docs/README.md +4 -0
- package/docs/_config.yml +59 -0
- package/docs/adr/ADR-001-ci-cd-pipeline.md +17 -0
- package/docs/adr/ADR-002-shell-performance.md +9 -0
- package/docs/adr/ADR-003-security-first.md +18 -0
- package/docs/adr/ADR-004-cli-architecture.md +14 -0
- package/docs/adr/ADR-005-chezmoi-choice.md +10 -0
- package/docs/adr/ADR-006-shell-selection.md +9 -0
- package/docs/adr/ADR-007-multi-shell-parity.md +10 -1
- package/docs/adr/ADR-008-alias-system-architecture.md +10 -0
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +131 -0
- package/docs/adr/ADR-010-starship-transient-prompt.md +144 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +144 -0
- package/docs/adr/README.md +7 -0
- package/docs/architecture/ARCHITECTURE.md +4 -0
- package/docs/architecture/INTEROP.md +8 -0
- package/docs/architecture/REPO_LAYOUT.md +5 -1
- package/docs/architecture/WALKTHROUGH.md +4 -0
- package/docs/architecture/fleet-deployment.md +4 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +11 -3
- package/docs/archive/LEGACY_ROADMAP.md +45 -27
- package/docs/archive/MILESTONE_v0.2.493.md +4 -0
- package/docs/archive/PLAN.md +46 -8
- package/docs/archive/REPO_AUDIT.md +8 -0
- package/docs/guides/INSTALL.md +4 -0
- package/docs/guides/NEOVIM_IDE_GUIDE.md +9 -0
- package/docs/guides/THEMING.md +8 -0
- package/docs/guides/TROUBLESHOOTING.md +28 -0
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +70 -1
- package/docs/index.md +6 -2
- package/docs/interop/A2A.md +7 -0
- package/docs/interop/POWERSHELL.md +102 -0
- package/docs/manual/00-introduction.md +5 -1
- package/docs/manual/01-concepts/01-architecture.md +4 -0
- package/docs/manual/01-concepts/02-trust-model.md +6 -2
- package/docs/manual/01-concepts/03-theme-engine.md +4 -0
- package/docs/manual/01-concepts/04-fleet.md +7 -1
- package/docs/manual/01-concepts/05-self-healing.md +8 -1
- package/docs/manual/02-tutorials/01-first-install.md +5 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +5 -0
- package/docs/manual/02-tutorials/03-create-profile.md +6 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +6 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +5 -1
- package/docs/manual/03-reference/01-dot-cli.md +67 -45
- package/docs/manual/03-reference/02-config-files.md +8 -2
- package/docs/manual/03-reference/03-environment.md +4 -0
- package/docs/manual/03-reference/04-templates.md +7 -1
- package/docs/manual/03-reference/05-feature-flags.md +72 -3
- package/docs/manual/04-cookbook/01-recipes.md +4 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +32 -0
- package/docs/manual/04-cookbook/03-faq.md +8 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +4 -0
- package/docs/manual/05-appendices/B-security-checklist.md +6 -0
- package/docs/manual/05-appendices/C-glossary.md +4 -0
- package/docs/manual/05-appendices/D-bibliography.md +5 -1
- package/docs/manual/05-appendices/E-license.md +4 -0
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +16 -8
- package/docs/manual/concept-index.md +4 -0
- package/docs/manual/index.md +66 -0
- package/docs/operations/ATTESTATION.md +5 -0
- package/docs/operations/CI_CADENCE.md +107 -0
- package/docs/operations/CI_COMPOSITES.md +156 -0
- package/docs/operations/COMPLETIONS.md +123 -0
- package/docs/operations/COVERAGE.md +182 -0
- package/docs/operations/DRIFT.md +107 -0
- package/docs/operations/HARD_AUDIT_2026.md +631 -0
- package/docs/operations/MAINTENANCE.md +5 -1
- package/docs/operations/MIGRATION.md +14 -6
- package/docs/operations/OPERATIONS.md +24 -0
- package/docs/operations/PERFORMANCE.md +133 -0
- package/docs/operations/REGISTRY.md +89 -0
- package/docs/operations/RELIABILITY.md +6 -0
- package/docs/operations/ROADMAP.md +36 -18
- package/docs/operations/ROADMAP_2026.md +665 -0
- package/docs/operations/TESTING.md +4 -0
- package/docs/operations/TRACEABILITY.md +7 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +4 -0
- package/docs/operations/VERSION_SYNC.md +54 -5
- package/docs/reference/ALIASES.md +7 -0
- package/docs/reference/ALIASES_CHEATSHEET.md +5 -1
- package/docs/reference/ALIASES_DEPRECATIONS.md +5 -1
- package/docs/reference/FEATURES.md +4 -0
- package/docs/reference/FONTS.md +4 -0
- package/docs/reference/POWERSHELL_PARITY.md +80 -0
- package/docs/reference/PROFILES.md +4 -0
- package/docs/reference/SCREENSHOTS.md +4 -0
- package/docs/reference/SCRIPTS.md +4 -0
- package/docs/reference/SUPPORT_MATRIX.md +10 -4
- package/docs/reference/THEMES.md +4 -0
- package/docs/reference/TOOLS.md +4 -0
- package/docs/reference/UTILS.md +16 -12
- package/docs/registry.json +6 -0
- package/docs/security/AI_ACT_COMPLIANCE.md +4 -0
- package/docs/security/AUDIT_BYPASS.md +103 -0
- package/docs/security/AUTOMATION_SECRETS.md +4 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
- package/docs/security/CI_PINNING.md +113 -0
- package/docs/security/COMMIT_SIGNING.md +138 -0
- package/docs/security/COMPLIANCE.md +5 -0
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
- package/docs/security/DISCLOSURE.md +130 -0
- package/docs/security/ENCRYPTION.md +5 -0
- package/docs/security/FMEA.md +4 -0
- package/docs/security/HISTORY_FILTERING.md +132 -0
- package/docs/security/INCIDENT_RESPONSE.md +4 -0
- package/docs/security/INSTALL_VERIFICATION.md +122 -0
- package/docs/security/KEYS.md +4 -0
- package/docs/security/KEY_ROTATION.md +85 -1
- package/docs/security/MCP_POLICY.md +9 -0
- package/docs/security/POLICY_RELEASES.md +4 -0
- package/docs/security/README.md +4 -0
- package/docs/security/SCORECARD.md +140 -0
- package/docs/security/SECRETS.md +12 -0
- package/docs/security/SECURITY.md +4 -0
- package/docs/security/SECURITY_CHECKLIST.md +11 -0
- package/docs/security/SHELL_EXEMPTIONS.md +145 -0
- package/docs/security/SOUP_REGISTER.md +4 -0
- package/docs/security/THREAT_MODEL.md +10 -0
- package/docs/security/VERIFICATION_VALIDATION.md +5 -1
- package/docs/security/security-pubkey.asc +15 -0
- package/docs/themes/README.md +4 -0
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +4 -0
- package/dot_config/ai/identity.md +3 -0
- package/dot_config/ai/patterns/architect.md +2 -0
- package/dot_config/ai/patterns/hardener.md +2 -0
- package/dot_config/ai/patterns/refactor.md +2 -0
- package/dot_config/alacritty/alacritty.toml.tmpl +3 -3
- package/dot_config/atuin/config.toml.tmpl +47 -0
- package/dot_config/dotfiles/agent-card.json +1 -1
- package/dot_config/dotfiles/boot/README.md +2 -0
- package/dot_config/dotfiles/grub/README.md +2 -0
- package/dot_config/dotfiles/lock/README.md +2 -0
- package/dot_config/fish/conf.d/direnv.fish +4 -0
- package/dot_config/fish/conf.d/init.fish.tmpl +21 -0
- package/dot_config/fish/conf.d/mise-activate.fish +5 -0
- package/dot_config/fish/functions/_cached_eval.fish +84 -11
- package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
- package/dot_config/foot/foot.ini.tmpl +3 -3
- package/dot_config/fuzzel/fuzzel.ini.tmpl +2 -2
- package/dot_config/ghostty/config.tmpl +3 -3
- package/dot_config/git/hooks/executable_commit-msg +146 -0
- package/dot_config/goose/config.yaml +2 -2
- package/dot_config/gtk-3.0/gtk.css.tmpl +2 -2
- package/dot_config/gtk-3.0/settings.ini.tmpl +2 -2
- package/dot_config/gtk-4.0/gtk.css.tmpl +2 -2
- package/dot_config/gtk-4.0/settings.ini.tmpl +2 -2
- package/dot_config/kitty/kitty.conf.tmpl +3 -3
- package/dot_config/mise/config.toml +1 -1
- package/dot_config/niri/config.kdl.tmpl +2 -2
- package/dot_config/nushell/cached_eval.nu +80 -0
- package/dot_config/nushell/env.nu.tmpl +21 -13
- package/dot_config/shell/00-core-paths.sh.tmpl +9 -1
- package/dot_config/shell/05-core-safety.sh +1 -0
- package/dot_config/shell/10-secrets.sh +1 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +1 -0
- package/dot_config/shell/40-ls-colors.sh +1 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +1 -0
- package/dot_config/shell/50-logic-functions.sh.tmpl +1 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +1 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +1 -0
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +1 -0
- package/dot_config/shell/README.md +25 -8
- package/dot_config/starship.toml.tmpl +2 -2
- package/dot_config/tmux/tmux.conf.tmpl +3 -3
- package/dot_config/user-dirs.dirs +1 -0
- package/dot_config/vscode/settings.json.tmpl +2 -2
- package/dot_config/waybar/config.jsonc.tmpl +2 -2
- package/dot_config/waybar/style.css.tmpl +2 -2
- package/dot_config/wezterm/wezterm.lua.tmpl +3 -3
- package/dot_config/zsh/dot_zshrc.tmpl +207 -17
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +28 -6
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +27 -7
- package/dot_local/bin/executable_bm +2 -0
- package/dot_local/bin/executable_dot +56 -9
- package/dot_local/bin/executable_dot-bootstrap +0 -1
- package/dot_local/bin/executable_dot-load-benchmark +1 -1
- package/dot_local/bin/executable_dot-theme-sync +8 -8
- package/dot_local/bin/executable_notify +2 -0
- package/dot_local/bin/executable_open +2 -0
- package/dot_local/bin/executable_tour +4 -2
- package/dot_local/bin/executable_up +3 -1
- package/dot_local/share/man/man1/dot.1 +1 -1
- package/dot_local/share/zsh/completions/_dot +4 -0
- package/install.sh +53 -38
- package/package.json +1 -1
- package/scripts/ci/check-dangerous-chmod.sh +19 -0
- package/scripts/ci/check-deps-dev.sh +236 -0
- package/scripts/ci/check-insecure-tls.sh +61 -0
- package/scripts/ci/check-regression-traceability.sh +67 -0
- package/scripts/ci/check-shell-preamble.sh +106 -0
- package/scripts/ci/dot-cli-startup-bench.sh +126 -0
- package/scripts/ci/install-chezmoi-verified.sh +4 -1
- package/scripts/ci/lint-reusable-pins.sh +78 -0
- package/scripts/ci/run-coverage.sh +451 -0
- package/scripts/ci/validate-chezmoidata.sh +25 -0
- package/scripts/ci/windows-smoke-test.ps1 +136 -0
- package/scripts/diagnostics/doctor.sh +203 -5
- package/scripts/diagnostics/drift-dashboard.sh +177 -13
- package/scripts/diagnostics/health.sh +21 -4
- package/scripts/diagnostics/perf.sh +304 -77
- package/scripts/diagnostics/workstation-attestation.sh +6 -1
- package/scripts/dot/commands/agent.sh +33 -27
- package/scripts/dot/commands/agents.sh +325 -0
- package/scripts/dot/commands/ai.sh +75 -10
- package/scripts/dot/commands/aliases.sh +10 -8
- package/scripts/dot/commands/core.sh +10 -4
- package/scripts/dot/commands/fleet.sh +278 -3
- package/scripts/dot/commands/init.sh +184 -0
- package/scripts/dot/commands/meta.sh +7 -4
- package/scripts/dot/commands/registry.sh +263 -0
- package/scripts/dot/commands/tools.sh +49 -1
- package/scripts/dot/lib/bento.sh +2 -1
- package/scripts/dot/lib/log.sh +6 -0
- package/scripts/dot/lib/platform.sh +22 -8
- package/scripts/dot/lib/ui.sh +145 -2
- package/scripts/dot/lib/utils.sh +6 -1
- package/scripts/git-hooks/pre-commit-audit.sh +1 -1
- package/scripts/git-hooks/pre-push +66 -3
- package/scripts/lib/secrets_provider.sh +32 -6
- package/scripts/ops/heal-chezmoi.sh +41 -6
- package/scripts/ops/rollback.sh +14 -0
- package/scripts/qa/powershell-contract.ps1 +95 -0
- package/scripts/security/check-disclosure-key-expiry.sh +110 -0
- package/scripts/security/lock-configs.sh +11 -2
- package/scripts/theme/merge-wallpaper.sh +4 -0
- package/scripts/theme/switch.sh +20 -10
- package/scripts/version-sync.sh +3 -0
- package/dot_config/atuin/config.toml +0 -40
- package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
package/docs/AI.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# AI Integrations (Opt-in)
|
|
2
6
|
|
|
3
7
|
AI helpers are **off by default**. You choose if and when to turn them on.
|
|
@@ -25,7 +29,7 @@ Use the `dot` CLI to run AI tools with added context:
|
|
|
25
29
|
|
|
26
30
|
```bash
|
|
27
31
|
# General usage
|
|
28
|
-
dot cl|copilot|gemini|kiro|sgpt|ollama|opencode|aider|autohand|vibe|qwen|zai --pattern <name> "prompt"
|
|
32
|
+
dot cl|codex|copilot|gemini|goose|kiro|sgpt|ollama|opencode|aider|autohand|vibe|qwen|zai --pattern <name> "prompt"
|
|
29
33
|
|
|
30
34
|
# Quick aliases
|
|
31
35
|
dcla "Optimize my zshrc" # Claude + Architect
|
|
@@ -40,8 +44,10 @@ Supported bridge commands:
|
|
|
40
44
|
| Command | Provider |
|
|
41
45
|
|---------|----------|
|
|
42
46
|
| `dot cl` | Claude Code |
|
|
47
|
+
| `dot codex` | OpenAI Codex CLI |
|
|
43
48
|
| `dot copilot` | GitHub Copilot CLI |
|
|
44
49
|
| `dot gemini` | Gemini CLI |
|
|
50
|
+
| `dot goose` | Goose (Block) |
|
|
45
51
|
| `dot kiro` | Kiro CLI |
|
|
46
52
|
| `dot sgpt` | Shell-GPT |
|
|
47
53
|
| `dot ollama` | Ollama |
|
|
@@ -78,7 +84,7 @@ Related AI commands:
|
|
|
78
84
|
|
|
79
85
|
These tools are not installed for you. Pick and install only the ones you want:
|
|
80
86
|
|
|
81
|
-
- **Agents**: `claude`, `copilot`
|
|
87
|
+
- **Agents**: `claude`, `codex`, `copilot`, `goose`
|
|
82
88
|
- **Coding assistants**: `aider`, `opencode`
|
|
83
89
|
- **General AI**: `gemini`, `sgpt`
|
|
84
90
|
- **Local-first**: `ollama`
|
package/docs/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
doc.dotfiles.io
|
package/docs/COPYRIGHT
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
{% raw %}
|
|
5
|
+
|
|
1
6
|
# Naming Conventions & Standardization Guide
|
|
2
7
|
|
|
3
8
|
This document defines the naming conventions for all files in the dotfiles repository.
|
|
@@ -93,3 +98,5 @@ docs/ # Documentation and GitHub Pages source
|
|
|
93
98
|
security/ # Security documentation
|
|
94
99
|
operations/ # Ops and maintenance docs
|
|
95
100
|
```
|
|
101
|
+
|
|
102
|
+
{% endraw %}
|
package/docs/README.md
CHANGED
package/docs/_config.yml
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
title: ".dotfiles"
|
|
2
|
+
description: "Cross-platform, signed, local-first dotfiles for macOS, Linux, and WSL — published at doc.dotfiles.io."
|
|
3
|
+
url: "https://doc.dotfiles.io"
|
|
4
|
+
baseurl: ""
|
|
5
|
+
|
|
6
|
+
# Jekyll renders this site from docs/ — see .github/workflows/pages.yml.
|
|
7
|
+
# Theme is the GitHub-hosted Cayman skin (zero-Gemfile setup); switch to
|
|
8
|
+
# `remote_theme: just-the-docs/just-the-docs` later if a richer
|
|
9
|
+
# navigation/search UX is wanted (requires plugin allowlist update on
|
|
10
|
+
# GH Pages side).
|
|
11
|
+
theme: jekyll-theme-cayman
|
|
12
|
+
|
|
13
|
+
plugins:
|
|
14
|
+
- jekyll-relative-links
|
|
15
|
+
- jekyll-seo-tag
|
|
16
|
+
- jekyll-sitemap
|
|
17
|
+
- jekyll-redirect-from
|
|
18
|
+
# Renders `README.md` as the directory index where present (matches
|
|
19
|
+
# the GitHub-browse experience for users coming from the repo links
|
|
20
|
+
# in docs/index.md).
|
|
21
|
+
- jekyll-readme-index
|
|
22
|
+
|
|
23
|
+
relative_links:
|
|
24
|
+
enabled: true
|
|
25
|
+
collections: true
|
|
26
|
+
|
|
27
|
+
# Treat *.md as pages so cross-page links work without trailing-slash
|
|
28
|
+
# kludges; include CNAME so the published artifact preserves it across
|
|
29
|
+
# workflow deploys.
|
|
30
|
+
include:
|
|
31
|
+
- CNAME
|
|
32
|
+
- .well-known
|
|
33
|
+
|
|
34
|
+
exclude:
|
|
35
|
+
- "*.tmpl"
|
|
36
|
+
- "manual/_toc.yml"
|
|
37
|
+
- "scripts/"
|
|
38
|
+
- "Gemfile"
|
|
39
|
+
- "Gemfile.lock"
|
|
40
|
+
- "vendor/"
|
|
41
|
+
|
|
42
|
+
markdown: kramdown
|
|
43
|
+
kramdown:
|
|
44
|
+
input: GFM
|
|
45
|
+
syntax_highlighter: rouge
|
|
46
|
+
hard_wrap: false
|
|
47
|
+
|
|
48
|
+
# Many of our docs include chezmoi/Go-template snippets like
|
|
49
|
+
# `{{ .variable }}` inside fenced code blocks. Liquid runs BEFORE
|
|
50
|
+
# kramdown sees those fences and would try to resolve the placeholders
|
|
51
|
+
# as Liquid expressions (silently dropping them from the output). Each
|
|
52
|
+
# .md file therefore carries explicit `render_with_liquid: false` in
|
|
53
|
+
# its frontmatter — a site-wide default in this block was not honored
|
|
54
|
+
# reliably, so we keep the kill-switch per-page instead.
|
|
55
|
+
defaults:
|
|
56
|
+
- scope:
|
|
57
|
+
path: ""
|
|
58
|
+
values:
|
|
59
|
+
layout: default
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
{% raw %}
|
|
5
|
+
|
|
1
6
|
# ADR-001: Multi-stage CI/CD Pipeline Design
|
|
2
7
|
|
|
3
8
|
**Status**: Accepted
|
|
@@ -7,6 +12,7 @@
|
|
|
7
12
|
## Context
|
|
8
13
|
|
|
9
14
|
The dotfiles repository requires a CI/CD pipeline that:
|
|
15
|
+
|
|
10
16
|
- Validates changes across multiple platforms (Linux, macOS)
|
|
11
17
|
- Runs security scans to detect secrets and vulnerabilities
|
|
12
18
|
- Tests shell scripts, Lua configurations, and Nix expressions
|
|
@@ -14,6 +20,7 @@ The dotfiles repository requires a CI/CD pipeline that:
|
|
|
14
20
|
- Minimizes GitHub Actions costs (runner minutes)
|
|
15
21
|
|
|
16
22
|
Traditional approaches run all checks on every commit, leading to:
|
|
23
|
+
|
|
17
24
|
- Wasted compute on unrelated changes (e.g., running Lua linting when only docs change)
|
|
18
25
|
- High costs from macOS runners ($0.08/min vs $0.008/min for Linux)
|
|
19
26
|
- Long feedback times from sequential job execution
|
|
@@ -23,27 +30,33 @@ Traditional approaches run all checks on every commit, leading to:
|
|
|
23
30
|
Implement a **5-stage progressive CI pipeline** with path-based filtering:
|
|
24
31
|
|
|
25
32
|
### Stage 1: Change Detection
|
|
33
|
+
|
|
26
34
|
Use `dorny/paths-filter` to detect which file categories changed:
|
|
35
|
+
|
|
27
36
|
- `shell`: *.sh, scripts/**, install/**
|
|
28
37
|
- `lua`: dot_config/nvim/**, *.lua
|
|
29
38
|
- `nix`: nix/**, *.nix
|
|
30
39
|
- `config`: dot_*/**, .chezmoitemplates/**
|
|
31
40
|
|
|
32
41
|
### Stage 2: Lint (Parallel, Conditional)
|
|
42
|
+
|
|
33
43
|
- **lint-shell**: Only runs if shell files changed
|
|
34
44
|
- **lint-lua**: Only runs if Lua files changed
|
|
35
45
|
- Run in parallel to minimize wall-clock time
|
|
36
46
|
|
|
37
47
|
### Stage 3: Security (Always on PRs)
|
|
48
|
+
|
|
38
49
|
- **secrets-scan**: Gitleaks on every PR (critical)
|
|
39
50
|
- **link-check**: Only on schedule (expensive)
|
|
40
51
|
|
|
41
52
|
### Stage 4: Test (Conditional Matrix)
|
|
53
|
+
|
|
42
54
|
- Linux-only for PRs (cheapest)
|
|
43
55
|
- Full matrix (Linux + macOS) on schedule/manual trigger
|
|
44
56
|
- Docker container tests for installation validation
|
|
45
57
|
|
|
46
58
|
### Stage 5: Quality (Schedule/Manual Only)
|
|
59
|
+
|
|
47
60
|
- Idempotency verification
|
|
48
61
|
- Performance benchmarks
|
|
49
62
|
- Nix flake checks
|
|
@@ -58,17 +71,20 @@ Use `dorny/paths-filter` to detect which file categories changed:
|
|
|
58
71
|
## Consequences
|
|
59
72
|
|
|
60
73
|
### Positive
|
|
74
|
+
|
|
61
75
|
- ~50% reduction in GitHub Actions minutes
|
|
62
76
|
- Fast feedback for most changes (1-3 minutes)
|
|
63
77
|
- Comprehensive testing still available via schedule/manual
|
|
64
78
|
- Clear separation of concerns between stages
|
|
65
79
|
|
|
66
80
|
### Negative
|
|
81
|
+
|
|
67
82
|
- Complexity in workflow configuration
|
|
68
83
|
- Some bugs might only surface in scheduled runs
|
|
69
84
|
- Path filter maintenance required as repo structure evolves
|
|
70
85
|
|
|
71
86
|
### Neutral
|
|
87
|
+
|
|
72
88
|
- Developers can trigger full CI manually with `workflow_dispatch`
|
|
73
89
|
- Breaking changes to CI require testing across all stages
|
|
74
90
|
|
|
@@ -99,3 +115,4 @@ jobs:
|
|
|
99
115
|
|
|
100
116
|
- [GitHub Actions Path Filtering](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
|
|
101
117
|
- [dorny/paths-filter](https://github.com/dorny/paths-filter)
|
|
118
|
+
{% endraw %}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-002: Shell Performance Optimization Strategy
|
|
2
6
|
|
|
3
7
|
**Status**: Accepted
|
|
@@ -12,6 +16,7 @@ configurations (completions, prompts, plugins), startup can easily exceed 1-2
|
|
|
12
16
|
seconds.
|
|
13
17
|
|
|
14
18
|
Goals:
|
|
19
|
+
|
|
15
20
|
- Target startup time: <500ms for interactive shells
|
|
16
21
|
- Maintain full functionality (completions, syntax highlighting, git info)
|
|
17
22
|
- Support both zsh and bash
|
|
@@ -84,6 +89,7 @@ zinit light zsh-users/zsh-autosuggestions
|
|
|
84
89
|
### Monitoring
|
|
85
90
|
|
|
86
91
|
Benchmark script to track startup time:
|
|
92
|
+
|
|
87
93
|
```bash
|
|
88
94
|
hyperfine --warmup 3 --runs 10 "zsh -i -c exit"
|
|
89
95
|
```
|
|
@@ -93,17 +99,20 @@ CI enforces 500ms threshold with warnings.
|
|
|
93
99
|
## Consequences
|
|
94
100
|
|
|
95
101
|
### Positive
|
|
102
|
+
|
|
96
103
|
- Consistent <500ms startup across platforms
|
|
97
104
|
- Full functionality preserved
|
|
98
105
|
- Easy to add new tools without performance regression
|
|
99
106
|
- Clear patterns for contributors to follow
|
|
100
107
|
|
|
101
108
|
### Negative
|
|
109
|
+
|
|
102
110
|
- First invocation of lazy-loaded commands is slower
|
|
103
111
|
- Cache invalidation bugs can cause stale behavior
|
|
104
112
|
- Complexity in understanding load order
|
|
105
113
|
|
|
106
114
|
### Neutral
|
|
115
|
+
|
|
107
116
|
- Profiling required when adding new plugins
|
|
108
117
|
- Trade-off between convenience and performance explicit
|
|
109
118
|
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-003: Security-First Approach
|
|
2
6
|
|
|
3
7
|
**Status**: Accepted
|
|
@@ -7,6 +11,7 @@
|
|
|
7
11
|
## Context
|
|
8
12
|
|
|
9
13
|
Dotfiles repositories present unique security challenges:
|
|
14
|
+
|
|
10
15
|
- They configure system behavior and permissions
|
|
11
16
|
- They may contain or reference secrets (API keys, tokens)
|
|
12
17
|
- They execute scripts with user privileges
|
|
@@ -21,6 +26,7 @@ Implement a **defense-in-depth security model** with multiple layers:
|
|
|
21
26
|
### Layer 1: Secrets Protection
|
|
22
27
|
|
|
23
28
|
**Never commit secrets:**
|
|
29
|
+
|
|
24
30
|
```bash
|
|
25
31
|
# .gitleaks.toml - block common secret patterns
|
|
26
32
|
[[rules]]
|
|
@@ -29,6 +35,7 @@ regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9]{20,})'''
|
|
|
29
35
|
```
|
|
30
36
|
|
|
31
37
|
**Encrypted secrets with age:**
|
|
38
|
+
|
|
32
39
|
```bash
|
|
33
40
|
# Secrets stored encrypted, decrypted at apply time
|
|
34
41
|
chezmoi.encryption = "age"
|
|
@@ -36,6 +43,7 @@ chezmoi.age.identity = "~/.config/chezmoi/key.txt"
|
|
|
36
43
|
```
|
|
37
44
|
|
|
38
45
|
**CI enforcement:**
|
|
46
|
+
|
|
39
47
|
- Gitleaks runs on every PR
|
|
40
48
|
- TruffleHog for verified secrets detection
|
|
41
49
|
- Block merge if secrets detected
|
|
@@ -43,6 +51,7 @@ chezmoi.age.identity = "~/.config/chezmoi/key.txt"
|
|
|
43
51
|
### Layer 2: Input Validation
|
|
44
52
|
|
|
45
53
|
**Path traversal prevention:**
|
|
54
|
+
|
|
46
55
|
```bash
|
|
47
56
|
# Validate all user inputs
|
|
48
57
|
if [[ ! "$template_lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
@@ -51,6 +60,7 @@ fi
|
|
|
51
60
|
```
|
|
52
61
|
|
|
53
62
|
**Safe file operations:**
|
|
63
|
+
|
|
54
64
|
```bash
|
|
55
65
|
# Use absolute paths, validate before operations
|
|
56
66
|
local real_path
|
|
@@ -63,6 +73,7 @@ fi
|
|
|
63
73
|
### Layer 3: Opt-in System Modifications
|
|
64
74
|
|
|
65
75
|
**Dangerous operations require explicit consent:**
|
|
76
|
+
|
|
66
77
|
```bash
|
|
67
78
|
# Security scripts are opt-in
|
|
68
79
|
if [ "${DOTFILES_SECURITY:-0}" != "1" ]; then
|
|
@@ -72,6 +83,7 @@ fi
|
|
|
72
83
|
```
|
|
73
84
|
|
|
74
85
|
**Comprehensive logging:**
|
|
86
|
+
|
|
75
87
|
```bash
|
|
76
88
|
# All system modifications logged
|
|
77
89
|
log_security_change() {
|
|
@@ -82,6 +94,7 @@ log_security_change() {
|
|
|
82
94
|
### Layer 4: CI Security Scanning
|
|
83
95
|
|
|
84
96
|
**Multi-tool approach:**
|
|
97
|
+
|
|
85
98
|
- **Gitleaks**: Secrets in git history
|
|
86
99
|
- **Shellcheck**: Shell script vulnerabilities
|
|
87
100
|
- **Checkov**: Infrastructure misconfigurations
|
|
@@ -89,6 +102,7 @@ log_security_change() {
|
|
|
89
102
|
- **CodeQL**: Static analysis for Python/JavaScript
|
|
90
103
|
|
|
91
104
|
**Weekly deep scans:**
|
|
105
|
+
|
|
92
106
|
```yaml
|
|
93
107
|
schedule:
|
|
94
108
|
- cron: '0 2 * * 0' # Weekly security audit
|
|
@@ -97,6 +111,7 @@ schedule:
|
|
|
97
111
|
### Layer 5: Minimal Privileges
|
|
98
112
|
|
|
99
113
|
**Scripts request only needed permissions:**
|
|
114
|
+
|
|
100
115
|
```bash
|
|
101
116
|
# Don't run as root unless necessary
|
|
102
117
|
if [ "$(id -u)" = "0" ]; then
|
|
@@ -110,17 +125,20 @@ sudo sysctl -w net.ipv4.tcp_keepalive_time=60
|
|
|
110
125
|
## Consequences
|
|
111
126
|
|
|
112
127
|
### Positive
|
|
128
|
+
|
|
113
129
|
- Secrets never enter git history
|
|
114
130
|
- System modifications are auditable
|
|
115
131
|
- Multiple layers catch different vulnerability types
|
|
116
132
|
- Contributors have clear security patterns to follow
|
|
117
133
|
|
|
118
134
|
### Negative
|
|
135
|
+
|
|
119
136
|
- Additional complexity in scripts
|
|
120
137
|
- Encrypted secrets require key management
|
|
121
138
|
- Some features disabled by default (friction)
|
|
122
139
|
|
|
123
140
|
### Neutral
|
|
141
|
+
|
|
124
142
|
- Security vs convenience trade-offs explicit
|
|
125
143
|
- Regular security audits via scheduled CI
|
|
126
144
|
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-004: Chezmoi + Custom CLI Wrapper Architecture
|
|
2
6
|
|
|
3
7
|
**Status**: Accepted
|
|
@@ -7,12 +11,14 @@
|
|
|
7
11
|
## Context
|
|
8
12
|
|
|
9
13
|
Managing dotfiles requires:
|
|
14
|
+
|
|
10
15
|
- Tracking file changes and applying them consistently
|
|
11
16
|
- Handling platform-specific configurations
|
|
12
17
|
- Supporting encrypted secrets
|
|
13
18
|
- Providing a good developer experience
|
|
14
19
|
|
|
15
20
|
Options considered:
|
|
21
|
+
|
|
16
22
|
1. **Bare git repository**: Simple but poor UX, no templating
|
|
17
23
|
2. **GNU Stow**: Symlink-based, limited features
|
|
18
24
|
3. **Chezmoi only**: Powerful but complex CLI
|
|
@@ -45,18 +51,21 @@ Use **Chezmoi as the core engine** with a **custom `dot` CLI wrapper** that:
|
|
|
45
51
|
### Core Principles
|
|
46
52
|
|
|
47
53
|
**1. Chezmoi handles complexity:**
|
|
54
|
+
|
|
48
55
|
- Template rendering with Go text/template
|
|
49
56
|
- Encrypted secrets with age
|
|
50
57
|
- State tracking (what's applied vs source)
|
|
51
58
|
- Cross-platform path handling
|
|
52
59
|
|
|
53
60
|
**2. dot CLI handles UX:**
|
|
61
|
+
|
|
54
62
|
- Memorable command names (`dot sync` vs `chezmoi apply`)
|
|
55
63
|
- Domain-specific commands (`dot doctor`, `dot theme`)
|
|
56
64
|
- Integration with external tools (Nix, Docker, Neovim)
|
|
57
65
|
- Consistent help and error messages
|
|
58
66
|
|
|
59
67
|
**3. Modular command structure:**
|
|
68
|
+
|
|
60
69
|
```text
|
|
61
70
|
scripts/dot/
|
|
62
71
|
├── lib/
|
|
@@ -72,6 +81,7 @@ scripts/dot/
|
|
|
72
81
|
```
|
|
73
82
|
|
|
74
83
|
**4. Delegation pattern:**
|
|
84
|
+
|
|
75
85
|
```bash
|
|
76
86
|
# Main dispatcher in dot CLI
|
|
77
87
|
dispatch() {
|
|
@@ -94,6 +104,7 @@ dispatch() {
|
|
|
94
104
|
### Extension Points
|
|
95
105
|
|
|
96
106
|
Custom commands can:
|
|
107
|
+
|
|
97
108
|
1. Wrap chezmoi commands with better defaults
|
|
98
109
|
2. Add entirely new functionality (benchmarks, themes)
|
|
99
110
|
3. Integrate with system tools (nix, docker, brew)
|
|
@@ -102,6 +113,7 @@ Custom commands can:
|
|
|
102
113
|
## Consequences
|
|
103
114
|
|
|
104
115
|
### Positive
|
|
116
|
+
|
|
105
117
|
- Leverage Chezmoi's battle-tested engine
|
|
106
118
|
- User-friendly interface for common tasks
|
|
107
119
|
- Easy to add domain-specific commands
|
|
@@ -109,11 +121,13 @@ Custom commands can:
|
|
|
109
121
|
- Single entry point (`dot`) for all operations
|
|
110
122
|
|
|
111
123
|
### Negative
|
|
124
|
+
|
|
112
125
|
- Two layers to understand (chezmoi + dot)
|
|
113
126
|
- Version coupling between chezmoi and scripts
|
|
114
127
|
- Some chezmoi features not exposed via dot
|
|
115
128
|
|
|
116
129
|
### Neutral
|
|
130
|
+
|
|
117
131
|
- Advanced users can still use chezmoi directly
|
|
118
132
|
- Documentation needed for both layers
|
|
119
133
|
- Upgrade path when chezmoi adds new features
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
{% raw %}
|
|
5
|
+
|
|
1
6
|
# ADR-005: Chezmoi as Dotfiles Manager
|
|
2
7
|
|
|
3
8
|
**Status**: Accepted
|
|
@@ -7,6 +12,7 @@
|
|
|
7
12
|
## Context
|
|
8
13
|
|
|
9
14
|
Managing dotfiles across multiple machines requires:
|
|
15
|
+
|
|
10
16
|
- Version control for configuration files
|
|
11
17
|
- Template support for machine-specific values
|
|
12
18
|
- Cross-platform compatibility (macOS, Linux, WSL)
|
|
@@ -65,6 +71,7 @@ chezmoi apply
|
|
|
65
71
|
## Consequences
|
|
66
72
|
|
|
67
73
|
### Positive
|
|
74
|
+
|
|
68
75
|
- Consistent configuration across all machines
|
|
69
76
|
- Secure secrets management with age encryption
|
|
70
77
|
- Easy to add new machines to the fleet
|
|
@@ -72,12 +79,14 @@ chezmoi apply
|
|
|
72
79
|
- Built-in diff and dry-run for safe updates
|
|
73
80
|
|
|
74
81
|
### Negative
|
|
82
|
+
|
|
75
83
|
- Learning curve for Go templates
|
|
76
84
|
- Additional abstraction layer over raw Git
|
|
77
85
|
- Requires chezmoi binary installation
|
|
78
86
|
- Some features (scripts) require careful ordering
|
|
79
87
|
|
|
80
88
|
### Neutral
|
|
89
|
+
|
|
81
90
|
- Configuration stored in `~/.local/share/chezmoi` by default
|
|
82
91
|
- Custom wrapper CLI (`dot`) provides simpler interface
|
|
83
92
|
- Regular `git` commands still work in source directory
|
|
@@ -87,3 +96,4 @@ chezmoi apply
|
|
|
87
96
|
- [Chezmoi Documentation](https://www.chezmoi.io/)
|
|
88
97
|
- [Chezmoi Quick Start](https://www.chezmoi.io/quick-start/)
|
|
89
98
|
- [Comparison with Other Tools](https://www.chezmoi.io/comparison-table/)
|
|
99
|
+
{% endraw %}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-006: Zsh as Default Shell
|
|
2
6
|
|
|
3
7
|
**Status**: Accepted
|
|
@@ -7,6 +11,7 @@
|
|
|
7
11
|
## Context
|
|
8
12
|
|
|
9
13
|
Choosing a default shell impacts:
|
|
14
|
+
|
|
10
15
|
- Developer productivity and workflow
|
|
11
16
|
- Plugin ecosystem and extensibility
|
|
12
17
|
- Cross-platform compatibility
|
|
@@ -45,6 +50,7 @@ Use **Zsh** as the default interactive shell with **Zinit** as the plugin manage
|
|
|
45
50
|
| Antibody | ~300ms | Simple, fast |
|
|
46
51
|
|
|
47
52
|
Zinit provides:
|
|
53
|
+
|
|
48
54
|
- **Turbo Mode**: Deferred loading after prompt
|
|
49
55
|
- **Ice Modifiers**: Fine-grained control over plugin loading
|
|
50
56
|
- **Binary Installation**: Install completions and binaries
|
|
@@ -84,6 +90,7 @@ zinit light zdharma-continuum/fast-syntax-highlighting
|
|
|
84
90
|
## Consequences
|
|
85
91
|
|
|
86
92
|
### Positive
|
|
93
|
+
|
|
87
94
|
- Fast, responsive shell experience
|
|
88
95
|
- Rich plugin ecosystem (autosuggestions, syntax highlighting)
|
|
89
96
|
- Powerful completion system
|
|
@@ -91,12 +98,14 @@ zinit light zdharma-continuum/fast-syntax-highlighting
|
|
|
91
98
|
- Modern prompt with Starship
|
|
92
99
|
|
|
93
100
|
### Negative
|
|
101
|
+
|
|
94
102
|
- Requires zsh installation on some Linux distros
|
|
95
103
|
- Plugin manager adds complexity
|
|
96
104
|
- Some bash-isms need adjustment
|
|
97
105
|
- Turbo mode can cause brief visual delay
|
|
98
106
|
|
|
99
107
|
### Neutral
|
|
108
|
+
|
|
100
109
|
- Users can still use bash for scripts
|
|
101
110
|
- Configuration more complex than vanilla shell
|
|
102
111
|
- Performance monitoring needed
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-007: Multi-Shell Parity Strategy
|
|
2
6
|
|
|
3
7
|
## Status
|
|
@@ -12,9 +16,10 @@ Accepted
|
|
|
12
16
|
|
|
13
17
|
The dotfiles distribution supports three shells: Zsh (default since macOS Catalina), Fish (modern interactive shell), and Nushell (structured data shell). The codebase has 98 alias files and 52+ functions written in POSIX/Bash. Without a parity strategy, each shell gets a fragmented subset of functionality.
|
|
14
18
|
|
|
15
|
-
**Problem:** Fish had zero access to the alias/function library until v0.2.
|
|
19
|
+
**Problem:** Fish had zero access to the alias/function library until v0.2.501 added bridge templates. Nushell had only 6 hardcoded aliases and no function access.
|
|
16
20
|
|
|
17
21
|
**Constraints:**
|
|
22
|
+
|
|
18
23
|
- Nushell's `source` is parse-time evaluated (no dynamic sourcing)
|
|
19
24
|
- Fish syntax differs significantly from POSIX (no `$()`, different `if`, no `[[`)
|
|
20
25
|
- Maintaining N copies of every alias/function is unsustainable
|
|
@@ -31,6 +36,7 @@ Adopt a **hub-and-spoke bridge architecture**:
|
|
|
31
36
|
- Functions: Chezmoi template-generated `def` wrappers delegating to bash (in `functions.nu.tmpl`)
|
|
32
37
|
|
|
33
38
|
**Parity tiers:**
|
|
39
|
+
|
|
34
40
|
- **Tier 1 (Full):** Zsh, Bash — all aliases, functions, lazy loading, cached eval
|
|
35
41
|
- **Tier 2 (Bridged):** Fish — all simple aliases, all functions via wrappers, `_cached_eval` caching
|
|
36
42
|
- **Tier 3 (Compatible):** Nushell — simple aliases (no complex bash syntax), all functions via bash delegation
|
|
@@ -38,16 +44,19 @@ Adopt a **hub-and-spoke bridge architecture**:
|
|
|
38
44
|
## Consequences
|
|
39
45
|
|
|
40
46
|
### Positive
|
|
47
|
+
|
|
41
48
|
- Single source of truth for aliases and functions
|
|
42
49
|
- Adding a new alias/function automatically propagates to all shells
|
|
43
50
|
- Nushell users get access to 40+ functions that were previously unavailable
|
|
44
51
|
- Fish users get mtime-aware caching via `_cached_eval`
|
|
45
52
|
|
|
46
53
|
### Negative
|
|
54
|
+
|
|
47
55
|
- Complex bash aliases (pipes, conditionals) are skipped for Nushell
|
|
48
56
|
- Function calls in Fish/Nushell incur bash subprocess overhead (~5ms per call)
|
|
49
57
|
- Cache invalidation requires shell restart or manual cache clear
|
|
50
58
|
|
|
51
59
|
### Risks
|
|
60
|
+
|
|
52
61
|
- Nushell's rapid development may break bridge syntax in future versions
|
|
53
62
|
- Very large alias sets may slow Nushell startup during cache generation
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
render_with_liquid: false
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# ADR-008: Alias System Architecture
|
|
2
6
|
|
|
3
7
|
## Status
|
|
@@ -13,6 +17,7 @@ Accepted
|
|
|
13
17
|
The dotfiles manage 98 alias files across 30+ categories (git, docker, kubernetes, python, security, etc.). These need to load fast, support per-machine toggling, and work across Zsh, Bash, Fish, and Nushell.
|
|
14
18
|
|
|
15
19
|
**Design questions:**
|
|
20
|
+
|
|
16
21
|
1. How to organize alias files for maintainability?
|
|
17
22
|
2. How to control which aliases load on which machines?
|
|
18
23
|
3. How to balance startup speed with alias availability?
|
|
@@ -47,6 +52,7 @@ Three profiles control alias scope (set in `.chezmoidata.toml`):
|
|
|
47
52
|
### Bucket Toggles
|
|
48
53
|
|
|
49
54
|
Per-category flags in `.chezmoidata.toml` under `[aliases.buckets]`:
|
|
55
|
+
|
|
50
56
|
```toml
|
|
51
57
|
[aliases.buckets]
|
|
52
58
|
system = true
|
|
@@ -62,6 +68,7 @@ svn = false # disable on machines without SVN
|
|
|
62
68
|
### Function Groups (groups.json)
|
|
63
69
|
|
|
64
70
|
Functions use a parallel system with `groups.json` as a registry:
|
|
71
|
+
|
|
65
72
|
- Groups: api, curl, text, system, files, interactive, nav, security, misc
|
|
66
73
|
- Lazy-loaded per group on first invocation
|
|
67
74
|
- Stub functions replaced with real implementations on first call
|
|
@@ -69,17 +76,20 @@ Functions use a parallel system with `groups.json` as a registry:
|
|
|
69
76
|
## Consequences
|
|
70
77
|
|
|
71
78
|
### Positive
|
|
79
|
+
|
|
72
80
|
- Adding aliases is self-service: create a file in the right category
|
|
73
81
|
- Per-machine customization without forking
|
|
74
82
|
- Lazy loading keeps startup under 200ms even with 98 alias files
|
|
75
83
|
- `groups.json` enables automated bridge generation for Fish/Nushell
|
|
76
84
|
|
|
77
85
|
### Negative
|
|
86
|
+
|
|
78
87
|
- Alias definitions wrap in functions (`set_default_aliases()`) for sourcing safety, adding complexity
|
|
79
88
|
- Two-phase loading means some aliases aren't available until after first prompt
|
|
80
89
|
- Profile/bucket system requires understanding .chezmoidata.toml
|
|
81
90
|
|
|
82
91
|
### Trade-offs
|
|
92
|
+
|
|
83
93
|
- Chose file-per-category over monolithic alias file for maintainability
|
|
84
94
|
- Chose runtime extraction for Fish/Nushell over maintaining parallel definitions
|
|
85
95
|
- Chose lazy loading over compile-time bundling for flexibility
|