@sebastienrousseau/dotfiles 0.2.481 → 0.2.499

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/docs/ARCHITECTURE.md +29 -196
  2. package/docs/COMPLIANCE.md +10 -10
  3. package/docs/COPYRIGHT +3 -4
  4. package/docs/OPERATIONS.md +38 -65
  5. package/docs/PLAN.md +3 -3
  6. package/docs/PR_DESCRIPTION.md +85 -84
  7. package/docs/ROADMAP.md +11 -11
  8. package/docs/ROADMAP_legacy.md +556 -0
  9. package/docs/SECURITY_CHECKLIST.md +1 -1
  10. package/docs/TASK.md +4 -4
  11. package/docs/WALKTHROUGH.md +33 -152
  12. package/package.json +17 -5
  13. package/scripts/backup.sh +142 -0
  14. package/scripts/banner.sh +20 -0
  15. package/scripts/benchmark.sh +20 -0
  16. package/scripts/build.sh +41 -0
  17. package/scripts/clean.sh +31 -0
  18. package/scripts/compile.sh +54 -0
  19. package/scripts/copy.sh +108 -0
  20. package/scripts/{tools/detect-collisions.py → detect-collisions.py} +1 -1
  21. package/scripts/doctor.sh +79 -0
  22. package/scripts/dotfiles.sh +63 -0
  23. package/scripts/download.sh +35 -0
  24. package/scripts/help.sh +57 -0
  25. package/scripts/lock-configs.sh +57 -0
  26. package/scripts/package.sh +46 -0
  27. package/scripts/ssh.sh +55 -0
  28. package/scripts/teleport.sh +23 -0
  29. package/scripts/{tests/test-aliases.sh → test-aliases.sh} +3 -3
  30. package/scripts/test_smoke.sh +88 -0
  31. package/scripts/unpack.sh +28 -0
  32. package/scripts/{diagnostics/verify_state.sh → verify_state.sh} +21 -21
  33. package/templates/projects/go/README.md +0 -4
  34. package/templates/projects/node/README.md +0 -4
  35. package/templates/projects/python/README.md +0 -4
  36. package/templates/projects/python/pyproject.toml +0 -15
  37. package/CHANGELOG.md +0 -285
  38. package/LICENSE +0 -1283
  39. package/README.md +0 -315
  40. package/docs/ALIASES.md +0 -128
  41. package/docs/FEATURES.md +0 -166
  42. package/docs/FONTS.md +0 -147
  43. package/docs/INSTALL.md +0 -119
  44. package/docs/KEYS.md +0 -40
  45. package/docs/KEY_ROTATION.md +0 -219
  46. package/docs/LEGACY_ROADMAP.md +0 -142
  47. package/docs/NEOVIM_IDE_GUIDE.md +0 -52
  48. package/docs/README.md +0 -269
  49. package/docs/REPO_AUDIT.md +0 -23
  50. package/docs/SCREENSHOTS.md +0 -116
  51. package/docs/SECRETS.md +0 -76
  52. package/docs/SECURITY.md +0 -30
  53. package/docs/TESTING.md +0 -190
  54. package/docs/TOOLS.md +0 -146
  55. package/docs/TROUBLESHOOTING.md +0 -112
  56. package/docs/UTILS.md +0 -105
  57. package/docs/WSL2_NIX_TROUBLESHOOTING.md +0 -723
  58. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -101
  59. package/docs/adr/ADR-002-shell-performance.md +0 -121
  60. package/docs/adr/ADR-003-security-first.md +0 -140
  61. package/docs/adr/ADR-004-cli-architecture.md +0 -157
  62. package/docs/adr/ADR-005-chezmoi-choice.md +0 -89
  63. package/docs/adr/ADR-006-shell-selection.md +0 -115
  64. package/docs/adr/README.md +0 -33
  65. package/docs/themes/README.md +0 -20
  66. package/dot_config/aider/aider.conf.yml +0 -32
  67. package/dot_config/alacritty/alacritty.toml.tmpl +0 -483
  68. package/dot_config/ansible/ansible.cfg.tmpl +0 -11
  69. package/dot_config/atuin/config.toml +0 -23
  70. package/dot_config/bat/config +0 -8
  71. package/dot_config/brave-flags.conf.tmpl +0 -7
  72. package/dot_config/btop/btop.conf +0 -16
  73. package/dot_config/btop/themes/tokyonight.theme +0 -34
  74. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  75. package/dot_config/claude/mcp_servers.json +0 -49
  76. package/dot_config/clippy.toml +0 -55
  77. package/dot_config/containers/containers.conf +0 -14
  78. package/dot_config/curl/dot_curlrc +0 -18
  79. package/dot_config/dlv/config.yml +0 -39
  80. package/dot_config/docker/config.json.tmpl +0 -15
  81. package/dot_config/dotfiles/boot/README.md +0 -11
  82. package/dot_config/dotfiles/grub/README.md +0 -11
  83. package/dot_config/dotfiles/lock/README.md +0 -11
  84. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  85. package/dot_config/duf/duf.conf +0 -6
  86. package/dot_config/duti/defaults.duti +0 -5
  87. package/dot_config/emoji/emoji.txt +0 -34
  88. package/dot_config/fastfetch/config.jsonc +0 -28
  89. package/dot_config/firefox/user.js +0 -8
  90. package/dot_config/flatpak/flatpak.list +0 -4
  91. package/dot_config/fontconfig/fonts.conf.tmpl +0 -44
  92. package/dot_config/gem/gemrc +0 -9
  93. package/dot_config/gh/config.yml +0 -12
  94. package/dot_config/ghostty/config.tmpl +0 -661
  95. package/dot_config/git/attributes +0 -12
  96. package/dot_config/git/config.tmpl +0 -77
  97. package/dot_config/git/ignore +0 -27
  98. package/dot_config/gnupg/gpg-agent.conf.tmpl +0 -11
  99. package/dot_config/go/aliases.sh +0 -61
  100. package/dot_config/go/env.sh +0 -24
  101. package/dot_config/go/golangci.yml +0 -118
  102. package/dot_config/go/gopls.json +0 -30
  103. package/dot_config/goose/config.yaml +0 -29
  104. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -305
  105. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -66
  106. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -309
  107. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -21
  108. package/dot_config/htop/htoprc +0 -20
  109. package/dot_config/ice/README.md +0 -13
  110. package/dot_config/inputrc +0 -2
  111. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  112. package/dot_config/just/justfile +0 -104
  113. package/dot_config/k9s/config.yaml.tmpl +0 -65
  114. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  115. package/dot_config/karabiner/karabiner.json +0 -14
  116. package/dot_config/kitty/kitty.conf.tmpl +0 -517
  117. package/dot_config/lazydocker/config.yml +0 -186
  118. package/dot_config/lazygit/config.yml +0 -23
  119. package/dot_config/lsd/config.yaml +0 -19
  120. package/dot_config/mas/masapps.txt +0 -5
  121. package/dot_config/minikube/config.json +0 -13
  122. package/dot_config/mise/config.toml +0 -41
  123. package/dot_config/mongosh/mongoshrc.js +0 -67
  124. package/dot_config/mycli/myclirc +0 -67
  125. package/dot_config/nano/nanorc +0 -28
  126. package/dot_config/ncdu/config +0 -12
  127. package/dot_config/nvim/init.lua +0 -4
  128. package/dot_config/nvim/lazy-lock.json +0 -27
  129. package/dot_config/nvim/lua/config/autocmds.lua +0 -63
  130. package/dot_config/nvim/lua/config/keymaps.lua +0 -87
  131. package/dot_config/nvim/lua/config/lazy.lua +0 -34
  132. package/dot_config/nvim/lua/config/options.lua +0 -48
  133. package/dot_config/nvim/lua/plugins/coding.lua +0 -234
  134. package/dot_config/nvim/lua/plugins/dap.lua +0 -201
  135. package/dot_config/nvim/lua/plugins/editor.lua +0 -59
  136. package/dot_config/nvim/lua/plugins/git.lua +0 -9
  137. package/dot_config/nvim/lua/plugins/lsp.lua +0 -221
  138. package/dot_config/nvim/lua/plugins/markdown.lua +0 -17
  139. package/dot_config/nvim/lua/plugins/rust.lua +0 -33
  140. package/dot_config/nvim/lua/plugins/sessions.lua +0 -32
  141. package/dot_config/nvim/lua/plugins/ui.lua +0 -537
  142. package/dot_config/nvim/snippets/all.lua +0 -9
  143. package/dot_config/nvim/snippets/python.lua +0 -16
  144. package/dot_config/pip/pip.conf.tmpl +0 -32
  145. package/dot_config/pypoetry/config.toml.tmpl +0 -6
  146. package/dot_config/pyrightconfig.json.tmpl +0 -5
  147. package/dot_config/raycast/README.md +0 -13
  148. package/dot_config/redis/redisclirc +0 -41
  149. package/dot_config/shell/00-container-detect.sh +0 -53
  150. package/dot_config/shell/00-core-paths.sh.tmpl +0 -95
  151. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  152. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  153. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -10
  154. package/dot_config/shell/90-theme-switch.sh +0 -70
  155. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -35
  156. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -23
  157. package/dot_config/shell/Brewfile +0 -207
  158. package/dot_config/shell/Brewfile.cask +0 -92
  159. package/dot_config/shell/Brewfile.cli +0 -119
  160. package/dot_config/shell/README.md +0 -267
  161. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  162. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  163. package/dot_config/sops/dot_sops.yaml +0 -23
  164. package/dot_config/starship.toml.tmpl +0 -124
  165. package/dot_config/task/Taskfile.yml +0 -86
  166. package/dot_config/tflint/tflint.hcl.tmpl +0 -9
  167. package/dot_config/tmux/tmux.conf.tmpl +0 -181
  168. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  169. package/dot_config/vscode/extensions.txt +0 -11
  170. package/dot_config/vscode/settings.json.tmpl +0 -123
  171. package/dot_config/waybar/style.css +0 -8
  172. package/dot_config/wezterm/wezterm.lua.tmpl +0 -236
  173. package/dot_config/wget/wgetrc +0 -12
  174. package/dot_config/yarn/yarnrc.yml.tmpl +0 -36
  175. package/dot_config/yazi/yazi.toml +0 -40
  176. package/dot_config/zellij/config.kdl +0 -79
  177. package/dot_config/zsh/dot_zprofile +0 -13
  178. package/dot_config/zsh/dot_zshenv +0 -6
  179. package/dot_config/zsh/dot_zshrc.tmpl +0 -199
  180. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -5
  181. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  182. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  183. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -123
  184. package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +0 -20
  185. package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +0 -9
  186. package/dot_local/bin/executable_ai_core +0 -130
  187. package/dot_local/bin/executable_b64 +0 -59
  188. package/dot_local/bin/executable_dot +0 -178
  189. package/dot_local/bin/executable_dot_completion +0 -55
  190. package/dot_local/bin/executable_epoch +0 -62
  191. package/dot_local/bin/executable_extract +0 -108
  192. package/dot_local/bin/executable_git-ai-commit +0 -160
  193. package/dot_local/bin/executable_git-ai-diff +0 -154
  194. package/dot_local/bin/executable_hash +0 -123
  195. package/dot_local/bin/executable_hex +0 -79
  196. package/dot_local/bin/executable_ip +0 -37
  197. package/dot_local/bin/executable_jsonv +0 -54
  198. package/dot_local/bin/executable_jwt +0 -78
  199. package/dot_local/bin/executable_kill-port +0 -59
  200. package/dot_local/bin/executable_lorem +0 -103
  201. package/dot_local/bin/executable_regex +0 -96
  202. package/dot_local/bin/executable_tmux-sessionizer +0 -187
  203. package/dot_local/bin/executable_tour +0 -137
  204. package/dot_local/bin/executable_update +0 -108
  205. package/dot_local/bin/executable_uuid +0 -57
  206. package/dot_local/bin/executable_yamlv +0 -39
  207. package/dot_local/bin/executable_zig-install +0 -89
  208. package/dot_local/bin/voice_ops +0 -7
  209. package/dot_local/share/bash-completion/completions/dot +0 -54
  210. package/dot_local/share/zsh/completions/.keep +0 -0
  211. package/install.sh +0 -255
  212. package/scripts/ci/validate-ci-config.sh +0 -222
  213. package/scripts/demo/record.sh +0 -41
  214. package/scripts/diagnostics/benchmark.sh +0 -201
  215. package/scripts/diagnostics/doctor.sh +0 -115
  216. package/scripts/diagnostics/drift-dashboard.sh +0 -26
  217. package/scripts/diagnostics/health.sh +0 -356
  218. package/scripts/diagnostics/history-analysis.sh +0 -77
  219. package/scripts/diagnostics/security-score.sh +0 -392
  220. package/scripts/dot/commands/appearance.sh +0 -63
  221. package/scripts/dot/commands/core.sh +0 -130
  222. package/scripts/dot/commands/diagnostics.sh +0 -100
  223. package/scripts/dot/commands/meta.sh +0 -117
  224. package/scripts/dot/commands/restore.sh +0 -209
  225. package/scripts/dot/commands/secrets.sh +0 -81
  226. package/scripts/dot/commands/security.sh +0 -73
  227. package/scripts/dot/commands/tools.sh +0 -228
  228. package/scripts/dot/lib/utils.sh +0 -72
  229. package/scripts/fonts/install-nerd-fonts.sh +0 -59
  230. package/scripts/fonts/patch-fonts.sh +0 -34
  231. package/scripts/ops/chezmoi-apply.sh +0 -42
  232. package/scripts/ops/chezmoi-diff.sh +0 -14
  233. package/scripts/ops/chezmoi-remove.sh +0 -43
  234. package/scripts/ops/chezmoi-update.sh +0 -16
  235. package/scripts/ops/heal.sh +0 -466
  236. package/scripts/ops/health-check.sh +0 -380
  237. package/scripts/ops/rollback.sh +0 -531
  238. package/scripts/ops/teleport.sh +0 -32
  239. package/scripts/secrets/age-init.sh +0 -69
  240. package/scripts/secrets/create-secrets-file.sh +0 -44
  241. package/scripts/secrets/encrypt-ssh-key.sh +0 -42
  242. package/scripts/security/backup.sh +0 -17
  243. package/scripts/security/dns-doh.sh +0 -29
  244. package/scripts/security/encryption-check.sh +0 -39
  245. package/scripts/security/enforce-policies.sh +0 -339
  246. package/scripts/security/firewall.sh +0 -34
  247. package/scripts/security/lock-configs.sh +0 -57
  248. package/scripts/security/lock-screen.sh +0 -33
  249. package/scripts/security/manage-secrets.sh +0 -415
  250. package/scripts/security/telemetry-kill.sh +0 -28
  251. package/scripts/security/usb-safety.sh +0 -29
  252. package/scripts/tests/README.md +0 -241
  253. package/scripts/tests/benchmark.sh +0 -91
  254. package/scripts/tests/framework/assertions.sh +0 -283
  255. package/scripts/tests/framework/mocks.sh +0 -201
  256. package/scripts/tests/framework/test_runner.sh +0 -189
  257. package/scripts/tests/integration/test_install.sh +0 -237
  258. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  259. package/scripts/tests/performance/regression_check.sh +0 -73
  260. package/scripts/tests/performance/stress_test.sh +0 -65
  261. package/scripts/tests/test-docker.sh +0 -48
  262. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  263. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  264. package/scripts/tests/unit/test_backup.sh +0 -227
  265. package/scripts/tests/unit/test_case_functions.sh +0 -238
  266. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  267. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  268. package/scripts/tests/unit/test_encode64.sh +0 -67
  269. package/scripts/tests/unit/test_environment.sh +0 -78
  270. package/scripts/tests/unit/test_extract.sh +0 -163
  271. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  272. package/scripts/tests/unit/test_genpass.sh +0 -298
  273. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  274. package/scripts/tests/unit/test_installers.sh +0 -172
  275. package/scripts/tests/unit/test_keygen.sh +0 -68
  276. package/scripts/tests/unit/test_logging.sh +0 -96
  277. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  278. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  279. package/scripts/tests/unit/test_prependpath.sh +0 -66
  280. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  281. package/scripts/tests/unit/test_rd.sh +0 -230
  282. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  283. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  284. package/scripts/tests/unit/test_template_validation.sh +0 -238
  285. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  286. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  287. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  288. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  289. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  290. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  291. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  292. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  293. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  294. package/scripts/tests/unit/test_zipf.sh +0 -76
  295. package/scripts/theme/apply-gnome-theme.sh +0 -297
  296. package/scripts/theme/install-boot-logo.sh +0 -61
  297. package/scripts/theme/install-catppuccin-themes.sh +0 -346
  298. package/scripts/theme/install-cursors.sh +0 -24
  299. package/scripts/theme/install-file-icons.sh +0 -25
  300. package/scripts/theme/install-grub-theme.sh +0 -51
  301. package/scripts/theme/install-lock-icon.sh +0 -29
  302. package/scripts/theme/switch.sh +0 -250
  303. package/scripts/theme/wallpaper-rotate.sh +0 -82
  304. package/scripts/theme/wallpaper-sync.sh +0 -42
  305. package/scripts/tools/cmatrix.sh +0 -20
  306. package/scripts/tools/emoji-picker.sh +0 -45
  307. package/scripts/tools/figlet-banner.sh +0 -17
  308. package/scripts/tools/log-rotate.sh +0 -29
  309. package/scripts/tools/lolcat-wrap.sh +0 -18
  310. package/scripts/tools/pipes.sh +0 -47
  311. package/scripts/tuning/linux.sh +0 -175
  312. package/scripts/tuning/macos.sh +0 -46
  313. package/templates/projects/molecule/README.md +0 -7
  314. package/templates/projects/molecule/converge.yml +0 -7
  315. package/templates/projects/molecule/molecule.yml +0 -16
  316. package/templates/projects/packer/README.md +0 -15
  317. package/templates/projects/packer/main.pkr.hcl +0 -15
@@ -1,101 +0,0 @@
1
- # ADR-001: Multi-stage CI/CD Pipeline Design
2
-
3
- **Status**: Accepted
4
- **Date**: 2026-02-09
5
- **Authors**: @sebastienrousseau
6
-
7
- ## Context
8
-
9
- The dotfiles repository requires a CI/CD pipeline that:
10
- - Validates changes across multiple platforms (Linux, macOS)
11
- - Runs security scans to detect secrets and vulnerabilities
12
- - Tests shell scripts, Lua configurations, and Nix expressions
13
- - Maintains fast feedback loops for developers
14
- - Minimizes GitHub Actions costs (runner minutes)
15
-
16
- Traditional approaches run all checks on every commit, leading to:
17
- - Wasted compute on unrelated changes (e.g., running Lua linting when only docs change)
18
- - High costs from macOS runners ($0.08/min vs $0.008/min for Linux)
19
- - Long feedback times from sequential job execution
20
-
21
- ## Decision
22
-
23
- Implement a **5-stage progressive CI pipeline** with path-based filtering:
24
-
25
- ### Stage 1: Change Detection
26
- Use `dorny/paths-filter` to detect which file categories changed:
27
- - `shell`: *.sh, scripts/**, install/**
28
- - `lua`: dot_config/nvim/**, *.lua
29
- - `nix`: nix/**, *.nix
30
- - `config`: dot_*/**, .chezmoitemplates/**
31
-
32
- ### Stage 2: Lint (Parallel, Conditional)
33
- - **lint-shell**: Only runs if shell files changed
34
- - **lint-lua**: Only runs if Lua files changed
35
- - Run in parallel to minimize wall-clock time
36
-
37
- ### Stage 3: Security (Always on PRs)
38
- - **secrets-scan**: Gitleaks on every PR (critical)
39
- - **link-check**: Only on schedule (expensive)
40
-
41
- ### Stage 4: Test (Conditional Matrix)
42
- - Linux-only for PRs (cheapest)
43
- - Full matrix (Linux + macOS) on schedule/manual trigger
44
- - Docker container tests for installation validation
45
-
46
- ### Stage 5: Quality (Schedule/Manual Only)
47
- - Idempotency verification
48
- - Performance benchmarks
49
- - Nix flake checks
50
-
51
- ### Cost Optimization Strategies
52
-
53
- 1. **Path filters**: Skip jobs when files don't match
54
- 2. **Concurrency groups**: Cancel in-progress runs on new pushes
55
- 3. **Conditional matrices**: Expensive OS testing only on schedule
56
- 4. **Aggressive caching**: Tools, dependencies, databases
57
-
58
- ## Consequences
59
-
60
- ### Positive
61
- - ~50% reduction in GitHub Actions minutes
62
- - Fast feedback for most changes (1-3 minutes)
63
- - Comprehensive testing still available via schedule/manual
64
- - Clear separation of concerns between stages
65
-
66
- ### Negative
67
- - Complexity in workflow configuration
68
- - Some bugs might only surface in scheduled runs
69
- - Path filter maintenance required as repo structure evolves
70
-
71
- ### Neutral
72
- - Developers can trigger full CI manually with `workflow_dispatch`
73
- - Breaking changes to CI require testing across all stages
74
-
75
- ## Implementation
76
-
77
- ```yaml
78
- # Key patterns used
79
- on:
80
- push:
81
- paths:
82
- - '**.sh' # Only trigger on shell changes
83
-
84
- concurrency:
85
- group: ${{ github.workflow }}-${{ github.ref }}
86
- cancel-in-progress: true
87
-
88
- jobs:
89
- changes:
90
- outputs:
91
- shell: ${{ steps.filter.outputs.shell }}
92
-
93
- lint-shell:
94
- needs: changes
95
- if: needs.changes.outputs.shell == 'true'
96
- ```
97
-
98
- ## References
99
-
100
- - [GitHub Actions Path Filtering](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
101
- - [dorny/paths-filter](https://github.com/dorny/paths-filter)
@@ -1,121 +0,0 @@
1
- # ADR-002: Shell Performance Optimization Strategy
2
-
3
- **Status**: Accepted
4
- **Date**: 2026-02-09
5
- **Authors**: @sebastienrousseau
6
-
7
- ## Context
8
-
9
- Shell startup time directly impacts developer productivity. Every new terminal,
10
- tmux pane, or shell command execution incurs this cost. With rich shell
11
- configurations (completions, prompts, plugins), startup can easily exceed 1-2
12
- seconds.
13
-
14
- Goals:
15
- - Target startup time: <500ms for interactive shells
16
- - Maintain full functionality (completions, syntax highlighting, git info)
17
- - Support both zsh and bash
18
- - Work across macOS and Linux
19
-
20
- ## Decision
21
-
22
- Implement a **multi-layer performance optimization strategy**:
23
-
24
- ### Layer 1: Compilation and Caching
25
-
26
- ```bash
27
- # Compile zsh files to .zwc format
28
- _cached_eval() {
29
- local cache="$HOME/.cache/zsh/$1.zwc"
30
- if [[ ! -f "$cache" || "$2" -nt "$cache" ]]; then
31
- eval "$($2)" > "$cache.tmp"
32
- zcompile "$cache.tmp" "$cache"
33
- fi
34
- source "$cache"
35
- }
36
- ```
37
-
38
- - Compile frequently-sourced files to bytecode
39
- - Cache command output (brew shellenv, mise activate)
40
- - Invalidate cache when source files change
41
-
42
- ### Layer 2: Lazy Loading
43
-
44
- Defer loading of heavy components until first use:
45
-
46
- ```bash
47
- # Lazy load completions
48
- function kubectl() {
49
- unfunction kubectl
50
- source <(kubectl completion zsh)
51
- kubectl "$@"
52
- }
53
- ```
54
-
55
- - Completions loaded on first command use
56
- - NVM/RVM loaded only when node/ruby commands invoked
57
- - Heavy plugins deferred via zinit's `wait` modifier
58
-
59
- ### Layer 3: Zinit Turbo Mode
60
-
61
- ```zsh
62
- zinit ice wait lucid
63
- zinit light zsh-users/zsh-autosuggestions
64
- ```
65
-
66
- - Plugins load asynchronously after prompt
67
- - Critical plugins (syntax highlighting) load synchronously
68
- - Most plugins have 0ms impact on startup
69
-
70
- ### Layer 4: Conditional Loading
71
-
72
- ```bash
73
- # Only load if command exists
74
- [[ -x /opt/homebrew/bin/brew ]] && eval "$(/opt/homebrew/bin/brew shellenv)"
75
-
76
- # Skip in non-interactive shells
77
- [[ $- != *i* ]] && return
78
- ```
79
-
80
- - Platform-specific code guarded by OS detection
81
- - Heavy features opt-in via environment variables
82
- - Non-interactive shells get minimal config
83
-
84
- ### Monitoring
85
-
86
- Benchmark script to track startup time:
87
- ```bash
88
- hyperfine --warmup 3 --runs 10 "zsh -i -c exit"
89
- ```
90
-
91
- CI enforces 500ms threshold with warnings.
92
-
93
- ## Consequences
94
-
95
- ### Positive
96
- - Consistent <500ms startup across platforms
97
- - Full functionality preserved
98
- - Easy to add new tools without performance regression
99
- - Clear patterns for contributors to follow
100
-
101
- ### Negative
102
- - First invocation of lazy-loaded commands is slower
103
- - Cache invalidation bugs can cause stale behavior
104
- - Complexity in understanding load order
105
-
106
- ### Neutral
107
- - Profiling required when adding new plugins
108
- - Trade-off between convenience and performance explicit
109
-
110
- ## Measurements
111
-
112
- | Configuration | Startup Time |
113
- |---------------|--------------|
114
- | Vanilla zsh | ~50ms |
115
- | With oh-my-zsh | ~800ms |
116
- | This approach | ~200-400ms |
117
-
118
- ## References
119
-
120
- - [Zsh Startup Optimization](https://htr3n.github.io/2018/07/faster-zsh/)
121
- - [Zinit Turbo Mode](https://zdharma-continuum.github.io/zinit/wiki/INTRODUCTION/)
@@ -1,140 +0,0 @@
1
- # ADR-003: Security-First Approach
2
-
3
- **Status**: Accepted
4
- **Date**: 2026-02-09
5
- **Authors**: @sebastienrousseau
6
-
7
- ## Context
8
-
9
- Dotfiles repositories present unique security challenges:
10
- - They configure system behavior and permissions
11
- - They may contain or reference secrets (API keys, tokens)
12
- - They execute scripts with user privileges
13
- - They're often cloned to multiple machines
14
-
15
- A security breach in dotfiles can compromise all systems using them.
16
-
17
- ## Decision
18
-
19
- Implement a **defense-in-depth security model** with multiple layers:
20
-
21
- ### Layer 1: Secrets Protection
22
-
23
- **Never commit secrets:**
24
- ```bash
25
- # .gitleaks.toml - block common secret patterns
26
- [[rules]]
27
- id = "generic-api-key"
28
- regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9]{20,})'''
29
- ```
30
-
31
- **Encrypted secrets with age:**
32
- ```bash
33
- # Secrets stored encrypted, decrypted at apply time
34
- chezmoi.encryption = "age"
35
- chezmoi.age.identity = "~/.config/chezmoi/key.txt"
36
- ```
37
-
38
- **CI enforcement:**
39
- - Gitleaks runs on every PR
40
- - TruffleHog for verified secrets detection
41
- - Block merge if secrets detected
42
-
43
- ### Layer 2: Input Validation
44
-
45
- **Path traversal prevention:**
46
- ```bash
47
- # Validate all user inputs
48
- if [[ ! "$template_lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
49
- die "Invalid template name: $template_lang"
50
- fi
51
- ```
52
-
53
- **Safe file operations:**
54
- ```bash
55
- # Use absolute paths, validate before operations
56
- local real_path
57
- real_path="$(realpath -m "$user_input")"
58
- if [[ "$real_path" != "$allowed_base"/* ]]; then
59
- die "Path outside allowed directory"
60
- fi
61
- ```
62
-
63
- ### Layer 3: Opt-in System Modifications
64
-
65
- **Dangerous operations require explicit consent:**
66
- ```bash
67
- # Security scripts are opt-in
68
- if [ "${DOTFILES_SECURITY:-0}" != "1" ]; then
69
- echo "Security hardening is opt-in. Set DOTFILES_SECURITY=1 to enable."
70
- exit 0
71
- fi
72
- ```
73
-
74
- **Comprehensive logging:**
75
- ```bash
76
- # All system modifications logged
77
- log_security_change() {
78
- echo "[$(date -Iseconds)] $1" >> "$HOME/.local/share/dotfiles-security.log"
79
- }
80
- ```
81
-
82
- ### Layer 4: CI Security Scanning
83
-
84
- **Multi-tool approach:**
85
- - **Gitleaks**: Secrets in git history
86
- - **Shellcheck**: Shell script vulnerabilities
87
- - **Checkov**: Infrastructure misconfigurations
88
- - **Trivy**: Container vulnerabilities (when applicable)
89
- - **CodeQL**: Static analysis for Python/JavaScript
90
-
91
- **Weekly deep scans:**
92
- ```yaml
93
- schedule:
94
- - cron: '0 2 * * 0' # Weekly security audit
95
- ```
96
-
97
- ### Layer 5: Minimal Privileges
98
-
99
- **Scripts request only needed permissions:**
100
- ```bash
101
- # Don't run as root unless necessary
102
- if [ "$(id -u)" = "0" ]; then
103
- die "This script should not run as root"
104
- fi
105
-
106
- # Use sudo only for specific commands
107
- sudo sysctl -w net.ipv4.tcp_keepalive_time=60
108
- ```
109
-
110
- ## Consequences
111
-
112
- ### Positive
113
- - Secrets never enter git history
114
- - System modifications are auditable
115
- - Multiple layers catch different vulnerability types
116
- - Contributors have clear security patterns to follow
117
-
118
- ### Negative
119
- - Additional complexity in scripts
120
- - Encrypted secrets require key management
121
- - Some features disabled by default (friction)
122
-
123
- ### Neutral
124
- - Security vs convenience trade-offs explicit
125
- - Regular security audits via scheduled CI
126
-
127
- ## Security Checklist for Contributors
128
-
129
- - [ ] No hardcoded secrets (use environment variables or age encryption)
130
- - [ ] Validate all user inputs
131
- - [ ] Use absolute paths for file operations
132
- - [ ] Document any system modifications
133
- - [ ] Test scripts with shellcheck
134
- - [ ] Add appropriate permission checks
135
-
136
- ## References
137
-
138
- - [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/)
139
- - [Age Encryption](https://github.com/FiloSottile/age)
140
- - [Gitleaks](https://github.com/gitleaks/gitleaks)
@@ -1,157 +0,0 @@
1
- # ADR-004: Chezmoi + Custom CLI Wrapper Architecture
2
-
3
- **Status**: Accepted
4
- **Date**: 2026-02-09
5
- **Authors**: @sebastienrousseau
6
-
7
- ## Context
8
-
9
- Managing dotfiles requires:
10
- - Tracking file changes and applying them consistently
11
- - Handling platform-specific configurations
12
- - Supporting encrypted secrets
13
- - Providing a good developer experience
14
-
15
- Options considered:
16
- 1. **Bare git repository**: Simple but poor UX, no templating
17
- 2. **GNU Stow**: Symlink-based, limited features
18
- 3. **Chezmoi only**: Powerful but complex CLI
19
- 4. **Custom from scratch**: High maintenance burden
20
- 5. **Chezmoi + wrapper**: Best of both worlds
21
-
22
- ## Decision
23
-
24
- Use **Chezmoi as the core engine** with a **custom `dot` CLI wrapper** that:
25
-
26
- ### Architecture
27
-
28
- ```
29
- ┌─────────────────────────────────────────────┐
30
- │ dot CLI │
31
- │ (User-friendly interface, custom commands) │
32
- ├─────────────────────────────────────────────┤
33
- │ Command Modules │
34
- │ core │ diagnostics │ tools │ appearance │
35
- │ secrets │ security │ meta │
36
- ├─────────────────────────────────────────────┤
37
- │ Shared Library │
38
- │ utils.sh (resolve_source_dir, run_script) │
39
- ├─────────────────────────────────────────────┤
40
- │ Chezmoi │
41
- │ (Template engine, state management, apply) │
42
- └─────────────────────────────────────────────┘
43
- ```
44
-
45
- ### Core Principles
46
-
47
- **1. Chezmoi handles complexity:**
48
- - Template rendering with Go text/template
49
- - Encrypted secrets with age
50
- - State tracking (what's applied vs source)
51
- - Cross-platform path handling
52
-
53
- **2. dot CLI handles UX:**
54
- - Memorable command names (`dot sync` vs `chezmoi apply`)
55
- - Domain-specific commands (`dot doctor`, `dot theme`)
56
- - Integration with external tools (Nix, Docker, Neovim)
57
- - Consistent help and error messages
58
-
59
- **3. Modular command structure:**
60
- ```
61
- scripts/dot/
62
- ├── lib/
63
- │ └── utils.sh # Shared functions
64
- └── commands/
65
- ├── core.sh # apply, sync, update, add, diff
66
- ├── diagnostics.sh # doctor, heal, health, benchmark
67
- ├── tools.sh # tools, new, packages
68
- ├── appearance.sh # theme, wallpaper, fonts
69
- ├── secrets.sh # secrets-init, secrets
70
- ├── security.sh # firewall, backup, encrypt-check
71
- └── meta.sh # upgrade, docs, learn
72
- ```
73
-
74
- **4. Delegation pattern:**
75
- ```bash
76
- # Main dispatcher in dot CLI
77
- dispatch() {
78
- local module="$1" cmd="$2"
79
- shift 2
80
- exec bash "$src_dir/scripts/dot/commands/$module.sh" "$cmd" "$@"
81
- }
82
- ```
83
-
84
- ### Chezmoi Integration Points
85
-
86
- | Feature | Chezmoi | dot CLI |
87
- |---------|---------|---------|
88
- | Apply changes | `chezmoi apply` | `dot sync` |
89
- | View diff | `chezmoi diff` | `dot diff` |
90
- | Edit secrets | `chezmoi edit --encrypted` | `dot secrets` |
91
- | Source directory | `chezmoi source-path` | `dot cd` |
92
- | Health check | `chezmoi doctor` | `dot doctor` (extended) |
93
-
94
- ### Extension Points
95
-
96
- Custom commands can:
97
- 1. Wrap chezmoi commands with better defaults
98
- 2. Add entirely new functionality (benchmarks, themes)
99
- 3. Integrate with system tools (nix, docker, brew)
100
- 4. Provide interactive experiences (tour, learn)
101
-
102
- ## Consequences
103
-
104
- ### Positive
105
- - Leverage Chezmoi's battle-tested engine
106
- - User-friendly interface for common tasks
107
- - Easy to add domain-specific commands
108
- - Modular structure enables testing and maintenance
109
- - Single entry point (`dot`) for all operations
110
-
111
- ### Negative
112
- - Two layers to understand (chezmoi + dot)
113
- - Version coupling between chezmoi and scripts
114
- - Some chezmoi features not exposed via dot
115
-
116
- ### Neutral
117
- - Advanced users can still use chezmoi directly
118
- - Documentation needed for both layers
119
- - Upgrade path when chezmoi adds new features
120
-
121
- ## Implementation Notes
122
-
123
- ### Adding a New Command
124
-
125
- 1. Identify the appropriate module (or create new one)
126
- 2. Add function `cmd_<name>()` to module
127
- 3. Add case to module's dispatch
128
- 4. Add case to main dot CLI dispatcher
129
- 5. Update help text
130
- 6. Add tests if complex
131
-
132
- ### Module Template
133
-
134
- ```bash
135
- #!/usr/bin/env bash
136
- # Dotfiles CLI - <Category> Commands
137
-
138
- set -e
139
-
140
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
141
- source "$SCRIPT_DIR/../lib/utils.sh"
142
-
143
- cmd_example() {
144
- # Implementation
145
- }
146
-
147
- case "${1:-}" in
148
- example) shift; cmd_example "$@" ;;
149
- *) echo "Unknown command: ${1:-}" >&2; exit 1 ;;
150
- esac
151
- ```
152
-
153
- ## References
154
-
155
- - [Chezmoi Documentation](https://www.chezmoi.io/)
156
- - [Command Pattern](https://refactoring.guru/design-patterns/command)
157
- - [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy)
@@ -1,89 +0,0 @@
1
- # ADR-005: Chezmoi as Dotfiles Manager
2
-
3
- **Status**: Accepted
4
- **Date**: 2026-02-09
5
- **Authors**: @sebastienrousseau
6
-
7
- ## Context
8
-
9
- Managing dotfiles across multiple machines requires:
10
- - Version control for configuration files
11
- - Template support for machine-specific values
12
- - Cross-platform compatibility (macOS, Linux, WSL)
13
- - Encrypted secrets management
14
- - Easy installation and updates
15
-
16
- Several approaches were considered for dotfiles management.
17
-
18
- ## Decision
19
-
20
- Use **chezmoi** as the primary dotfiles management tool.
21
-
22
- ### Alternatives Considered
23
-
24
- | Tool | Pros | Cons |
25
- |------|------|------|
26
- | **GNU Stow** | Simple, no dependencies | No templating, symlink-only |
27
- | **yadm** | Git-based, encryption | Limited templating |
28
- | **Bare Git** | Simple, no tools | No templating, manual management |
29
- | **Ansible** | Powerful, idempotent | Heavy, complex for dotfiles |
30
- | **Nix Home Manager** | Declarative, reproducible | Steep learning curve, Nix dependency |
31
-
32
- ### Why Chezmoi
33
-
34
- 1. **Template Support**: Go text/template for machine-specific configuration
35
- 2. **Encryption**: Built-in age/gpg encryption for secrets
36
- 3. **Cross-Platform**: Native support for macOS, Linux, Windows
37
- 4. **Single Binary**: No runtime dependencies
38
- 5. **Git Integration**: Works with any Git host
39
- 6. **Dry-Run**: Preview changes before applying
40
- 7. **Active Development**: Well-maintained with responsive maintainer
41
-
42
- ## Implementation
43
-
44
- ```bash
45
- # Installation
46
- sh -c "$(curl -fsLS get.chezmoi.io)"
47
-
48
- # Initialize from repository
49
- chezmoi init https://github.com/user/dotfiles.git
50
-
51
- # Apply configuration
52
- chezmoi apply
53
- ```
54
-
55
- ### Template Example
56
-
57
- ```go
58
- {{- if eq .chezmoi.os "darwin" }}
59
- # macOS-specific configuration
60
- {{- else if eq .chezmoi.os "linux" }}
61
- # Linux-specific configuration
62
- {{- end }}
63
- ```
64
-
65
- ## Consequences
66
-
67
- ### Positive
68
- - Consistent configuration across all machines
69
- - Secure secrets management with age encryption
70
- - Easy to add new machines to the fleet
71
- - Template-driven configuration reduces duplication
72
- - Built-in diff and dry-run for safe updates
73
-
74
- ### Negative
75
- - Learning curve for Go templates
76
- - Additional abstraction layer over raw Git
77
- - Requires chezmoi binary installation
78
- - Some features (scripts) require careful ordering
79
-
80
- ### Neutral
81
- - Configuration stored in `~/.local/share/chezmoi` by default
82
- - Custom wrapper CLI (`dot`) provides simpler interface
83
- - Regular `git` commands still work in source directory
84
-
85
- ## References
86
-
87
- - [Chezmoi Documentation](https://www.chezmoi.io/)
88
- - [Chezmoi Quick Start](https://www.chezmoi.io/quick-start/)
89
- - [Comparison with Other Tools](https://www.chezmoi.io/comparison-table/)