@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.
Files changed (306) hide show
  1. package/CHANGELOG.md +200 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/{LICENSE → LICENSE-MIT} +1 -1
  4. package/README.md +1172 -166
  5. package/install.sh +77 -11
  6. package/package.json +8 -8
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/CNAME +0 -1
  12. package/docs/CONFIG_STRATEGY.md +0 -124
  13. package/docs/COPYRIGHT +0 -7
  14. package/docs/GOVERNANCE.md +0 -98
  15. package/docs/MAINTAINERS.md +0 -41
  16. package/docs/NAMING_CONVENTIONS.md +0 -102
  17. package/docs/OPENCODE.md +0 -127
  18. package/docs/README.md +0 -84
  19. package/docs/STRUCTURE.md +0 -102
  20. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  21. package/docs/adr/ADR-002-shell-performance.md +0 -130
  22. package/docs/adr/ADR-003-security-first.md +0 -158
  23. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  24. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  25. package/docs/adr/ADR-006-shell-selection.md +0 -124
  26. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  27. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  28. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  29. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  30. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  31. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  32. package/docs/adr/README.md +0 -40
  33. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  34. package/docs/architecture/ARCHITECTURE.md +0 -117
  35. package/docs/architecture/INTEROP.md +0 -44
  36. package/docs/architecture/REPO_LAYOUT.md +0 -241
  37. package/docs/architecture/WALKTHROUGH.md +0 -86
  38. package/docs/architecture/fleet-deployment.md +0 -77
  39. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  40. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  41. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  42. package/docs/archive/PLAN.md +0 -199
  43. package/docs/archive/REPO_AUDIT.md +0 -31
  44. package/docs/articles/.pages +0 -6
  45. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  46. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  47. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  48. package/docs/articles/index.md +0 -36
  49. package/docs/guides/INSTALL.md +0 -144
  50. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  51. package/docs/guides/THEMING.md +0 -230
  52. package/docs/guides/TROUBLESHOOTING.md +0 -176
  53. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  54. package/docs/index.md +0 -132
  55. package/docs/interop/A2A.md +0 -39
  56. package/docs/interop/POWERSHELL.md +0 -102
  57. package/docs/manual/00-introduction.md +0 -89
  58. package/docs/manual/01-concepts/01-architecture.md +0 -138
  59. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  60. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  61. package/docs/manual/01-concepts/04-fleet.md +0 -148
  62. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  63. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  64. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  65. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  66. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  67. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  68. package/docs/manual/03-reference/01-dot-cli.md +0 -450
  69. package/docs/manual/03-reference/02-config-files.md +0 -265
  70. package/docs/manual/03-reference/03-environment.md +0 -124
  71. package/docs/manual/03-reference/04-templates.md +0 -190
  72. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  73. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  74. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  75. package/docs/manual/04-cookbook/03-faq.md +0 -175
  76. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  77. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  78. package/docs/manual/05-appendices/C-glossary.md +0 -40
  79. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  80. package/docs/manual/05-appendices/E-license.md +0 -38
  81. package/docs/manual/_toc.yml +0 -58
  82. package/docs/manual/command-index.md +0 -155
  83. package/docs/manual/concept-index.md +0 -168
  84. package/docs/manual/index.md +0 -66
  85. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  86. package/docs/operations/ATTESTATION.md +0 -44
  87. package/docs/operations/CI_CADENCE.md +0 -107
  88. package/docs/operations/CI_COMPOSITES.md +0 -156
  89. package/docs/operations/COMPLETIONS.md +0 -123
  90. package/docs/operations/COVERAGE.md +0 -204
  91. package/docs/operations/DRIFT.md +0 -107
  92. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  93. package/docs/operations/MAINTENANCE.md +0 -63
  94. package/docs/operations/MANIFEST.md +0 -127
  95. package/docs/operations/MIGRATION.md +0 -109
  96. package/docs/operations/OPERATIONS.md +0 -188
  97. package/docs/operations/PERFORMANCE.md +0 -133
  98. package/docs/operations/REGISTRY.md +0 -90
  99. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  100. package/docs/operations/RELIABILITY.md +0 -122
  101. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  102. package/docs/operations/ROADMAP.md +0 -10
  103. package/docs/operations/ROADMAP_2026.md +0 -7
  104. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  105. package/docs/operations/TESTING.md +0 -216
  106. package/docs/operations/TRACEABILITY.md +0 -43
  107. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  108. package/docs/operations/VERSION_SYNC.md +0 -393
  109. package/docs/reference/ALIASES.md +0 -131
  110. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  111. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  112. package/docs/reference/FEATURES.md +0 -66
  113. package/docs/reference/FONTS.md +0 -112
  114. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  115. package/docs/reference/PROFILES.md +0 -69
  116. package/docs/reference/SCREENSHOTS.md +0 -121
  117. package/docs/reference/SCRIPTS.md +0 -71
  118. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  119. package/docs/reference/THEMES.md +0 -117
  120. package/docs/reference/TOOLS.md +0 -110
  121. package/docs/reference/UTILS.md +0 -242
  122. package/docs/registry.json +0 -6
  123. package/docs/schema/dot-env-v1.json +0 -110
  124. package/docs/schema/dot-registry-v1.json +0 -33
  125. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  126. package/docs/security/AUDIT_BYPASS.md +0 -103
  127. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  128. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  129. package/docs/security/CI_PINNING.md +0 -129
  130. package/docs/security/COMMIT_SIGNING.md +0 -138
  131. package/docs/security/COMPLIANCE.md +0 -458
  132. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  133. package/docs/security/DISCLOSURE.md +0 -130
  134. package/docs/security/ENCRYPTION.md +0 -57
  135. package/docs/security/FMEA.md +0 -159
  136. package/docs/security/FUZZING.md +0 -114
  137. package/docs/security/HISTORY_FILTERING.md +0 -132
  138. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  139. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  140. package/docs/security/KEYS.md +0 -49
  141. package/docs/security/KEY_ROTATION.md +0 -303
  142. package/docs/security/MCP_POLICY.md +0 -78
  143. package/docs/security/POLICY_RELEASES.md +0 -37
  144. package/docs/security/README.md +0 -28
  145. package/docs/security/SCORECARD.md +0 -195
  146. package/docs/security/SECRETS.md +0 -158
  147. package/docs/security/SECURITY.md +0 -45
  148. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  149. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  150. package/docs/security/SOUP_REGISTER.md +0 -36
  151. package/docs/security/THREAT_MODEL.md +0 -130
  152. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  153. package/docs/security/VERIFY_RELEASE.md +0 -201
  154. package/docs/security/security-pubkey.asc +0 -15
  155. package/docs/stylesheets/extra.css +0 -444
  156. package/docs/themes/README.md +0 -10
  157. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  158. package/docs/themes/hero-shot.svg +0 -78
  159. package/scripts/README.md +0 -123
  160. package/scripts/ci/check-copyright-headers.sh +0 -8
  161. package/scripts/ci/check-shell-preamble.sh +0 -8
  162. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  163. package/scripts/demo/record.sh +0 -43
  164. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  165. package/scripts/diagnostics/alias-governance.sh +0 -138
  166. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  167. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  168. package/scripts/diagnostics/benchmark.sh +0 -408
  169. package/scripts/diagnostics/conflicts.sh +0 -73
  170. package/scripts/diagnostics/doctor-unified.sh +0 -39
  171. package/scripts/diagnostics/doctor.sh +0 -751
  172. package/scripts/diagnostics/drift-dashboard.sh +0 -202
  173. package/scripts/diagnostics/health.sh +0 -623
  174. package/scripts/diagnostics/history-analysis.sh +0 -86
  175. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  176. package/scripts/diagnostics/perf.sh +0 -453
  177. package/scripts/diagnostics/scorecard.sh +0 -119
  178. package/scripts/diagnostics/secret-governance.sh +0 -65
  179. package/scripts/diagnostics/security-score.sh +0 -467
  180. package/scripts/diagnostics/smoke-test.sh +0 -88
  181. package/scripts/diagnostics/snapshot.sh +0 -90
  182. package/scripts/diagnostics/verify.sh +0 -108
  183. package/scripts/diagnostics/verify_state.sh +0 -73
  184. package/scripts/diagnostics/version-locks.sh +0 -94
  185. package/scripts/diagnostics/workstation-attestation.sh +0 -187
  186. package/scripts/dot/commands/agent.sh +0 -485
  187. package/scripts/dot/commands/agents.sh +0 -336
  188. package/scripts/dot/commands/ai.sh +0 -587
  189. package/scripts/dot/commands/aliases.sh +0 -277
  190. package/scripts/dot/commands/appearance.sh +0 -110
  191. package/scripts/dot/commands/completion.sh +0 -134
  192. package/scripts/dot/commands/core.sh +0 -217
  193. package/scripts/dot/commands/diagnostics.sh +0 -265
  194. package/scripts/dot/commands/env-emit.sh +0 -203
  195. package/scripts/dot/commands/fleet.sh +0 -688
  196. package/scripts/dot/commands/init.sh +0 -185
  197. package/scripts/dot/commands/lint.sh +0 -208
  198. package/scripts/dot/commands/manual.sh +0 -169
  199. package/scripts/dot/commands/meta.sh +0 -333
  200. package/scripts/dot/commands/patterns.sh +0 -55
  201. package/scripts/dot/commands/registry.sh +0 -419
  202. package/scripts/dot/commands/restore.sh +0 -232
  203. package/scripts/dot/commands/secrets.sh +0 -296
  204. package/scripts/dot/commands/security.sh +0 -102
  205. package/scripts/dot/commands/tools.sh +0 -556
  206. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  207. package/scripts/dot/powershell/Dot.psm1 +0 -319
  208. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  209. package/scripts/fonts/patch-fonts.sh +0 -36
  210. package/scripts/git-hooks/install.sh +0 -12
  211. package/scripts/git-hooks/pre-commit +0 -12
  212. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  213. package/scripts/git-hooks/pre-push +0 -105
  214. package/scripts/git-hooks/prepare-commit-msg +0 -29
  215. package/scripts/lib/secrets_provider.sh +0 -185
  216. package/scripts/ops/ai-setup.sh +0 -71
  217. package/scripts/ops/bundle.sh +0 -104
  218. package/scripts/ops/chaos.sh +0 -50
  219. package/scripts/ops/chezmoi-apply.sh +0 -333
  220. package/scripts/ops/chezmoi-diff.sh +0 -16
  221. package/scripts/ops/chezmoi-remove.sh +0 -46
  222. package/scripts/ops/chezmoi-update.sh +0 -63
  223. package/scripts/ops/heal-chezmoi.sh +0 -87
  224. package/scripts/ops/heal-system.sh +0 -129
  225. package/scripts/ops/heal-tools.sh +0 -297
  226. package/scripts/ops/heal.sh +0 -223
  227. package/scripts/ops/post-apply-repair.sh +0 -107
  228. package/scripts/ops/prewarm.sh +0 -128
  229. package/scripts/ops/release.sh +0 -262
  230. package/scripts/ops/rollback.sh +0 -604
  231. package/scripts/ops/setup.sh +0 -138
  232. package/scripts/ops/teleport.sh +0 -34
  233. package/scripts/qa/check-version-consistency.sh +0 -124
  234. package/scripts/qa/coverage-baseline.sh +0 -61
  235. package/scripts/qa/docs-coverage.sh +0 -112
  236. package/scripts/qa/examples-coverage.sh +0 -94
  237. package/scripts/qa/powershell-contract.ps1 +0 -95
  238. package/scripts/qa/reliability-audit.sh +0 -139
  239. package/scripts/qa/scorecard-snapshot.sh +0 -128
  240. package/scripts/qa/traceability-coverage.sh +0 -117
  241. package/scripts/qa/validate-examples.sh +0 -27
  242. package/scripts/qa/wsl-contract.sh +0 -12
  243. package/scripts/secrets/age-init.sh +0 -82
  244. package/scripts/secrets/create-secrets-file.sh +0 -46
  245. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  246. package/scripts/security/backup.sh +0 -58
  247. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  248. package/scripts/security/dns-doh.sh +0 -52
  249. package/scripts/security/encryption-check.sh +0 -55
  250. package/scripts/security/enforce-policies.sh +0 -335
  251. package/scripts/security/firewall.sh +0 -91
  252. package/scripts/security/lock-configs.sh +0 -67
  253. package/scripts/security/lock-screen.sh +0 -56
  254. package/scripts/security/manage-secrets.sh +0 -429
  255. package/scripts/security/ssh-cert.sh +0 -204
  256. package/scripts/security/telemetry-kill.sh +0 -51
  257. package/scripts/security/usb-safety.sh +0 -52
  258. package/scripts/theme/apply-gnome-theme.sh +0 -333
  259. package/scripts/theme/extract-heic-frames.sh +0 -115
  260. package/scripts/theme/extract-theme.py +0 -742
  261. package/scripts/theme/install-boot-logo.sh +0 -63
  262. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  263. package/scripts/theme/install-cursors.sh +0 -26
  264. package/scripts/theme/install-file-icons.sh +0 -27
  265. package/scripts/theme/install-grub-theme.sh +0 -62
  266. package/scripts/theme/install-lock-icon.sh +0 -31
  267. package/scripts/theme/merge-wallpaper.sh +0 -146
  268. package/scripts/theme/rebuild-themes.sh +0 -544
  269. package/scripts/theme/switch.sh +0 -449
  270. package/scripts/theme/wallpaper-rotate.sh +0 -137
  271. package/scripts/theme/wallpaper-sync.sh +0 -690
  272. package/scripts/tools/cmatrix.sh +0 -22
  273. package/scripts/tools/detect-collisions.py +0 -103
  274. package/scripts/tools/emoji-picker.sh +0 -49
  275. package/scripts/tools/figlet-banner.sh +0 -19
  276. package/scripts/tools/log-rotate.sh +0 -31
  277. package/scripts/tools/lolcat-wrap.sh +0 -20
  278. package/scripts/tools/pipes.sh +0 -49
  279. package/scripts/tuning/linux.sh +0 -186
  280. package/scripts/tuning/macos.sh +0 -56
  281. package/scripts/uninstall.sh +0 -86
  282. package/scripts/version-sync.sh +0 -654
  283. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  284. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  285. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  286. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  287. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  288. package/templates/projects/go/README.md +0 -7
  289. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  290. package/templates/projects/go/go.mod +0 -3
  291. package/templates/projects/go/go.sum +0 -0
  292. package/templates/projects/molecule/README.md +0 -7
  293. package/templates/projects/molecule/converge.yml +0 -7
  294. package/templates/projects/molecule/molecule.yml +0 -16
  295. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  296. package/templates/projects/node/README.md +0 -7
  297. package/templates/projects/node/package-lock.json +0 -12
  298. package/templates/projects/node/package.json +0 -10
  299. package/templates/projects/node/src/index.js +0 -3
  300. package/templates/projects/packer/README.md +0 -15
  301. package/templates/projects/packer/main.pkr.hcl +0 -15
  302. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  303. package/templates/projects/python/README.md +0 -7
  304. package/templates/projects/python/pyproject.toml +0 -25
  305. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  306. package/templates/projects/python/tests/test_basic.py +0 -3
package/docs/STRUCTURE.md DELETED
@@ -1,102 +0,0 @@
1
- # Repository Structure
2
-
3
- This document maps every top-level path in the repository to its
4
- purpose. Skim it once and you should be able to answer:
5
-
6
- - **Where is the `dot` CLI?** → `bin/dot` (the source-of-truth file). At runtime it lives at `~/.local/bin/dot`.
7
- - **Why are there 20+ `dot_*` files at root?** → chezmoi convention: a `dot_X` source file deploys to `~/.X` on apply. Same for `executable_*` (gains `+x`), `private_*` (`0600`), `run_onchange_*` (re-runs when source changes).
8
- - **What's the framework vs. the maintainer's personal config?** → Everything under `scripts/`, `install/`, `tools/`, `lib/`, and `defaults/.chezmoitemplates/` is framework code. Everything under `defaults/dot_config/`, `defaults/dot_warp/`, `defaults/private_dot_ssh/` is user-facing default configuration (chezmoi auto-rebases via `.chezmoiroot`).
9
-
10
- The Debian/aws-cli-style root layout shipped in **v0.2.503**:
11
- `bin/` (dispatcher), `lib/` (shared bash libs), `defaults/`
12
- (all chezmoi-tracked source files, rebased via
13
- `.chezmoiroot`). Repo root now hosts only project/CI/docs paths.
14
- See `docs/operations/ROADMAP_V0_2_503.md` for the full history.
15
-
16
- ---
17
-
18
- ## Top-level paths
19
-
20
- | Path | Kind | Purpose |
21
- |------|------|---------|
22
- | **CLI + framework** | | |
23
- | `dot_local/bin/` | framework | `executable_dot` (CLI entrypoint) and helper scripts. Deploys to `~/.local/bin/`. |
24
- | `dot_local/share/` | framework | Man pages, zsh completions. Deploys to `~/.local/share/`. |
25
- | `scripts/` | framework | Runtime-invoked scripts (`dot` CLI dispatch + specialised subtrees). See `scripts/README.md`. |
26
- | `tools/` | repo-ops | Repo-only ops: CI helpers, release, maintenance, docs-generation. Not distributable. See `tools/README.md`. |
27
- | `lib/dot/` | framework | Shared bash library sourced by every `dot` subcommand and the dispatcher. Reorganised here from `scripts/dot/lib/` per RFC Phase 1. See `lib/dot/README.md`. |
28
- | `lib/` | framework | Library tree (`lib/dot/` + third-party `lib/wasm-tools/`). |
29
- | `install/` | framework | Bootstrap logic + distribution-channel manifests (`homebrew/`, `scoop/`, `aur/`). See `install/README.md`. `install/provision/` runs on `chezmoi apply` via `run_onchange_*` triggers. |
30
- | `install.sh` | framework | Top-level installer. SHA256-verified chezmoi fetch + initial apply. |
31
- | `.chezmoitemplates/` | framework | Reusable Go-template partials (aliases, functions, paths). Sourced by `dot_*.tmpl` files. |
32
- | **User-facing defaults** | | |
33
- | `dot_bashrc`, `dot_zshrc`, `dot_zshenv`, `dot_zprofile`, `dot_profile`, `dot_vimrc`, etc. | defaults | Shell + editor rc files. Deploy to `~/.X`. |
34
- | `dot_config/` | defaults | XDG config (`~/.config/*`). Largest tree — 80+ tool configs. |
35
- | `dot_local/` (non-bin/share) | defaults | Per-user state files for tools (`dot_local/state/`, etc.). |
36
- | `dot_cargo/`, `dot_etc/`, `dot_warp/` | defaults | Tool-specific roots (cargo, system etc, Warp terminal). |
37
- | `private_dot_ssh/` | defaults | SSH config — chezmoi `private_` prefix forces 0600. Does NOT contain private keys. |
38
- | `dot_claude/` | defaults | Claude Code per-user skills and config. |
39
- | **Templates + data** | | |
40
- | `templates/` | framework | Non-chezmoi templates (e.g. for `dot agents render`). |
41
- | `.chezmoidata/` | data | Hardware presets (`macbook-t2`, `surface-pro`) read by templates. |
42
- | `.chezmoidata.toml` | data | Feature flags + version. Single source-of-truth for `dotfiles_version`. |
43
- | `.chezmoi.toml.tmpl` | framework | Per-host chezmoi config generated on first apply. |
44
- | `.chezmoiignore` / `.chezmoiignore.tmpl` | framework | Tells chezmoi which paths NOT to deploy. |
45
- | **Docs + tests** | | |
46
- | `docs/` | docs | All documentation: `manual/` (user guide), `operations/` (audits, roadmaps), `reference/` (lookup tables), `security/`. |
47
- | `tests/` | tests | Test suite: `framework/` (runner + assertions + mocks), `unit/`, `integration/`, `regression/`, `fuzz/`, `snapshots/`. |
48
- | `examples/` | docs | Standalone examples (mise plugin, AI patterns, ops scripts). |
49
- | **CI + release** | | |
50
- | `.github/` | ci | GitHub Actions workflows + issue/PR templates + repo-level SECURITY/CODEOWNERS. |
51
- | `.devcontainer/` | ci | Dev Container spec for reproducible contributor onboarding. |
52
- | `Dockerfile.test` | ci | Container baseline for the CI test job. |
53
- | `.pre-commit-config.yaml` → `config/pre-commit-config.yaml` | ci | Pre-commit hooks (shellcheck, shfmt, luacheck, gitleaks, typos, conventional-commits). |
54
- | `flake.nix` / `flake.lock` | ci | Nix flake for reproducible dev shell. |
55
- | `mise.toml` / `mise-versions.lock.json` | ci | Pinned tool versions (mise as the package manager). |
56
- | **Misc + agents** | | |
57
- | `AGENTS.md` | docs | Cross-harness AI agent context (the standard read by Codex/Cursor/etc.). |
58
- | `.cursor/`, `.codex/`, `.windsurf/`, `.zed/`, `.roo/`, `.clinerules`, `.aider.conf.yml`, `.continuerc.json`, `.jules/`, `.agy/` | agents | Per-harness AGENTS.md renderings. Generated by `dot agents render`. Each one points back at `CLAUDE.md` as canonical. |
59
- | `CLAUDE.md` | docs | Project guidelines (the canonical source — `dot agents render` propagates it). |
60
- | `CONTRIBUTING.md` | docs | Contributor guide (must stay at root for GitHub auto-discovery). |
61
- | `docs/CONFIG_STRATEGY.md`, `docs/OPENCODE.md` | docs | Strategy + OpenCode-CLI guidance. Moved out of root for cleanliness in v0.2.503. |
62
- | `README.md` / `CHANGELOG.md` / `LICENSE` | docs | Standard project files. |
63
- | `Justfile.tmpl` / `Makefile` | dev | Task runners. |
64
- | `dist/` | build | Build artefacts directory. |
65
- | `coverage/`, `nightly-reports/` | build | CI output directories (gitignored). |
66
- | `nix/` | build | Nix flake source. |
67
- | `.well-known/` | misc | RFC-compliant `.well-known/` content (currently used for WKD GPG key publication). |
68
- | `.version-sync-backup/` | misc | Backup directory used by `scripts/version-sync.sh` during release prep. |
69
-
70
- ## Chezmoi naming contract
71
-
72
- | Prefix / suffix | Effect on deployment |
73
- |---|---|
74
- | `dot_foo` | Deploys as `.foo` (the `dot_` is consumed). |
75
- | `executable_foo` | Adds `+x` permission. |
76
- | `private_foo` | Sets `0600` permission. |
77
- | `run_onchange_foo.sh` | Script re-executes when its hash changes. |
78
- | `*.tmpl` | Processed as a Go template with chezmoi data before deployment. |
79
-
80
- **Critical gotcha:** `executable_dot_foo` deploys as `.foo` (not
81
- `dot_foo`). The `dot_` prefix is consumed by chezmoi after the
82
- `executable_` prefix. Renaming a deployed file silently can leave
83
- stale state in `~/.config/chezmoi/`.
84
-
85
- ## Where to make changes
86
-
87
- | Goal | File(s) to edit |
88
- |------|----------------|
89
- | Add a new `dot <subcommand>` | `scripts/dot/commands/<subcommand>.sh` + dispatch in `bin/dot` + entry in `docs/manual/03-reference/01-dot-cli.md` + entry in `docs/manual/command-index.md`. |
90
- | Change an alias | `.chezmoitemplates/aliases/<file>.aliases.sh` (sourced by `dot_zshrc.tmpl`, etc.). |
91
- | Add a feature flag | `[features]` block in `.chezmoidata.toml` + doc entry in `docs/manual/03-reference/05-feature-flags.md`. |
92
- | Add a new file deployed to `~/.X` | Create `dot_X` at root (or under a chezmoi-managed subtree). |
93
- | Add a new chezmoi template | `dot_X.tmpl` at root, then use `{{ }}` for chezmoi data. |
94
- | Add a CI workflow | `.github/workflows/<name>.yml`. |
95
- | Add a test | `tests/unit/<domain>/test_<name>.sh` or `tests/integration/test_<name>.sh`. |
96
-
97
- ## See also
98
-
99
- - `scripts/README.md` — map of the `scripts/` subtree.
100
- - `CONTRIBUTING.md` — code-style + commit-message + signing requirements.
101
- - `CLAUDE.md` — AI-assistant guidelines (the canonical source for `dot agents render`).
102
- - `docs/operations/ROADMAP_V0_2_503.md` — current release scope, including the v0.2.503 reorganisation plan.
@@ -1,118 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
- {% raw %}
5
-
6
- # ADR-001: Multi-stage CI/CD Pipeline Design
7
-
8
- **Status**: Accepted
9
- **Date**: 2026-02-09
10
- **Authors**: @sebastienrousseau
11
-
12
- ## Context
13
-
14
- The dotfiles repository requires a CI/CD pipeline that:
15
-
16
- - Validates changes across multiple platforms (Linux, macOS)
17
- - Runs security scans to detect secrets and vulnerabilities
18
- - Tests shell scripts, Lua configurations, and Nix expressions
19
- - Maintains fast feedback loops for developers
20
- - Minimizes GitHub Actions costs (runner minutes)
21
-
22
- Traditional approaches run all checks on every commit, leading to:
23
-
24
- - Wasted compute on unrelated changes (e.g., running Lua linting when only docs change)
25
- - High costs from macOS runners ($0.08/min vs $0.008/min for Linux)
26
- - Long feedback times from sequential job execution
27
-
28
- ## Decision
29
-
30
- Implement a **5-stage progressive CI pipeline** with path-based filtering:
31
-
32
- ### Stage 1: Change Detection
33
-
34
- Use `dorny/paths-filter` to detect which file categories changed:
35
-
36
- - `shell`: *.sh, scripts/**, install/**
37
- - `lua`: dot_config/nvim/**, *.lua
38
- - `nix`: nix/**, *.nix
39
- - `config`: dot_*/**, .chezmoitemplates/**
40
-
41
- ### Stage 2: Lint (Parallel, Conditional)
42
-
43
- - **lint-shell**: Only runs if shell files changed
44
- - **lint-lua**: Only runs if Lua files changed
45
- - Run in parallel to minimize wall-clock time
46
-
47
- ### Stage 3: Security (Always on PRs)
48
-
49
- - **secrets-scan**: Gitleaks on every PR (critical)
50
- - **link-check**: Only on schedule (expensive)
51
-
52
- ### Stage 4: Test (Conditional Matrix)
53
-
54
- - Linux-only for PRs (cheapest)
55
- - Full matrix (Linux + macOS) on schedule/manual trigger
56
- - Docker container tests for installation validation
57
-
58
- ### Stage 5: Quality (Schedule/Manual Only)
59
-
60
- - Idempotency verification
61
- - Performance benchmarks
62
- - Nix flake checks
63
-
64
- ### Cost Optimization Strategies
65
-
66
- 1. **Path filters**: Skip jobs when files don't match
67
- 2. **Concurrency groups**: Cancel in-progress runs on new pushes
68
- 3. **Conditional matrices**: Expensive OS testing only on schedule
69
- 4. **Aggressive caching**: Tools, dependencies, databases
70
-
71
- ## Consequences
72
-
73
- ### Positive
74
-
75
- - ~50% reduction in GitHub Actions minutes
76
- - Fast feedback for most changes (1-3 minutes)
77
- - Comprehensive testing still available via schedule/manual
78
- - Clear separation of concerns between stages
79
-
80
- ### Negative
81
-
82
- - Complexity in workflow configuration
83
- - Some bugs might only surface in scheduled runs
84
- - Path filter maintenance required as repo structure evolves
85
-
86
- ### Neutral
87
-
88
- - Developers can trigger full CI manually with `workflow_dispatch`
89
- - Breaking changes to CI require testing across all stages
90
-
91
- ## Implementation
92
-
93
- ```yaml
94
- # Key patterns used
95
- on:
96
- push:
97
- paths:
98
- - '**.sh' # Only trigger on shell changes
99
-
100
- concurrency:
101
- group: ${{ github.workflow }}-${{ github.ref }}
102
- cancel-in-progress: true
103
-
104
- jobs:
105
- changes:
106
- outputs:
107
- shell: ${{ steps.filter.outputs.shell }}
108
-
109
- lint-shell:
110
- needs: changes
111
- if: needs.changes.outputs.shell == 'true'
112
- ```
113
-
114
- ## References
115
-
116
- - [GitHub Actions Path Filtering](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
117
- - [dorny/paths-filter](https://github.com/dorny/paths-filter)
118
- {% endraw %}
@@ -1,130 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # ADR-002: Shell Performance Optimization Strategy
6
-
7
- **Status**: Accepted
8
- **Date**: 2026-02-09
9
- **Authors**: @sebastienrousseau
10
-
11
- ## Context
12
-
13
- Shell startup time directly impacts developer productivity. Every new terminal,
14
- tmux pane, or shell command execution incurs this cost. With rich shell
15
- configurations (completions, prompts, plugins), startup can easily exceed 1-2
16
- seconds.
17
-
18
- Goals:
19
-
20
- - Target startup time: <500ms for interactive shells
21
- - Maintain full functionality (completions, syntax highlighting, git info)
22
- - Support both zsh and bash
23
- - Work across macOS and Linux
24
-
25
- ## Decision
26
-
27
- Implement a **multi-layer performance optimization strategy**:
28
-
29
- ### Layer 1: Compilation and Caching
30
-
31
- ```bash
32
- # Compile zsh files to .zwc format
33
- _cached_eval() {
34
- local cache="$HOME/.cache/zsh/$1.zwc"
35
- if [[ ! -f "$cache" || "$2" -nt "$cache" ]]; then
36
- eval "$($2)" > "$cache.tmp"
37
- zcompile "$cache.tmp" "$cache"
38
- fi
39
- source "$cache"
40
- }
41
- ```
42
-
43
- - Compile frequently-sourced files to bytecode
44
- - Cache command output (brew shellenv, mise activate)
45
- - Invalidate cache when source files change
46
-
47
- ### Layer 2: Lazy Loading
48
-
49
- Defer loading of heavy components until first use:
50
-
51
- ```bash
52
- # Lazy load completions
53
- function kubectl() {
54
- unfunction kubectl
55
- source <(kubectl completion zsh)
56
- kubectl "$@"
57
- }
58
- ```
59
-
60
- - Completions loaded on first command use
61
- - NVM/RVM loaded only when node/ruby commands invoked
62
- - Heavy plugins deferred via zinit's `wait` modifier
63
-
64
- ### Layer 3: Zinit Turbo Mode
65
-
66
- ```zsh
67
- zinit ice wait lucid
68
- zinit light zsh-users/zsh-autosuggestions
69
- ```
70
-
71
- - Plugins load asynchronously after prompt
72
- - Critical plugins (syntax highlighting) load synchronously
73
- - Most plugins have 0ms impact on startup
74
-
75
- ### Layer 4: Conditional Loading
76
-
77
- ```bash
78
- # Only load if command exists
79
- [[ -x /opt/homebrew/bin/brew ]] && eval "$(/opt/homebrew/bin/brew shellenv)"
80
-
81
- # Skip in non-interactive shells
82
- [[ $- != *i* ]] && return
83
- ```
84
-
85
- - Platform-specific code guarded by OS detection
86
- - Heavy features opt-in via environment variables
87
- - Non-interactive shells get minimal config
88
-
89
- ### Monitoring
90
-
91
- Benchmark script to track startup time:
92
-
93
- ```bash
94
- hyperfine --warmup 3 --runs 10 "zsh -i -c exit"
95
- ```
96
-
97
- CI enforces 500ms threshold with warnings.
98
-
99
- ## Consequences
100
-
101
- ### Positive
102
-
103
- - Consistent <500ms startup across platforms
104
- - Full functionality preserved
105
- - Easy to add new tools without performance regression
106
- - Clear patterns for contributors to follow
107
-
108
- ### Negative
109
-
110
- - First invocation of lazy-loaded commands is slower
111
- - Cache invalidation bugs can cause stale behavior
112
- - Complexity in understanding load order
113
-
114
- ### Neutral
115
-
116
- - Profiling required when adding new plugins
117
- - Trade-off between convenience and performance explicit
118
-
119
- ## Measurements
120
-
121
- | Configuration | Startup Time |
122
- |---------------|--------------|
123
- | Vanilla zsh | ~50ms |
124
- | With oh-my-zsh | ~800ms |
125
- | This approach | ~200-400ms |
126
-
127
- ## References
128
-
129
- - [Zsh Startup Optimization](https://htr3n.github.io/2018/07/faster-zsh/)
130
- - [Zinit Turbo Mode](https://zdharma-continuum.github.io/zinit/wiki/INTRODUCTION/)
@@ -1,158 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # ADR-003: Security-First Approach
6
-
7
- **Status**: Accepted
8
- **Date**: 2026-02-09
9
- **Authors**: @sebastienrousseau
10
-
11
- ## Context
12
-
13
- Dotfiles repositories present unique security challenges:
14
-
15
- - They configure system behavior and permissions
16
- - They may contain or reference secrets (API keys, tokens)
17
- - They execute scripts with user privileges
18
- - They're often cloned to multiple machines
19
-
20
- A security breach in dotfiles can compromise all systems using them.
21
-
22
- ## Decision
23
-
24
- Implement a **defense-in-depth security model** with multiple layers:
25
-
26
- ### Layer 1: Secrets Protection
27
-
28
- **Never commit secrets:**
29
-
30
- ```bash
31
- # .gitleaks.toml - block common secret patterns
32
- [[rules]]
33
- id = "generic-api-key"
34
- regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9]{20,})'''
35
- ```
36
-
37
- **Encrypted secrets with age:**
38
-
39
- ```bash
40
- # Secrets stored encrypted, decrypted at apply time
41
- chezmoi.encryption = "age"
42
- chezmoi.age.identity = "~/.config/chezmoi/key.txt"
43
- ```
44
-
45
- **CI enforcement:**
46
-
47
- - Gitleaks runs on every PR
48
- - TruffleHog for verified secrets detection
49
- - Block merge if secrets detected
50
-
51
- ### Layer 2: Input Validation
52
-
53
- **Path traversal prevention:**
54
-
55
- ```bash
56
- # Validate all user inputs
57
- if [[ ! "$template_lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
58
- die "Invalid template name: $template_lang"
59
- fi
60
- ```
61
-
62
- **Safe file operations:**
63
-
64
- ```bash
65
- # Use absolute paths, validate before operations
66
- local real_path
67
- real_path="$(realpath -m "$user_input")"
68
- if [[ "$real_path" != "$allowed_base"/* ]]; then
69
- die "Path outside allowed directory"
70
- fi
71
- ```
72
-
73
- ### Layer 3: Opt-in System Modifications
74
-
75
- **Dangerous operations require explicit consent:**
76
-
77
- ```bash
78
- # Security scripts are opt-in
79
- if [ "${DOTFILES_SECURITY:-0}" != "1" ]; then
80
- echo "Security hardening is opt-in. Set DOTFILES_SECURITY=1 to enable."
81
- exit 0
82
- fi
83
- ```
84
-
85
- **Comprehensive logging:**
86
-
87
- ```bash
88
- # All system modifications logged
89
- log_security_change() {
90
- echo "[$(date -Iseconds)] $1" >> "$HOME/.local/share/dotfiles-security.log"
91
- }
92
- ```
93
-
94
- ### Layer 4: CI Security Scanning
95
-
96
- **Multi-tool approach:**
97
-
98
- - **Gitleaks**: Secrets in git history
99
- - **Shellcheck**: Shell script vulnerabilities
100
- - **Checkov**: Infrastructure misconfigurations
101
- - **Trivy**: Container vulnerabilities (when applicable)
102
- - **CodeQL**: Static analysis for Python/JavaScript
103
-
104
- **Weekly deep scans:**
105
-
106
- ```yaml
107
- schedule:
108
- - cron: '0 2 * * 0' # Weekly security audit
109
- ```
110
-
111
- ### Layer 5: Minimal Privileges
112
-
113
- **Scripts request only needed permissions:**
114
-
115
- ```bash
116
- # Don't run as root unless necessary
117
- if [ "$(id -u)" = "0" ]; then
118
- die "This script should not run as root"
119
- fi
120
-
121
- # Use sudo only for specific commands
122
- sudo sysctl -w net.ipv4.tcp_keepalive_time=60
123
- ```
124
-
125
- ## Consequences
126
-
127
- ### Positive
128
-
129
- - Secrets never enter git history
130
- - System modifications are auditable
131
- - Multiple layers catch different vulnerability types
132
- - Contributors have clear security patterns to follow
133
-
134
- ### Negative
135
-
136
- - Additional complexity in scripts
137
- - Encrypted secrets require key management
138
- - Some features disabled by default (friction)
139
-
140
- ### Neutral
141
-
142
- - Security vs convenience trade-offs explicit
143
- - Regular security audits via scheduled CI
144
-
145
- ## Security Checklist for Contributors
146
-
147
- - [ ] No hardcoded secrets (use environment variables or age encryption)
148
- - [ ] Validate all user inputs
149
- - [ ] Use absolute paths for file operations
150
- - [ ] Document any system modifications
151
- - [ ] Test scripts with shellcheck
152
- - [ ] Add appropriate permission checks
153
-
154
- ## References
155
-
156
- - [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/)
157
- - [Age Encryption](https://github.com/FiloSottile/age)
158
- - [Gitleaks](https://github.com/gitleaks/gitleaks)
@@ -1,171 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # ADR-004: Chezmoi + Custom CLI Wrapper Architecture
6
-
7
- **Status**: Accepted
8
- **Date**: 2026-02-09
9
- **Authors**: @sebastienrousseau
10
-
11
- ## Context
12
-
13
- Managing dotfiles requires:
14
-
15
- - Tracking file changes and applying them consistently
16
- - Handling platform-specific configurations
17
- - Supporting encrypted secrets
18
- - Providing a good developer experience
19
-
20
- Options considered:
21
-
22
- 1. **Bare git repository**: Simple but poor UX, no templating
23
- 2. **GNU Stow**: Symlink-based, limited features
24
- 3. **Chezmoi only**: Powerful but complex CLI
25
- 4. **Custom from scratch**: High maintenance burden
26
- 5. **Chezmoi + wrapper**: Best of both worlds
27
-
28
- ## Decision
29
-
30
- Use **Chezmoi as the core engine** with a **custom `dot` CLI wrapper** that:
31
-
32
- ### Architecture
33
-
34
- ```text
35
- ┌─────────────────────────────────────────────┐
36
- │ dot CLI │
37
- │ (User-friendly interface, custom commands) │
38
- ├─────────────────────────────────────────────┤
39
- │ Command Modules │
40
- │ core │ diagnostics │ tools │ appearance │
41
- │ secrets │ security │ meta │
42
- ├─────────────────────────────────────────────┤
43
- │ Shared Library │
44
- │ utils.sh (resolve_source_dir, run_script) │
45
- ├─────────────────────────────────────────────┤
46
- │ Chezmoi │
47
- │ (Template engine, state management, apply) │
48
- └─────────────────────────────────────────────┘
49
- ```
50
-
51
- ### Core Principles
52
-
53
- **1. Chezmoi handles complexity:**
54
-
55
- - Template rendering with Go text/template
56
- - Encrypted secrets with age
57
- - State tracking (what's applied vs source)
58
- - Cross-platform path handling
59
-
60
- **2. dot CLI handles UX:**
61
-
62
- - Memorable command names (`dot sync` vs `chezmoi apply`)
63
- - Domain-specific commands (`dot doctor`, `dot theme`)
64
- - Integration with external tools (Nix, Docker, Neovim)
65
- - Consistent help and error messages
66
-
67
- **3. Modular command structure:**
68
-
69
- ```text
70
- scripts/dot/
71
- ├── lib/
72
- │ └── utils.sh # Shared functions
73
- └── commands/
74
- ├── core.sh # apply, sync, update, add, diff
75
- ├── diagnostics.sh # doctor, heal, health, benchmark
76
- ├── tools.sh # tools, new, packages
77
- ├── appearance.sh # theme, wallpaper, fonts
78
- ├── secrets.sh # secrets-init, secrets
79
- ├── security.sh # firewall, backup, encrypt-check
80
- └── meta.sh # upgrade, docs, learn
81
- ```
82
-
83
- **4. Delegation pattern:**
84
-
85
- ```bash
86
- # Main dispatcher in dot CLI
87
- dispatch() {
88
- local module="$1" cmd="$2"
89
- shift 2
90
- exec bash "$src_dir/scripts/dot/commands/$module.sh" "$cmd" "$@"
91
- }
92
- ```
93
-
94
- ### Chezmoi Integration Points
95
-
96
- | Feature | Chezmoi | dot CLI |
97
- |---------|---------|---------|
98
- | Apply changes | `chezmoi apply` | `dot sync` |
99
- | View diff | `chezmoi diff` | `dot diff` |
100
- | Edit secrets | `chezmoi edit --encrypted` | `dot secrets` |
101
- | Source directory | `chezmoi source-path` | `dot cd` |
102
- | Health check | `chezmoi doctor` | `dot doctor` (extended) |
103
-
104
- ### Extension Points
105
-
106
- Custom commands can:
107
-
108
- 1. Wrap chezmoi commands with better defaults
109
- 2. Add entirely new functionality (benchmarks, themes)
110
- 3. Integrate with system tools (nix, docker, brew)
111
- 4. Provide interactive experiences (tour, learn)
112
-
113
- ## Consequences
114
-
115
- ### Positive
116
-
117
- - Leverage Chezmoi's battle-tested engine
118
- - User-friendly interface for common tasks
119
- - Easy to add domain-specific commands
120
- - Modular structure enables testing and maintenance
121
- - Single entry point (`dot`) for all operations
122
-
123
- ### Negative
124
-
125
- - Two layers to understand (chezmoi + dot)
126
- - Version coupling between chezmoi and scripts
127
- - Some chezmoi features not exposed via dot
128
-
129
- ### Neutral
130
-
131
- - Advanced users can still use chezmoi directly
132
- - Documentation needed for both layers
133
- - Upgrade path when chezmoi adds new features
134
-
135
- ## Implementation Notes
136
-
137
- ### Adding a New Command
138
-
139
- 1. Identify the appropriate module (or create new one)
140
- 2. Add function `cmd_<name>()` to module
141
- 3. Add case to module's dispatch
142
- 4. Add case to main dot CLI dispatcher
143
- 5. Update help text
144
- 6. Add tests if complex
145
-
146
- ### Module Template
147
-
148
- ```bash
149
- #!/usr/bin/env bash
150
- # Dotfiles CLI - <Category> Commands
151
-
152
- set -e
153
-
154
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
155
- source "$SCRIPT_DIR/../lib/utils.sh"
156
-
157
- cmd_example() {
158
- # Implementation
159
- }
160
-
161
- case "${1:-}" in
162
- example) shift; cmd_example "$@" ;;
163
- *) echo "Unknown command: ${1:-}" >&2; exit 1 ;;
164
- esac
165
- ```
166
-
167
- ## References
168
-
169
- - [Chezmoi Documentation](https://www.chezmoi.io/)
170
- - [Command Pattern](https://refactoring.guru/design-patterns/command)
171
- - [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy)