@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.
Files changed (237) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +113 -45
  3. package/docs/.vitepress/reports/localization-readability-audit.md +4 -0
  4. package/docs/AI.md +8 -2
  5. package/docs/CNAME +1 -0
  6. package/docs/COPYRIGHT +1 -1
  7. package/docs/NAMING_CONVENTIONS.md +7 -0
  8. package/docs/README.md +4 -0
  9. package/docs/_config.yml +59 -0
  10. package/docs/adr/ADR-001-ci-cd-pipeline.md +17 -0
  11. package/docs/adr/ADR-002-shell-performance.md +9 -0
  12. package/docs/adr/ADR-003-security-first.md +18 -0
  13. package/docs/adr/ADR-004-cli-architecture.md +14 -0
  14. package/docs/adr/ADR-005-chezmoi-choice.md +10 -0
  15. package/docs/adr/ADR-006-shell-selection.md +9 -0
  16. package/docs/adr/ADR-007-multi-shell-parity.md +10 -1
  17. package/docs/adr/ADR-008-alias-system-architecture.md +10 -0
  18. package/docs/adr/ADR-009-wallpaper-driven-theming.md +131 -0
  19. package/docs/adr/ADR-010-starship-transient-prompt.md +144 -0
  20. package/docs/adr/ADR-011-nushell-tier3-keep.md +144 -0
  21. package/docs/adr/README.md +7 -0
  22. package/docs/architecture/ARCHITECTURE.md +4 -0
  23. package/docs/architecture/INTEROP.md +8 -0
  24. package/docs/architecture/REPO_LAYOUT.md +5 -1
  25. package/docs/architecture/WALKTHROUGH.md +4 -0
  26. package/docs/architecture/fleet-deployment.md +4 -0
  27. package/docs/archive/EUXIS_2026_REVIEW.md +11 -3
  28. package/docs/archive/LEGACY_ROADMAP.md +45 -27
  29. package/docs/archive/MILESTONE_v0.2.493.md +4 -0
  30. package/docs/archive/PLAN.md +46 -8
  31. package/docs/archive/REPO_AUDIT.md +8 -0
  32. package/docs/guides/INSTALL.md +4 -0
  33. package/docs/guides/NEOVIM_IDE_GUIDE.md +9 -0
  34. package/docs/guides/THEMING.md +8 -0
  35. package/docs/guides/TROUBLESHOOTING.md +28 -0
  36. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +70 -1
  37. package/docs/index.md +6 -2
  38. package/docs/interop/A2A.md +7 -0
  39. package/docs/interop/POWERSHELL.md +102 -0
  40. package/docs/manual/00-introduction.md +5 -1
  41. package/docs/manual/01-concepts/01-architecture.md +4 -0
  42. package/docs/manual/01-concepts/02-trust-model.md +6 -2
  43. package/docs/manual/01-concepts/03-theme-engine.md +4 -0
  44. package/docs/manual/01-concepts/04-fleet.md +7 -1
  45. package/docs/manual/01-concepts/05-self-healing.md +8 -1
  46. package/docs/manual/02-tutorials/01-first-install.md +5 -0
  47. package/docs/manual/02-tutorials/02-add-wallpaper.md +5 -0
  48. package/docs/manual/02-tutorials/03-create-profile.md +6 -0
  49. package/docs/manual/02-tutorials/04-encrypt-secret.md +6 -0
  50. package/docs/manual/02-tutorials/05-deploy-fleet.md +5 -1
  51. package/docs/manual/03-reference/01-dot-cli.md +67 -45
  52. package/docs/manual/03-reference/02-config-files.md +8 -2
  53. package/docs/manual/03-reference/03-environment.md +4 -0
  54. package/docs/manual/03-reference/04-templates.md +7 -1
  55. package/docs/manual/03-reference/05-feature-flags.md +72 -3
  56. package/docs/manual/04-cookbook/01-recipes.md +4 -0
  57. package/docs/manual/04-cookbook/02-troubleshooting.md +32 -0
  58. package/docs/manual/04-cookbook/03-faq.md +8 -0
  59. package/docs/manual/05-appendices/A-platform-matrix.md +4 -0
  60. package/docs/manual/05-appendices/B-security-checklist.md +6 -0
  61. package/docs/manual/05-appendices/C-glossary.md +4 -0
  62. package/docs/manual/05-appendices/D-bibliography.md +5 -1
  63. package/docs/manual/05-appendices/E-license.md +4 -0
  64. package/docs/manual/_toc.yml +1 -1
  65. package/docs/manual/command-index.md +16 -8
  66. package/docs/manual/concept-index.md +4 -0
  67. package/docs/manual/index.md +66 -0
  68. package/docs/operations/ATTESTATION.md +5 -0
  69. package/docs/operations/CI_CADENCE.md +107 -0
  70. package/docs/operations/CI_COMPOSITES.md +156 -0
  71. package/docs/operations/COMPLETIONS.md +123 -0
  72. package/docs/operations/COVERAGE.md +182 -0
  73. package/docs/operations/DRIFT.md +107 -0
  74. package/docs/operations/HARD_AUDIT_2026.md +631 -0
  75. package/docs/operations/MAINTENANCE.md +5 -1
  76. package/docs/operations/MIGRATION.md +14 -6
  77. package/docs/operations/OPERATIONS.md +24 -0
  78. package/docs/operations/PERFORMANCE.md +133 -0
  79. package/docs/operations/REGISTRY.md +89 -0
  80. package/docs/operations/RELIABILITY.md +6 -0
  81. package/docs/operations/ROADMAP.md +36 -18
  82. package/docs/operations/ROADMAP_2026.md +665 -0
  83. package/docs/operations/TESTING.md +4 -0
  84. package/docs/operations/TRACEABILITY.md +7 -0
  85. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +4 -0
  86. package/docs/operations/VERSION_SYNC.md +54 -5
  87. package/docs/reference/ALIASES.md +7 -0
  88. package/docs/reference/ALIASES_CHEATSHEET.md +5 -1
  89. package/docs/reference/ALIASES_DEPRECATIONS.md +5 -1
  90. package/docs/reference/FEATURES.md +4 -0
  91. package/docs/reference/FONTS.md +4 -0
  92. package/docs/reference/POWERSHELL_PARITY.md +80 -0
  93. package/docs/reference/PROFILES.md +4 -0
  94. package/docs/reference/SCREENSHOTS.md +4 -0
  95. package/docs/reference/SCRIPTS.md +4 -0
  96. package/docs/reference/SUPPORT_MATRIX.md +10 -4
  97. package/docs/reference/THEMES.md +4 -0
  98. package/docs/reference/TOOLS.md +4 -0
  99. package/docs/reference/UTILS.md +16 -12
  100. package/docs/registry.json +6 -0
  101. package/docs/security/AI_ACT_COMPLIANCE.md +4 -0
  102. package/docs/security/AUDIT_BYPASS.md +103 -0
  103. package/docs/security/AUTOMATION_SECRETS.md +4 -0
  104. package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
  105. package/docs/security/CI_PINNING.md +113 -0
  106. package/docs/security/COMMIT_SIGNING.md +138 -0
  107. package/docs/security/COMPLIANCE.md +5 -0
  108. package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
  109. package/docs/security/DISCLOSURE.md +130 -0
  110. package/docs/security/ENCRYPTION.md +5 -0
  111. package/docs/security/FMEA.md +4 -0
  112. package/docs/security/HISTORY_FILTERING.md +132 -0
  113. package/docs/security/INCIDENT_RESPONSE.md +4 -0
  114. package/docs/security/INSTALL_VERIFICATION.md +122 -0
  115. package/docs/security/KEYS.md +4 -0
  116. package/docs/security/KEY_ROTATION.md +85 -1
  117. package/docs/security/MCP_POLICY.md +9 -0
  118. package/docs/security/POLICY_RELEASES.md +4 -0
  119. package/docs/security/README.md +4 -0
  120. package/docs/security/SCORECARD.md +140 -0
  121. package/docs/security/SECRETS.md +12 -0
  122. package/docs/security/SECURITY.md +4 -0
  123. package/docs/security/SECURITY_CHECKLIST.md +11 -0
  124. package/docs/security/SHELL_EXEMPTIONS.md +145 -0
  125. package/docs/security/SOUP_REGISTER.md +4 -0
  126. package/docs/security/THREAT_MODEL.md +10 -0
  127. package/docs/security/VERIFICATION_VALIDATION.md +5 -1
  128. package/docs/security/security-pubkey.asc +15 -0
  129. package/docs/themes/README.md +4 -0
  130. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +4 -0
  131. package/dot_config/ai/identity.md +3 -0
  132. package/dot_config/ai/patterns/architect.md +2 -0
  133. package/dot_config/ai/patterns/hardener.md +2 -0
  134. package/dot_config/ai/patterns/refactor.md +2 -0
  135. package/dot_config/alacritty/alacritty.toml.tmpl +3 -3
  136. package/dot_config/atuin/config.toml.tmpl +47 -0
  137. package/dot_config/dotfiles/agent-card.json +1 -1
  138. package/dot_config/dotfiles/boot/README.md +2 -0
  139. package/dot_config/dotfiles/grub/README.md +2 -0
  140. package/dot_config/dotfiles/lock/README.md +2 -0
  141. package/dot_config/fish/conf.d/direnv.fish +4 -0
  142. package/dot_config/fish/conf.d/init.fish.tmpl +21 -0
  143. package/dot_config/fish/conf.d/mise-activate.fish +5 -0
  144. package/dot_config/fish/functions/_cached_eval.fish +84 -11
  145. package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
  146. package/dot_config/foot/foot.ini.tmpl +3 -3
  147. package/dot_config/fuzzel/fuzzel.ini.tmpl +2 -2
  148. package/dot_config/ghostty/config.tmpl +3 -3
  149. package/dot_config/git/hooks/executable_commit-msg +146 -0
  150. package/dot_config/goose/config.yaml +2 -2
  151. package/dot_config/gtk-3.0/gtk.css.tmpl +2 -2
  152. package/dot_config/gtk-3.0/settings.ini.tmpl +2 -2
  153. package/dot_config/gtk-4.0/gtk.css.tmpl +2 -2
  154. package/dot_config/gtk-4.0/settings.ini.tmpl +2 -2
  155. package/dot_config/kitty/kitty.conf.tmpl +3 -3
  156. package/dot_config/mise/config.toml +1 -1
  157. package/dot_config/niri/config.kdl.tmpl +2 -2
  158. package/dot_config/nushell/cached_eval.nu +80 -0
  159. package/dot_config/nushell/env.nu.tmpl +21 -13
  160. package/dot_config/shell/00-core-paths.sh.tmpl +9 -1
  161. package/dot_config/shell/05-core-safety.sh +1 -0
  162. package/dot_config/shell/10-secrets.sh +1 -0
  163. package/dot_config/shell/40-fzf-defaults.sh.tmpl +1 -0
  164. package/dot_config/shell/40-ls-colors.sh +1 -0
  165. package/dot_config/shell/50-logic-functions-core.sh.tmpl +1 -0
  166. package/dot_config/shell/50-logic-functions.sh.tmpl +1 -0
  167. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +1 -0
  168. package/dot_config/shell/90-ux-aliases.sh.tmpl +1 -0
  169. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +1 -0
  170. package/dot_config/shell/README.md +25 -8
  171. package/dot_config/starship.toml.tmpl +2 -2
  172. package/dot_config/tmux/tmux.conf.tmpl +3 -3
  173. package/dot_config/user-dirs.dirs +1 -0
  174. package/dot_config/vscode/settings.json.tmpl +2 -2
  175. package/dot_config/waybar/config.jsonc.tmpl +2 -2
  176. package/dot_config/waybar/style.css.tmpl +2 -2
  177. package/dot_config/wezterm/wezterm.lua.tmpl +3 -3
  178. package/dot_config/zsh/dot_zshrc.tmpl +207 -17
  179. package/dot_config/zsh/rc.d/00-alias-shims.zsh +28 -6
  180. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +27 -7
  181. package/dot_local/bin/executable_bm +2 -0
  182. package/dot_local/bin/executable_dot +56 -9
  183. package/dot_local/bin/executable_dot-bootstrap +0 -1
  184. package/dot_local/bin/executable_dot-load-benchmark +1 -1
  185. package/dot_local/bin/executable_dot-theme-sync +8 -8
  186. package/dot_local/bin/executable_notify +2 -0
  187. package/dot_local/bin/executable_open +2 -0
  188. package/dot_local/bin/executable_tour +4 -2
  189. package/dot_local/bin/executable_up +3 -1
  190. package/dot_local/share/man/man1/dot.1 +1 -1
  191. package/dot_local/share/zsh/completions/_dot +4 -0
  192. package/install.sh +53 -38
  193. package/package.json +1 -1
  194. package/scripts/ci/check-dangerous-chmod.sh +19 -0
  195. package/scripts/ci/check-deps-dev.sh +236 -0
  196. package/scripts/ci/check-insecure-tls.sh +61 -0
  197. package/scripts/ci/check-regression-traceability.sh +67 -0
  198. package/scripts/ci/check-shell-preamble.sh +106 -0
  199. package/scripts/ci/dot-cli-startup-bench.sh +126 -0
  200. package/scripts/ci/install-chezmoi-verified.sh +4 -1
  201. package/scripts/ci/lint-reusable-pins.sh +78 -0
  202. package/scripts/ci/run-coverage.sh +451 -0
  203. package/scripts/ci/validate-chezmoidata.sh +25 -0
  204. package/scripts/ci/windows-smoke-test.ps1 +136 -0
  205. package/scripts/diagnostics/doctor.sh +203 -5
  206. package/scripts/diagnostics/drift-dashboard.sh +177 -13
  207. package/scripts/diagnostics/health.sh +21 -4
  208. package/scripts/diagnostics/perf.sh +304 -77
  209. package/scripts/diagnostics/workstation-attestation.sh +6 -1
  210. package/scripts/dot/commands/agent.sh +33 -27
  211. package/scripts/dot/commands/agents.sh +325 -0
  212. package/scripts/dot/commands/ai.sh +75 -10
  213. package/scripts/dot/commands/aliases.sh +10 -8
  214. package/scripts/dot/commands/core.sh +10 -4
  215. package/scripts/dot/commands/fleet.sh +278 -3
  216. package/scripts/dot/commands/init.sh +184 -0
  217. package/scripts/dot/commands/meta.sh +7 -4
  218. package/scripts/dot/commands/registry.sh +263 -0
  219. package/scripts/dot/commands/tools.sh +49 -1
  220. package/scripts/dot/lib/bento.sh +2 -1
  221. package/scripts/dot/lib/log.sh +6 -0
  222. package/scripts/dot/lib/platform.sh +22 -8
  223. package/scripts/dot/lib/ui.sh +145 -2
  224. package/scripts/dot/lib/utils.sh +6 -1
  225. package/scripts/git-hooks/pre-commit-audit.sh +1 -1
  226. package/scripts/git-hooks/pre-push +66 -3
  227. package/scripts/lib/secrets_provider.sh +32 -6
  228. package/scripts/ops/heal-chezmoi.sh +41 -6
  229. package/scripts/ops/rollback.sh +14 -0
  230. package/scripts/qa/powershell-contract.ps1 +95 -0
  231. package/scripts/security/check-disclosure-key-expiry.sh +110 -0
  232. package/scripts/security/lock-configs.sh +11 -2
  233. package/scripts/theme/merge-wallpaper.sh +4 -0
  234. package/scripts/theme/switch.sh +20 -10
  235. package/scripts/version-sync.sh +3 -0
  236. package/dot_config/atuin/config.toml +0 -40
  237. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # OpenSSF Scorecard
6
+
7
+ This page records the current OpenSSF Scorecard posture for this
8
+ repository, the known gaps, and the remediation roadmap. The badge in
9
+ the README links to the live result; this page is the maintained
10
+ narrative behind it.
11
+
12
+ ## Live score
13
+
14
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sebastienrousseau/dotfiles/badge)](https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles)
15
+
16
+ The badge above is regenerated every Monday at 06:00 UTC and on every
17
+ push to `master` by `.github/workflows/scorecard.yml`. The SARIF
18
+ result is uploaded to GitHub Code Scanning (Security tab) and
19
+ retained as a 30-day workflow artifact.
20
+
21
+ ## Threshold policy
22
+
23
+ | Score | Action |
24
+ |---|---|
25
+ | ≥ 8.0 | Healthy. Keep doing what we're doing. |
26
+ | 7.0 – 7.9 | Acceptable. Tracked. |
27
+ | < 7.0 | Regression — the workflow auto-opens a tracking issue labelled `type:security + priority:high`. |
28
+
29
+ Regressions are triaged within one Monday cycle: identify the check
30
+ that dropped, either remediate or file an exception entry below with
31
+ a rationale and an expiry date.
32
+
33
+ ## Per-check posture (snapshot, master HEAD)
34
+
35
+ The checks below come from OpenSSF Scorecard's published rubric. Tick
36
+ marks reflect this repo's posture at the time of writing — the
37
+ *live* badge is authoritative if these diverge.
38
+
39
+ | Check | Status | Notes |
40
+ |---|---|---|
41
+ | Branch-Protection | ⚠ | `master` requires signed commits, linear history, required checks (`.github/rulesets/master.json`). Scorecard can't read classic protection rules without a fine-grained PAT, so this check reports as `-1` ("internal error"). |
42
+ | Code-Review | ⚠ | Single-maintainer repo; PRs are self-merged after CI. Scorecard scores 0/30 here by design — see `Open findings` below. |
43
+ | Signed-Commits | ✓ | Enforced by pre-push hook (`scripts/git-hooks/pre-push`) and at-push by branch protection (#853 + #857). |
44
+ | Dependency-Update-Tool | ✓ | Dependabot configured for github-actions / npm / docker / devcontainers / uv. |
45
+ | Fuzzing | ⚠ | `install.sh` fuzz harness lives under `tests/fuzz/` (closes #881), but it's shell-based and Scorecard's heuristic only recognizes OSS-Fuzz / ClusterFuzzLite / native Go fuzz / libFuzzer / Atheris. None support shell. Property tests under `tests/unit/functions/test_property_*.sh` cover the closest equivalent surface. |
46
+ | License | ✓ | Apache-2.0 at repo root. |
47
+ | Maintained | ✓ | Active commit cadence; the [README](../../README.md) lists the current `dotfiles_version`. |
48
+ | Pinned-Dependencies | ⚠ | Closed 8 of 14 findings this cycle (every Dockerfile base + every workflow action + 2 `curl \| sh` installers + the `npm install -g npm` upgrade step). 5 residual findings stay open by design — see `Open findings`. |
49
+ | SAST | ✓ | CodeQL (`.github/workflows/codeql.yml`) + Checkov + Grype. |
50
+ | SBOM | ✓ | Generated per PR by `sbom-diff.yml` and per release by `security-release.yml`. |
51
+ | Security-Policy | ✓ | `.github/SECURITY.md` + this page + `docs/security/THREAT_MODEL.md`. |
52
+ | Token-Permissions | ✓ | Top-level `permissions:` blocks restricted to `contents: read`. `write` scopes scoped to the jobs that need them (#886). |
53
+ | Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `master` (#852). |
54
+ | Webhooks | n/a | No external webhooks configured. |
55
+ | CI-Tests | ✓ | Linux + macOS Intel + Apple Silicon matrix; optional Windows. |
56
+ | CII-Best-Practices | ☐ | Not applied yet — see `Open work` below. |
57
+ | Dangerous-Workflow | ✓ | No `pull_request_target` with checkout-PR-code anti-pattern. |
58
+ | Packaging | ✓ | `npm publish --provenance` via OIDC (`.github/workflows/npm-publish.yml`); `policy-bundle-release.yml` for the policy artifact. |
59
+ | Signed-Releases | ⚠ | SLSA provenance + minisig attached via `security-release.yml`; Cosign keyless signing tracked at #876. |
60
+
61
+ ## Open findings
62
+
63
+ The eight items below are surfaced as alerts at
64
+ <https://github.com/sebastienrousseau/dotfiles/security/code-scanning>.
65
+ Each row gives the dismissal **reason** and the exact **comment text**
66
+ to paste when triaging.
67
+
68
+ ### Bucket 1 — Dismiss in the UI (5 items)
69
+
70
+ Scorecard flags every `npm install`, `pip install`, `go install`, and
71
+ `curl | sh` invocation under the `Pinned-Dependencies` check. The five
72
+ below either belong to user-facing "update everything" aliases or are
73
+ false positives in Scorecard's regex.
74
+
75
+ | Path | Reason | Comment to paste |
76
+ |---|---|---|
77
+ | `.chezmoitemplates/aliases/legal/legal.aliases.sh:64` | **Won't fix** | User-facing convenience alias — `go install <fortune-style joke command>@latest`. Pinning by SHA would require users to update the alias manually on every upstream change. Intentional. |
78
+ | `.chezmoitemplates/aliases/update/update.aliases.sh:173` | **Won't fix** | User-facing convenience alias — bulk-update wrapper around `npm`. The alias's purpose is to update everything; pinning defeats it. Intentional. |
79
+ | `dot_local/bin/executable_update:99` | **Won't fix** | `dot_local/bin/executable_update` is the user-invoked "update everything" command. The literal point of `npm update -g` is to update to whatever's latest. Pinning defeats it. Intentional. |
80
+ | `scripts/dot/commands/tools.sh:121` | **False positive** | `npm install --package-lock-only --ignore-scripts --silent` generates a lockfile and does NOT fetch packages. Scorecard's regex matches `npm install` blindly; this invocation has no supply-chain surface. |
81
+ | `install/provision/run_onchange_10-linux-packages.sh.tmpl:369` | **Won't fix** | Already exact-version-pins `aider-chat==0.86.2`. Scorecard wants sha256-hash pinning, which would require a ~2,700-line lockfile covering all 108 transitive deps and re-generated on every aider release — disproportionate maintenance for a single optional provisioning install. |
82
+
83
+ ### Bucket 2 — Architectural (1 item)
84
+
85
+ | Alert | Why architectural |
86
+ |---|---|
87
+ | `CodeReviewID` (high) — score 0 | Scorecard requires every merged PR to record an approval review by a different GitHub user than the author. This repo is single-maintainer; PRs are self-merged after CI. The fix path is either (a) onboard a co-maintainer who reviews PRs before merge, or (b) accept the finding. Dismiss as **Won't fix** with comment: "Single-maintainer project — no second reviewer available. CI gates (47 required checks per PR) substitute for human review." |
88
+
89
+ ### Bucket 3 — External action (2 items)
90
+
91
+ | Alert | Action |
92
+ |---|---|
93
+ | `FuzzingID` (medium) | Dismiss as **Won't fix** with comment: "Repo is bash + Go-template + Lua. ClusterFuzzLite / OSS-Fuzz / native Go fuzz / libFuzzer / Atheris (the frameworks Scorecard recognises) all target compiled languages, none support shell. The `tests/fuzz/fuzz_install.sh` harness + property tests under `tests/unit/functions/test_property_*.sh` cover the equivalent surface." |
94
+ | `CIIBestPracticesID` (low) | Apply at <https://www.bestpractices.dev/projects/new>. ~67 self-attested questions, free, 1-2 hours. After silver-tier approval, paste the badge into `README.md` next to the existing Scorecard badge. Most criteria already met (signed commits, CI, security policy, license). |
95
+
96
+ ## Closed this cycle
97
+
98
+ | Date | Score | Alerts open | Change |
99
+ |---|---|---|---|
100
+ | 2026-05-14 | 6.5 | 28 | First clean publish after fixing the scorecard.yml `uses:`-only restriction (#885). Findings had been hidden by publish-step 400s until then. |
101
+ | 2026-05-14 | 6.5 | 11 | Closed 17 of 28: 10× TokenPermissions (#886), 6× Dockerfile bases (#886), 1× gitleaks fixture (#884). |
102
+ | 2026-05-14 | 6.5 | 9 | Closed 2× `curl \| sh` installers (#888). |
103
+ | 2026-05-14 | 6.5 | 8 | Closed 1× `npm install -g npm@…` via Node 24 bump (#889). |
104
+
105
+ ## Open work
106
+
107
+ - **Apply for the OpenSSF Best Practices Badge** — see Bucket 3 above.
108
+ - **Wire Cosign keyless signing into the release pipeline (#876)** — should push `Signed-Releases` to its maximum.
109
+ - **`harden-runner` block-mode adoption (#878)** — should tighten the `Token-Permissions` check further.
110
+
111
+ ## Exceptions
112
+
113
+ | Check | Expiry | Rationale |
114
+ |---|---|---|
115
+ | *(none currently)* | *—* | *—* |
116
+
117
+ If you add an exception, include the check name, an expiry date
118
+ (don't allow indefinite), and the rationale. Re-evaluate every quarter.
119
+
120
+ ## Refreshing this document
121
+
122
+ ```bash
123
+ # Re-count open alerts:
124
+ gh api 'repos/sebastienrousseau/dotfiles/code-scanning/alerts?state=open&per_page=50' \
125
+ --jq '[.[].rule.id] | group_by(.) | map({rule: .[0], count: length})'
126
+
127
+ # Trigger Scorecard manually:
128
+ gh workflow run scorecard.yml --ref master
129
+ ```
130
+
131
+ If a new category appears, add a row to the matching bucket. If a
132
+ remediation closes one of the rows above, delete the row.
133
+
134
+ ## References
135
+
136
+ - `.github/workflows/scorecard.yml` — the scanner workflow (split into
137
+ `analysis` + `track-regression` jobs per #885).
138
+ - [Scorecard project](https://github.com/ossf/scorecard).
139
+ - [Scorecard checks reference](https://github.com/ossf/scorecard/blob/main/docs/checks.md).
140
+ - Tracking issue [#869](https://github.com/sebastienrousseau/dotfiles/issues/869).
@@ -1,3 +1,8 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+ {% raw %}
5
+
1
6
  # Secrets Management
2
7
 
3
8
  Provider-agnostic secrets via `dot secrets`. Supports macOS Keychain, `pass`, and age-encrypted local storage.
@@ -17,6 +22,7 @@ infra = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "GITHUB_TOKEN"]
17
22
  ```
18
23
 
19
24
  `auto` resolves in this order:
25
+
20
26
  1. `macos-keychain` on macOS
21
27
  2. `pass` when available
22
28
  3. `plain-enc` fallback (age-encrypted local store)
@@ -49,6 +55,7 @@ eval "$(dot env load ai)"
49
55
  When `auto_load = true`, shell startup can load configured buckets automatically via `dot env load <bucket>`.
50
56
 
51
57
  Environment toggles:
58
+
52
59
  - `DOTFILES_SECRETS_PROVIDER`
53
60
  - `DOTFILES_SECRETS_AUTO_LOAD`
54
61
  - `DOTFILES_SECRETS_BUCKET_NAMES`
@@ -89,6 +96,7 @@ secrets_backend = "1password"
89
96
  ```
90
97
 
91
98
  Use in templates:
99
+
92
100
  ```text
93
101
  {{ onepassword "my-secret" "vault-name" }}
94
102
  {{ onepasswordRead "op://vault/item/field" }}
@@ -104,6 +112,7 @@ secrets_backend = "bitwarden"
104
112
  ```
105
113
 
106
114
  Use in templates:
115
+
107
116
  ```text
108
117
  {{ bitwarden "item" "my-login" }}
109
118
  {{ bitwardenFields "item" "my-login" }}
@@ -119,6 +128,7 @@ secrets_backend = "vault"
119
128
  ```
120
129
 
121
130
  Use in templates:
131
+
122
132
  ```text
123
133
  {{ vault "secret/data/my-secret" }}
124
134
  ```
@@ -133,6 +143,7 @@ secrets_backend = "pass"
133
143
  ```
134
144
 
135
145
  Use in templates:
146
+
136
147
  ```text
137
148
  {{ pass "my-secret" }}
138
149
  ```
@@ -144,3 +155,4 @@ See the [chezmoi documentation](https://www.chezmoi.io/user-guide/password-manag
144
155
  - **Never commit** `~/.config/chezmoi/key.txt` to version control.
145
156
  - **Avoid shell history exposure** — use `dot secrets set` which prompts securely.
146
157
  - **Rotate credentials** on a regular schedule.
158
+ {% endraw %}
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Security
2
6
 
3
7
  How dotfiles handles security and system modifications.
@@ -1,27 +1,36 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Security Release Checklist
2
6
 
3
7
  Use this checklist before cutting any new release (e.g., `v0.x.x`) to ensure supply-chain integrity.
4
8
 
5
9
  ## 1. Supply Chain & Installer
10
+
6
11
  - [ ] **Pinned Version**: Update `install.sh` `VERSION` variable to match the release tag.
7
12
  - [ ] **Docs Sync**: Ensure `README.md` and `.github/PULL_REQUEST_TEMPLATE.md` installer URLs point to the new tag (not `main`).
8
13
  - [ ] **Clean Build**: Verify `install.sh` does not curl random scripts from third parties without pinning.
9
14
  - [ ] **SOUP Register**: Review [SOUP_REGISTER.md](/home/seb/.dotfiles/docs/security/SOUP_REGISTER.md) and confirm all active external components have an owner and validation path.
10
15
 
11
16
  ## 2. Secrets & Leak Prevention
17
+
12
18
  - [ ] **SSH Keys**: Scan `dot_ssh/` to ensure no private keys (`id_rsa`, `id_ed25519`) are committed.
13
19
  - [ ] **Env Vars**: Check for hardcoded API tokens in `dot_config/` (use `age` encryption or environment variables instead).
14
20
  - [ ] **Git History**: Run `git secrets` or similar to scan for accidental commits of credentials.
15
21
 
16
22
  ## 3. Platform Safety
23
+
17
24
  - [ ] **WSL Check**: Verify `install.sh` detects WSL and does not try to install systemd services or macOS defaults.
18
25
  - [ ] **Root usage**: Ensure no script requires `sudo` unnecessarily (Principle of Least Privilege).
19
26
 
20
27
  ## 4. Toolchain
28
+
21
29
  - [ ] **Binary Integrity**: Check that `dot_local/bin/` scripts are pure shell/executable and match expected checksums (no binary blobs).
22
30
  - [ ] **Dependency Scan**: Run `npm audit` / `cargo audit` if applicable (currently Node.js legacy is removed).
23
31
 
24
32
  ## 5. MCP (Model Context Protocol) Hardening
33
+
25
34
  - [ ] **Launcher Policy**: Verify `dot mcp` shows only allowlisted launchers (`npx`, `node`, `uvx`).
26
35
  - [ ] **Filesystem Scope**: Ensure no MCP server has broad access (`/`, `/home`, `/Users`).
27
36
  - [ ] **Default Profile**: Confirm only the `strict-local` server set is enabled by default.
@@ -32,6 +41,7 @@ Use this checklist before cutting any new release (e.g., `v0.x.x`) to ensure sup
32
41
  Run `dot mcp --strict --json` to validate all MCP server configurations and capture an audit artifact.
33
42
 
34
43
  ## 6. Release Attestation
44
+
35
45
  - [ ] **SBOM Generation**: Verify `dotfiles-sbom.spdx.json` is generated in release workflow.
36
46
  - [ ] **Attestation Signing**: Confirm `actions/attest-build-provenance` signs the release artifacts.
37
47
  - [ ] **Attestation Verification**: Verify with `gh attestation verify <artifact> --repo sebastienrousseau/dotfiles`.
@@ -39,6 +49,7 @@ Run `dot mcp --strict --json` to validate all MCP server configurations and capt
39
49
  - [ ] **Automation Keying**: Confirm `ACTIONS_BOT_SIGNING_KEY` exists and matches the signer in `dot_config/git/allowed_signers`.
40
50
 
41
51
  ## 7. Final Verification
52
+
42
53
  - [ ] **Docker Test**: Run `docker build -f Dockerfile.test .` to verify clean install.
43
54
  - [ ] **Doctor**: Run `dot doctor` locally.
44
55
  - [ ] **MCP Check**: Run `dot mcp` to verify MCP configuration.
@@ -0,0 +1,145 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # Shell Preamble Exemptions
6
+
7
+ Every bash script in this repo must include `set -euo pipefail` (or
8
+ `set -eu` for POSIX `sh`) within its first 50 lines. The rule is
9
+ enforced by
10
+ [`scripts/ci/check-shell-preamble.sh`](../../scripts/ci/check-shell-preamble.sh),
11
+ wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
12
+ Tests pin the contract under
13
+ [`tests/unit/security/test_shell_preamble_lint.sh`](../../tests/unit/security/test_shell_preamble_lint.sh).
14
+
15
+ ## Why the preamble is mandatory
16
+
17
+ `set -e` fails the script on the first error. `set -u` rejects
18
+ reads of unset variables. `set -o pipefail` propagates the exit
19
+ code of the last failing command in a pipeline rather than only the
20
+ final command's. Together they convert silent failures into loud
21
+ ones — which is the only way to catch them.
22
+
23
+ Real example from this repo's history: `executable_dot-load-benchmark`
24
+ shipped with only `set -e`. A failing pipeline (e.g. `cmd | grep`)
25
+ where `grep` succeeded would still report success even when `cmd`
26
+ crashed. The full triple catches this. The benchmark was upgraded
27
+ in commit 970b631d under #854.
28
+
29
+ ## Exemption categories
30
+
31
+ Two kinds of files legitimately can't enforce the preamble locally:
32
+
33
+ ### 1. Sourced libraries
34
+
35
+ Files loaded via `source` / `.` into a caller's shell context. The
36
+ caller already has `set -euo pipefail`; the library inherits it.
37
+ Adding `set -e` locally would persist after the library returns and
38
+ break the caller's own error-handling logic.
39
+
40
+ These files must carry a comment header in their first 15 lines:
41
+
42
+ ```bash
43
+ # Sourced by <parent>.sh; inherits set -euo pipefail.
44
+ ```
45
+
46
+ The lint accepts files with this marker regardless of preamble
47
+ state. Current adopters:
48
+
49
+ | Path | Sourced by |
50
+ |---|---|
51
+ | `dot_config/shell/00-core-paths.sh.tmpl` | shell init (zsh/bash/fish) |
52
+ | `dot_config/shell/05-core-safety.sh` | shell init |
53
+ | `dot_config/shell/10-secrets.sh` | shell init |
54
+ | `dot_config/shell/40-fzf-defaults.sh.tmpl` | shell init |
55
+ | `dot_config/shell/40-ls-colors.sh` | shell init |
56
+ | `dot_config/shell/50-logic-functions-core.sh.tmpl` | shell init + fish bridge |
57
+ | `dot_config/shell/50-logic-functions.sh.tmpl` | shell init + fish bridge |
58
+ | `dot_config/shell/51-logic-functions-extra.sh.tmpl` | shell init (lazy) |
59
+ | `dot_config/shell/90-ux-aliases.sh.tmpl` | shell init + fish bridge |
60
+ | `dot_config/shell/91-ux-aliases-lazy.sh.tmpl` | shell init (lazy) |
61
+ | `scripts/dot/lib/bento.sh` | dot CLI commands |
62
+ | `scripts/dot/lib/log.sh` | dot CLI + diagnostics |
63
+ | `scripts/dot/lib/platform.sh` | dot CLI commands |
64
+ | `scripts/dot/lib/ui.sh` | dot CLI + diagnostics + ops |
65
+ | `scripts/dot/lib/utils.sh` | dot CLI |
66
+ | `scripts/ops/heal-chezmoi.sh` | `scripts/ops/heal.sh` |
67
+ | `scripts/ops/heal-system.sh` | `scripts/ops/heal.sh` |
68
+ | `scripts/ops/heal-tools.sh` | `scripts/ops/heal.sh` |
69
+
70
+ ### 2. Bulk-sourced fragments (path-skipped)
71
+
72
+ Three directories contain hundreds of alias / function / PATH
73
+ snippets that are sourced into the shell. Annotating each one
74
+ individually would be 300+ marker comments with no extra signal.
75
+ The lint skips them by path:
76
+
77
+ | Path | Contents |
78
+ |---|---|
79
+ | `.chezmoitemplates/aliases/**/*.aliases.sh` | alias definitions sourced into the user's shell. |
80
+ | `.chezmoitemplates/functions/**` | shell-function definitions sourced into the user's shell. |
81
+ | `.chezmoitemplates/paths/**` | `PATH=…:$PATH` snippets concatenated by the shell init. |
82
+
83
+ ### 3. Test scripts (path-skipped)
84
+
85
+ `tests/**` — every file under the test tree is invoked through
86
+ `tests/framework/test_runner.sh` which manages shell options for its
87
+ children. The runner itself has the full preamble; children that
88
+ source the framework inherit it.
89
+
90
+ ### 4. Explicit opt-outs
91
+
92
+ Init fragments and completion scripts that must NOT carry their own
93
+ preamble (e.g., `dot_local/bin/executable_dot_completion`, a zsh
94
+ completion sourced into the interactive shell) can carry an
95
+ explicit marker:
96
+
97
+ ```bash
98
+ # preamble:skip — opt-out for completion / init fragments.
99
+ ```
100
+
101
+ The lint accepts these. Use sparingly.
102
+
103
+ ## Adding a new exemption
104
+
105
+ When you need to mark a new file:
106
+
107
+ 1. **Decide whether it's actually sourced or executed.** If a user
108
+ ever invokes it directly (chmod +x + `./file.sh`), add the
109
+ preamble. If it's only ever `source`d, mark it.
110
+
111
+ 2. **Pick the right marker.**
112
+ - Sourced library: `# Sourced by <caller>; inherits set -euo pipefail.`
113
+ - Completion / init fragment: `# preamble:skip — <why>.`
114
+
115
+ 3. **Run the checker:**
116
+
117
+ ```bash
118
+ ./scripts/ci/check-shell-preamble.sh path/to/file.sh
119
+ ```
120
+
121
+ Exit 0 = lint passes.
122
+
123
+ 4. **If you're adding a new entire directory of fragments**
124
+ (rare — alias buckets, plugin trees), edit the path-skip rule
125
+ in `scripts/ci/check-shell-preamble.sh` and document it in this
126
+ page's "Bulk-sourced fragments" table above.
127
+
128
+ ## CI integration
129
+
130
+ - **Pre-commit hook** (`config/pre-commit-config.yaml` →
131
+ `shell-preamble-check`): blocks `git commit` if a staged shell
132
+ file fails the lint.
133
+ - **CI** (`.github/workflows/reusable-shell-lint.yml`): runs the
134
+ full-repo scan on every PR.
135
+
136
+ A change to either the checker or the marker convention must update
137
+ this page in the same PR.
138
+
139
+ ## References
140
+
141
+ - `scripts/ci/check-shell-preamble.sh` — the lint.
142
+ - `tests/unit/security/test_shell_preamble_lint.sh` — contract test.
143
+ - `config/pre-commit-config.yaml` (`shell-preamble-check` hook).
144
+ - `.github/workflows/reusable-shell-lint.yml` — CI invocation.
145
+ - Issue [#854](https://github.com/sebastienrousseau/dotfiles/issues/854).
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # SOUP Register
2
6
 
3
7
  ## Purpose
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Threat Model
2
6
 
3
7
  Security analysis of the dotfiles distribution. Covers trust boundaries, threat actors, attack surfaces, and mitigations.
@@ -45,6 +49,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
45
49
  **Risk:** Malicious code in sourced files executes with user privileges on every shell start.
46
50
 
47
51
  **Mitigations:**
52
+
48
53
  - All shell scripts pass `shellcheck --severity=error`
49
54
  - `set -euo pipefail` enforced in all operational scripts
50
55
  - `eval` usage hardened with process substitution (`. /dev/stdin`)
@@ -56,6 +61,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
56
61
  **Risk:** API keys, tokens, and SSH keys leaked via git history, shell history, or environment.
57
62
 
58
63
  **Mitigations:**
64
+
59
65
  - [Gitleaks](https://github.com/gitleaks/gitleaks) pre-commit hook blocks secrets in commits
60
66
  - Atuin `history_filter` excludes sensitive patterns
61
67
  - Age encryption for local secret storage
@@ -67,6 +73,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
67
73
  **Risk:** Compromised upstream packages injected into the toolchain.
68
74
 
69
75
  **Mitigations:**
76
+
70
77
  - Nix Flakes provide reproducible, pinned dependencies
71
78
  - Zinit plugin versions pinned (`ver"0.8.0"`)
72
79
  - Neovim plugin versions locked via `lazy-lock.json`
@@ -78,6 +85,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
78
85
  **Risk:** Attacker places malicious binary in a PATH directory that shadows legitimate tools.
79
86
 
80
87
  **Mitigations:**
88
+
81
89
  - PATH construction is deterministic (template-generated)
82
90
  - `~/.local/bin` is user-controlled and checked for writability
83
91
  - No world-writable directories in PATH
@@ -88,6 +96,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
88
96
  **Risk:** Chezmoi template variables could inject shell code if not properly quoted.
89
97
 
90
98
  **Mitigations:**
99
+
91
100
  - Template variables come from `.chezmoidata.toml` (user-controlled)
92
101
  - No external/network data used in templates
93
102
  - Template validation via `chezmoi apply --dry-run` in CI
@@ -97,6 +106,7 @@ The primary trust boundary is the **local machine**. Dotfiles are deployed to an
97
106
  **Risk:** Stale or tampered cache files in `~/.cache/shell/` sourced at startup.
98
107
 
99
108
  **Mitigations:**
109
+
100
110
  - `_cached_eval` validates cache against binary mtime
101
111
  - Cache files are user-owned (0644)
102
112
  - Cache directory is under `$XDG_CACHE_HOME` (user-controlled)
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Verification and Validation Report
2
6
 
3
7
  ## Document Control
@@ -5,7 +9,7 @@
5
9
  | Field | Value |
6
10
  |-------|-------|
7
11
  | Document ID | VV-DOT-001 |
8
- | Version | 0.2.500 |
12
+ | Version | 0.2.501 |
9
13
  | Date | 2026-03-20 |
10
14
  | Author | Repository Maintainer |
11
15
  | Status | Active |
@@ -0,0 +1,15 @@
1
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
2
+
3
+ mDMEagg20hYJKwYBBAHaRw8BAQdAk2HMi5IFTHBGhCtSFzqwsyuVb7mO0iIhoUXR
4
+ mTv/PNK0R1NlYmFzdGllbiBSb3Vzc2VhdSAoRG90ZmlsZXMgU2VjdXJpdHkpIDxz
5
+ ZWN1cml0eUBzZWJhc3RpZW5yb3Vzc2VhdS5jb20+iLUEExYKAF0WIQRVr602T9nb
6
+ OBnmHwyNaI+vqRRGkwUCagg20hsUgAAAAAAEAA5tYW51MiwyLjUrMS4xMiwwLDMC
7
+ GwMFCQWjmoAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQjWiPr6kURpOH
8
+ qQEA4gl4pfhkR9Y3IM6oMHydavrx3CE6mX4YRIkYJ7fYj4UA/iO/54bdjG+wmIrE
9
+ cQ077+ijTTCMnHrosn3E13oQ6NIJuDgEagg20hIKKwYBBAGXVQEFAQEHQKdKJLxe
10
+ xsXBXELbxGHUz2asoTuOnsKk8WEdOyESH3dnAwEIB4iUBBgWCgA8FiEEVa+tNk/Z
11
+ 2zgZ5h8MjWiPr6kURpMFAmoINtIbFIAAAAAABAAObWFudTIsMi41KzEuMTIsMCwz
12
+ AhsMAAoJEI1oj6+pFEaTUw0A/14oNMWsx1gcyx9wl/vy+OgEXoOksxSV+FetAI2Q
13
+ Q7qOAP9pohjVAi40dqfBXv3vet7CV0V4p2kQ+qpQTOPTVafkDA==
14
+ =UtsL
15
+ -----END PGP PUBLIC KEY BLOCK-----
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Theme Gallery
2
6
 
3
7
  Themes are auto-generated from your wallpapers — the available set depends on what's present on your system. Run `dot theme list` to see what's discovered.
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Visual Integrity Report
2
6
 
3
7
  Generated: 2026-04-08
@@ -1,11 +1,13 @@
1
1
  # AI Identity & Preferences
2
2
 
3
3
  ## Profile
4
+
4
5
  - **User**:
5
6
  - **Role**: Senior Software Engineer / Architect
6
7
  - **Expertise**: Rust, TypeScript, Go, DevOps (Nix, Kubernetes), Shell Scripting.
7
8
 
8
9
  ## Coding Style
10
+
9
11
  - **Principles**: Clean code, SOLID, DRY, KISS.
10
12
  - **Preferences**:
11
13
  - Prefer TypeScript over JavaScript.
@@ -15,6 +17,7 @@
15
17
  - **Documentation**: Use JSDoc/TSDoc for code and GitHub-flavored Markdown for docs.
16
18
 
17
19
  ## Workspace Context
20
+
18
21
  - **Environment**: Linux (CachyOS/Arch), macOS.
19
22
  - **Shells**: Zsh (primary), Fish, Nushell, Bash.
20
23
  - **Dotfiles**: Managed by Chezmoi, optimized for performance and security.
@@ -3,12 +3,14 @@
3
3
  You are an expert Shell Infrastructure Architect specializing in the 2026 developer stack.
4
4
 
5
5
  ## Core Directives
6
+
6
7
  - **Subtlety**: Propose changes that integrate seamlessly without adding unnecessary complexity.
7
8
  - **Performance**: Prioritize shell startup speed and binary efficiency (e.g., _cached_eval).
8
9
  - **Architecture**: Adhere to the modular "rc.d" structure and XDG Base Directory standards.
9
10
  - **Tools**: Leverage Mise for runtimes, Nix for declarative environments, and Chezmoi for state management.
10
11
 
11
12
  ## Environment Context
13
+
12
14
  - OS: Arch/CachyOS (optimized for x86-64-v4) or macOS.
13
15
  - Shells: Zsh (primary), Fish, Nushell, Bash.
14
16
  - Security: Age/SOPS for secrets, GPG signing enforced.
@@ -3,11 +3,13 @@
3
3
  You are a security engineer specializing in high-compliance Fintech environments and Post-Quantum Cryptography (PQC).
4
4
 
5
5
  ## Core Directives
6
+
6
7
  - **Zero Trust**: Assume all external scripts are compromised until verified.
7
8
  - **Encryption**: Enforce Age/SOPS for all sensitive data.
8
9
  - **Compliance**: Adhere to 2026 security baselines (GPG signing, SSH certificate authorities).
9
10
  - **Privacy**: Disable all non-essential telemetry at the OS and application level.
10
11
 
11
12
  ## Verification Logic
13
+
12
14
  - Every proposal must include a "Verification" step (e.g., dot verify --security).
13
15
  - Prioritize hardware enclave (TPM/Secure Enclave) integrations.
@@ -3,11 +3,13 @@
3
3
  You are an expert in shell script optimization and POSIX compliance.
4
4
 
5
5
  ## Core Directives
6
+
6
7
  - **Portability**: Ensure scripts work across Zsh, Bash, and Dash unless specifically optimized for a feature shell (like Fish/Nushell).
7
8
  - **Indempotency**: Scripts must be safe to run multiple times without side effects.
8
9
  - **Linting**: Adhere to ShellCheck best practices and strict error handling (set -euo pipefail).
9
10
  - **Latency**: Minimize subshell calls and external binary forks.
10
11
 
11
12
  ## Optimization Strategy
13
+
12
14
  - Use built-in shell features over external commands where possible.
13
15
  - Implement caching mechanisms for heavy computations.
@@ -1,9 +1,9 @@
1
1
  {{- $fontFamily := default "JetBrainsMono Nerd Font" .terminal_font_family -}}
2
2
  {{- $fontSize := default 12 .terminal_font_size -}}
3
- {{- $t := index .themes (default "macos-monterey-dark" .theme) -}}
4
- {{- if not $t -}}{{- $t = index .themes "macos-monterey-dark" -}}{{- end }}
3
+ {{- $t := index .themes (default "big-sur-dark" .theme) -}}
4
+ {{- if not $t -}}{{- $t = index .themes "big-sur-dark" -}}{{- end }}
5
5
  {{- $tt := $t -}}
6
- {{- $themeName := default "macos-monterey-dark" .theme -}}
6
+ {{- $themeName := default "big-sur-dark" .theme -}}
7
7
  {{- if hasSuffix "-light" $themeName -}}
8
8
  {{- $darkTheme := index .themes (printf "%s-dark" (trimSuffix "-light" $themeName)) -}}
9
9
  {{- if $darkTheme -}}{{- $tt = $darkTheme -}}{{- end -}}
@@ -0,0 +1,47 @@
1
+ # Atuin Configuration (~/.config/atuin/config.toml)
2
+ # https://atuin.sh/docs/config
3
+ #
4
+ # This file is templated by chezmoi. The `history_filter` block is sourced
5
+ # from `.chezmoidata/secrets-patterns.toml` (see #872) so the same audited
6
+ # defaults ship to every machine, with per-host extension via
7
+ # `~/.config/chezmoi/chezmoi.toml` → `[data.atuin.history_filter] extra = [...]`.
8
+
9
+ # Core
10
+ update_check = false
11
+ db_path = "~/.local/share/atuin/history.db"
12
+ key_path = "~/.local/share/atuin/key"
13
+ session_path = "~/.local/share/atuin/session"
14
+
15
+ # Sync
16
+ auto_sync = true
17
+ sync_frequency = "10m"
18
+ sync_address = "https://api.atuin.sh"
19
+
20
+ # UI
21
+ style = "compact"
22
+ inline_height = 20
23
+ show_preview = true
24
+ enter_accept = true
25
+
26
+ # Search
27
+ search_mode = "fuzzy"
28
+ filter_mode = "global"
29
+ workspaces = true
30
+
31
+ # Privacy: skip commands that may contain secrets.
32
+ # Defaults come from .chezmoidata/secrets-patterns.toml; the `extra` slot
33
+ # in chezmoi.toml allows per-host extension without editing this template.
34
+ history_filter = [
35
+ {{- range .atuin.history_filter.defaults }}
36
+ {{ . | quote }},
37
+ {{- end }}
38
+ {{- with .atuin.history_filter.extra }}
39
+ {{- range . }}
40
+ {{ . | quote }},
41
+ {{- end }}
42
+ {{- end }}
43
+ ]
44
+
45
+ # Skip ephemeral directories
46
+ secrets_filter = true
47
+ network_timeout = 30
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "specVersion": "0.3",
3
3
  "name": "dotfiles-agent",
4
- "version": "0.2.500",
4
+ "version": "0.2.501",
5
5
  "description": "Trusted workstation agent surface for local shell automation.",
6
6
  "defaultProfile": "ask",
7
7
  "protocols": ["mcp", "a2a"],