@sebastienrousseau/dotfiles 0.2.500 → 0.2.501

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 (204) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +82 -44
  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 +4 -0
  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 +10 -0
  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 +4 -0
  66. package/docs/manual/concept-index.md +4 -0
  67. package/docs/operations/ATTESTATION.md +5 -0
  68. package/docs/operations/CI_CADENCE.md +107 -0
  69. package/docs/operations/CI_COMPOSITES.md +156 -0
  70. package/docs/operations/COMPLETIONS.md +123 -0
  71. package/docs/operations/COVERAGE.md +148 -0
  72. package/docs/operations/DRIFT.md +107 -0
  73. package/docs/operations/MAINTENANCE.md +5 -1
  74. package/docs/operations/MIGRATION.md +14 -6
  75. package/docs/operations/OPERATIONS.md +24 -0
  76. package/docs/operations/PERFORMANCE.md +133 -0
  77. package/docs/operations/RELIABILITY.md +6 -0
  78. package/docs/operations/ROADMAP.md +36 -18
  79. package/docs/operations/TESTING.md +4 -0
  80. package/docs/operations/TRACEABILITY.md +4 -0
  81. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +4 -0
  82. package/docs/operations/VERSION_SYNC.md +54 -5
  83. package/docs/reference/ALIASES.md +7 -0
  84. package/docs/reference/ALIASES_CHEATSHEET.md +5 -1
  85. package/docs/reference/ALIASES_DEPRECATIONS.md +5 -1
  86. package/docs/reference/FEATURES.md +4 -0
  87. package/docs/reference/FONTS.md +4 -0
  88. package/docs/reference/PROFILES.md +4 -0
  89. package/docs/reference/SCREENSHOTS.md +4 -0
  90. package/docs/reference/SCRIPTS.md +4 -0
  91. package/docs/reference/SUPPORT_MATRIX.md +10 -4
  92. package/docs/reference/THEMES.md +4 -0
  93. package/docs/reference/TOOLS.md +4 -0
  94. package/docs/reference/UTILS.md +16 -12
  95. package/docs/security/AI_ACT_COMPLIANCE.md +4 -0
  96. package/docs/security/AUDIT_BYPASS.md +103 -0
  97. package/docs/security/AUTOMATION_SECRETS.md +4 -0
  98. package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
  99. package/docs/security/COMPLIANCE.md +5 -0
  100. package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
  101. package/docs/security/ENCRYPTION.md +5 -0
  102. package/docs/security/FMEA.md +4 -0
  103. package/docs/security/HISTORY_FILTERING.md +132 -0
  104. package/docs/security/INCIDENT_RESPONSE.md +4 -0
  105. package/docs/security/INSTALL_VERIFICATION.md +122 -0
  106. package/docs/security/KEYS.md +4 -0
  107. package/docs/security/KEY_ROTATION.md +4 -0
  108. package/docs/security/MCP_POLICY.md +9 -0
  109. package/docs/security/POLICY_RELEASES.md +4 -0
  110. package/docs/security/README.md +4 -0
  111. package/docs/security/SCORECARD.md +80 -0
  112. package/docs/security/SECRETS.md +12 -0
  113. package/docs/security/SECURITY.md +4 -0
  114. package/docs/security/SECURITY_CHECKLIST.md +11 -0
  115. package/docs/security/SHELL_EXEMPTIONS.md +145 -0
  116. package/docs/security/SOUP_REGISTER.md +4 -0
  117. package/docs/security/THREAT_MODEL.md +10 -0
  118. package/docs/security/VERIFICATION_VALIDATION.md +5 -1
  119. package/docs/themes/README.md +4 -0
  120. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +4 -0
  121. package/dot_config/ai/identity.md +3 -0
  122. package/dot_config/ai/patterns/architect.md +2 -0
  123. package/dot_config/ai/patterns/hardener.md +2 -0
  124. package/dot_config/ai/patterns/refactor.md +2 -0
  125. package/dot_config/alacritty/alacritty.toml.tmpl +3 -3
  126. package/dot_config/atuin/config.toml.tmpl +47 -0
  127. package/dot_config/dotfiles/agent-card.json +1 -1
  128. package/dot_config/dotfiles/boot/README.md +2 -0
  129. package/dot_config/dotfiles/grub/README.md +2 -0
  130. package/dot_config/dotfiles/lock/README.md +2 -0
  131. package/dot_config/fish/conf.d/init.fish.tmpl +21 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +84 -11
  133. package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
  134. package/dot_config/foot/foot.ini.tmpl +3 -3
  135. package/dot_config/fuzzel/fuzzel.ini.tmpl +2 -2
  136. package/dot_config/ghostty/config.tmpl +3 -3
  137. package/dot_config/git/hooks/executable_commit-msg +146 -0
  138. package/dot_config/goose/config.yaml +2 -2
  139. package/dot_config/gtk-3.0/gtk.css.tmpl +2 -2
  140. package/dot_config/gtk-3.0/settings.ini.tmpl +2 -2
  141. package/dot_config/gtk-4.0/gtk.css.tmpl +2 -2
  142. package/dot_config/gtk-4.0/settings.ini.tmpl +2 -2
  143. package/dot_config/kitty/kitty.conf.tmpl +3 -3
  144. package/dot_config/mise/config.toml +1 -1
  145. package/dot_config/niri/config.kdl.tmpl +2 -2
  146. package/dot_config/nushell/cached_eval.nu +80 -0
  147. package/dot_config/nushell/env.nu.tmpl +21 -13
  148. package/dot_config/shell/00-core-paths.sh.tmpl +1 -0
  149. package/dot_config/shell/05-core-safety.sh +1 -0
  150. package/dot_config/shell/10-secrets.sh +1 -0
  151. package/dot_config/shell/40-fzf-defaults.sh.tmpl +1 -0
  152. package/dot_config/shell/40-ls-colors.sh +1 -0
  153. package/dot_config/shell/50-logic-functions-core.sh.tmpl +1 -0
  154. package/dot_config/shell/50-logic-functions.sh.tmpl +1 -0
  155. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +1 -0
  156. package/dot_config/shell/90-ux-aliases.sh.tmpl +1 -0
  157. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +1 -0
  158. package/dot_config/shell/README.md +25 -8
  159. package/dot_config/starship.toml.tmpl +2 -2
  160. package/dot_config/tmux/tmux.conf.tmpl +3 -3
  161. package/dot_config/user-dirs.dirs +1 -0
  162. package/dot_config/vscode/settings.json.tmpl +2 -2
  163. package/dot_config/waybar/config.jsonc.tmpl +2 -2
  164. package/dot_config/waybar/style.css.tmpl +2 -2
  165. package/dot_config/wezterm/wezterm.lua.tmpl +3 -3
  166. package/dot_config/zsh/dot_zshrc.tmpl +154 -17
  167. package/dot_config/zsh/rc.d/00-alias-shims.zsh +28 -6
  168. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +26 -6
  169. package/dot_local/bin/executable_bm +2 -0
  170. package/dot_local/bin/executable_dot +9 -2
  171. package/dot_local/bin/executable_dot-load-benchmark +1 -1
  172. package/dot_local/bin/executable_notify +2 -0
  173. package/dot_local/bin/executable_open +2 -0
  174. package/dot_local/bin/executable_tour +4 -2
  175. package/dot_local/bin/executable_up +3 -1
  176. package/install.sh +12 -4
  177. package/package.json +1 -1
  178. package/scripts/ci/check-dangerous-chmod.sh +19 -0
  179. package/scripts/ci/check-deps-dev.sh +236 -0
  180. package/scripts/ci/check-insecure-tls.sh +61 -0
  181. package/scripts/ci/check-regression-traceability.sh +67 -0
  182. package/scripts/ci/check-shell-preamble.sh +106 -0
  183. package/scripts/ci/run-coverage.sh +362 -0
  184. package/scripts/ci/validate-chezmoidata.sh +25 -0
  185. package/scripts/diagnostics/doctor.sh +173 -5
  186. package/scripts/diagnostics/drift-dashboard.sh +177 -13
  187. package/scripts/diagnostics/health.sh +21 -4
  188. package/scripts/diagnostics/perf.sh +304 -77
  189. package/scripts/diagnostics/workstation-attestation.sh +6 -1
  190. package/scripts/dot/commands/agent.sh +14 -5
  191. package/scripts/dot/commands/ai.sh +75 -10
  192. package/scripts/dot/lib/bento.sh +2 -1
  193. package/scripts/dot/lib/log.sh +6 -0
  194. package/scripts/dot/lib/platform.sh +1 -0
  195. package/scripts/dot/lib/ui.sh +11 -0
  196. package/scripts/dot/lib/utils.sh +5 -0
  197. package/scripts/git-hooks/pre-commit-audit.sh +1 -1
  198. package/scripts/git-hooks/pre-push +66 -3
  199. package/scripts/ops/heal-chezmoi.sh +41 -6
  200. package/scripts/qa/powershell-contract.ps1 +95 -0
  201. package/scripts/theme/merge-wallpaper.sh +4 -0
  202. package/scripts/theme/switch.sh +20 -10
  203. package/dot_config/atuin/config.toml +0 -40
  204. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
@@ -0,0 +1,127 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # CI Egress Allowlist
6
+
7
+ This page documents the network endpoints CI jobs are allowed to
8
+ reach when `step-security/harden-runner` is operating in `block`
9
+ mode. Managed under
10
+ [#878](https://github.com/sebastienrousseau/dotfiles/issues/878).
11
+
12
+ ## Status
13
+
14
+ All 76 jobs across the 28 workflow files in `.github/workflows/` are
15
+ currently in **`audit` mode** — harden-runner is the first step in
16
+ every job and records outbound network calls to the
17
+ [step-security telemetry dashboard](https://app.stepsecurity.io) but
18
+ does not block them.
19
+
20
+ The next iteration (tracked as a follow-up under #878) flips each
21
+ group to `block` once the audit-mode runs confirm the allowlist is
22
+ complete. Switching one job at a time keeps blast radius small:
23
+ a missing endpoint on a `block`-mode job fails the run loud and the
24
+ list below gets updated.
25
+
26
+ ## Allowlist (by domain)
27
+
28
+ This is the union of endpoints the entire workflow surface needs.
29
+ When flipping a specific job to `block` mode, narrow this list to
30
+ the endpoints that particular job actually touches.
31
+
32
+ ### GitHub itself (universally required)
33
+
34
+ | Endpoint | Used by | Why |
35
+ |---|---|---|
36
+ | `github.com:443` | every job | git clone, gh CLI |
37
+ | `api.github.com:443` | every job | gh CLI, issue/PR API |
38
+ | `objects.githubusercontent.com:443` | every job | release-asset downloads, LFS objects |
39
+ | `*.actions.githubusercontent.com:443` | every job | runner ↔ orchestrator |
40
+ | `pkg.actions.githubusercontent.com:443` | every job | action-cache CDN |
41
+ | `results-receiver.actions.githubusercontent.com:443` | every job | workflow telemetry |
42
+ | `codeload.github.com:443` | jobs that `git clone` tagged refs | tarball downloads for some actions |
43
+ | `uploads.github.com:443` | jobs that upload artifacts | `actions/upload-artifact` |
44
+ | `raw.githubusercontent.com:443` | the install-script jobs | curl-pull of unversioned content |
45
+
46
+ ### Package managers (apt, brew, cargo, npm, luarocks)
47
+
48
+ | Endpoint | Used by | Why |
49
+ |---|---|---|
50
+ | `azure.archive.ubuntu.com:443` | ubuntu jobs running `apt-get` | apt mirror |
51
+ | `archive.ubuntu.com:80` | ubuntu jobs running `apt-get` | apt mirror |
52
+ | `security.ubuntu.com:80` | ubuntu jobs running `apt-get` | security updates |
53
+ | `keyserver.ubuntu.com:443` | jobs that add repo signing keys | GPG keyserver |
54
+ | `formulae.brew.sh:443` | macOS jobs running `brew` | Homebrew formula index |
55
+ | `ghcr.io:443` + `*.docker.io:443` | docker / container jobs | image pulls |
56
+ | `registry.npmjs.org:443` | npm-publish.yml + the pre-commit npm hook | npm metadata + publish |
57
+ | `registry-1.docker.io:443` | docker jobs | image manifests |
58
+ | `crates.io:443` + `static.crates.io:443` | cargo-install jobs | crate downloads |
59
+ | `index.crates.io:443` | cargo-install jobs | crate index |
60
+ | `luarocks.org:443` + `*.luarocks.org:443` | reusable-lua-lint.yml | luacheck install |
61
+
62
+ ### Project-specific installers (chezmoi / mise / starship / stylua / typos / etc.)
63
+
64
+ | Endpoint | Used by | Why |
65
+ |---|---|---|
66
+ | `get.chezmoi.io:443` | `setup-chezmoi` composite (fallback path) | chezmoi installer |
67
+ | `mise.run:443` | `setup-mise` composite | mise installer |
68
+ | `releases.starship.rs:443` | mise-managed install of starship | starship binary |
69
+
70
+ ### Security / SBOM / scanning
71
+
72
+ | Endpoint | Used by | Why |
73
+ |---|---|---|
74
+ | `api.osv.dev:443` | grype / scorecard | OSV vuln database |
75
+ | `vulners.com:443` | grype | vulnerability metadata |
76
+ | `toolbox-data.anchore.io:443` | anchore/sbom-action | SBOM tooling |
77
+ | `api.deps.dev:443` | future deps.dev integration (#877) | package metadata |
78
+ | `api.securityscorecards.dev:443` | scorecard.yml | publish_results upload |
79
+ | `*.codeql.github.com:443` | codeql.yml | CodeQL bundle download |
80
+
81
+ ## Job-level egress notes (legitimate broad-egress jobs)
82
+
83
+ A few jobs need wider network access than the standard allowlist
84
+ covers. Each carries an inline comment near the harden-runner step
85
+ explaining the deviation so reviewers can audit at a glance.
86
+
87
+ ### `update-deps.yml` — broad GitHub API egress
88
+
89
+ Polls multiple `github.com/<repo>/releases/latest` endpoints to find
90
+ new tool versions. Allowlist needs to include `api.github.com:443`
91
+ and the raw-content domain for sed-replacing version strings.
92
+
93
+ ### `devcontainer-prebuild.yml` — registry push
94
+
95
+ Pushes to `ghcr.io:443` with the `packages: write` token. The egress
96
+ allowlist for that job is the standard set plus `ghcr.io` writes.
97
+
98
+ ### `nightly.yml` — `Beta/Nightly Tools Test` job
99
+
100
+ This job deliberately runs `curl ... | tar -xJf -` against the
101
+ shellcheck release. Justified because the job is `continue-on-error: true`
102
+ and is opt-in (manual or scheduled). Future hardening: download the
103
+ release asset, verify a known hash, then exec — same shape as
104
+ `scripts/ci/install-chezmoi-verified.sh`.
105
+
106
+ ## Updating this page
107
+
108
+ Whenever a job is flipped to `block` mode:
109
+
110
+ 1. Run the audit-mode workflow at least once after every recent
111
+ workflow change to make sure the harden-runner telemetry reflects
112
+ reality.
113
+ 2. Visit the [step-security dashboard](https://app.stepsecurity.io/)
114
+ filtered to the repo + job + last 7 days.
115
+ 3. Add any endpoints the dashboard reports that aren't already in
116
+ this page's tables.
117
+ 4. Edit the job to set `egress-policy: block` and add the per-job
118
+ `allowed-endpoints:` block listing only what that specific job
119
+ needs (not the whole union).
120
+ 5. Land the change, watch the first run; if anything fails the run
121
+ loud, add the missing endpoint and retry.
122
+
123
+ ## References
124
+
125
+ - `step-security/harden-runner` — [https://github.com/step-security/harden-runner](https://github.com/step-security/harden-runner)
126
+ - `docs/security/SCORECARD.md` — Token-Permissions check ties to harden-runner adoption.
127
+ - Issue [#878](https://github.com/sebastienrousseau/dotfiles/issues/878).
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Compliance Architecture
2
6
 
3
7
  This document describes the compliance, security, and cross-platform compatibility controls implemented in this repository, mapped to standard regulatory frameworks (SOC 2, ISO 27001, GDPR).
@@ -77,6 +81,7 @@ All network operations require valid TLS certificates:
77
81
  | Plaintext HTTP | `http://` URLs | CI warning |
78
82
 
79
83
  **Files:**
84
+
80
85
  - Pre-commit: `config/pre-commit-config.yaml`
81
86
  - CI: `.github/workflows/compliance-guard.yml`
82
87
 
@@ -0,0 +1,86 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # deps.dev Advisory Exceptions
6
+
7
+ The CI workflow `.github/workflows/deps-dev-validation.yml` scans
8
+ direct dependencies (npm + PyPI + GitHub Actions) against the
9
+ [deps.dev Insights API](https://docs.deps.dev/) on every PR, every
10
+ push to `master`, and every Tuesday at 04:00 UTC. When an advisory
11
+ is reported at or above the threshold (default `HIGH`), the workflow
12
+ fails.
13
+
14
+ This page is where time-bound exceptions live. An entry here suppresses
15
+ the check for one specific `(ecosystem, package)` pair, with an expiry
16
+ date so the exception cannot accumulate quietly.
17
+
18
+ Managed under [#877](https://github.com/sebastienrousseau/dotfiles/issues/877).
19
+
20
+ ## Active exceptions
21
+
22
+ _(none currently)_
23
+
24
+ ## Adding an exception
25
+
26
+ Add an entry below in this exact format — the scanner greps for
27
+ `` `<ecosystem>:<package>` `` at the start of a line (case-sensitive,
28
+ backtick-delimited):
29
+
30
+ ```
31
+ `NPM:lodash` (expires 2026-12-31): Maintained fork; advisory affects
32
+ only the unused stream-API code path. Confirmed via static analysis.
33
+ Tracked under #NNNN.
34
+ ```
35
+
36
+ `<ecosystem>` is one of:
37
+
38
+ | Ecosystem | Source |
39
+ |---|---|
40
+ | `NPM` | `package.json` direct deps |
41
+ | `PYPI` | `pyproject.toml` direct deps |
42
+ | `GITHUB_ACTIONS` | `uses:` references in `.github/workflows/*.yml` |
43
+
44
+ `(expires YYYY-MM-DD)` is required. Use a 90-day window for routine
45
+ work; longer windows need a sentence explaining why and a follow-up
46
+ issue link.
47
+
48
+ ## When to add vs not add
49
+
50
+ **Legitimate exception**:
51
+
52
+ - The advisory is in a code path your usage doesn't reach (e.g.
53
+ vulnerable function isn't called by anything in this repo).
54
+ - The upstream fix is in flight and you've already opened a PR or
55
+ bumped to a beta.
56
+ - The package is end-of-life and you're tracking the migration to a
57
+ successor under a dedicated issue.
58
+
59
+ **Not an exception** — fix the dep instead:
60
+
61
+ - "Bumping the version is annoying" — that's the whole point of the
62
+ gate.
63
+ - "The advisory might be a false positive" — verify via deps.dev's
64
+ underlying source; if confirmed FP, file with deps.dev rather than
65
+ exception here.
66
+ - "We don't have time this sprint" — that's a deferral, not an
67
+ exception. Bump the issue to next sprint, don't suppress.
68
+
69
+ ## Expiry policy
70
+
71
+ The scanner does not currently parse expiry dates (deferred — needs
72
+ a date-comparison helper). A monthly maintainer review of this page
73
+ is the human gate. Any entry past its expiry should either be
74
+ resolved (dep bumped, exception removed) or re-justified with a new
75
+ expiry.
76
+
77
+ When the date-parsing automation lands, expired exceptions will
78
+ auto-fail the gate even when they're still listed here.
79
+
80
+ ## References
81
+
82
+ - [`scripts/ci/check-deps-dev.sh`](../../scripts/ci/check-deps-dev.sh) — the scanner.
83
+ - [`.github/workflows/deps-dev-validation.yml`](../../.github/workflows/deps-dev-validation.yml) — CI wiring.
84
+ - [`tests/unit/security/test_check_deps_dev.sh`](../../tests/unit/security/test_check_deps_dev.sh) — contract test against canned fixtures.
85
+ - [deps.dev API reference](https://docs.deps.dev/api/v3/).
86
+ - Issue [#877](https://github.com/sebastienrousseau/dotfiles/issues/877).
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Secrets Encryption with SOPS and age
2
6
 
3
7
  ## Quick Start
@@ -30,6 +34,7 @@ sops secrets.sops.yaml
30
34
  ## Recovery
31
35
 
32
36
  If you lose your age private key, follow these steps:
37
+
33
38
  1. Create a new key: `age-keygen -o ~/.config/sops/age/keys.txt`
34
39
  2. Re-encrypt all secrets with the new public key.
35
40
  3. Update `.sops.yaml` with the new public key.
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Failure Mode and Effects Analysis (FMEA)
2
6
 
3
7
  Systematic risk assessment of the chezmoi-managed dotfiles repository per IEC 60812 methodology. Identifies failure modes, quantifies risk priority, and documents mitigations across all configuration management subsystems.
@@ -0,0 +1,132 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # Atuin History Filtering
6
+
7
+ This page documents how high-risk command patterns are excluded from
8
+ Atuin shell history, how to extend the list for your machine, and the
9
+ trade-offs of filter design.
10
+
11
+ ## Why
12
+
13
+ Atuin syncs shell history across machines and exposes a fuzzy-search UI
14
+ (`Ctrl-R`). Without a filter, every command — including ones that
15
+ contain secrets passed inline (`AWS_SECRET_ACCESS_KEY=...`, `op run`,
16
+ `vault read`, `curl -H 'Authorization: Bearer ...'`) — is captured,
17
+ synced to a remote service, and made grep-able.
18
+
19
+ The `history_filter` array in `~/.config/atuin/config.toml` lists
20
+ regular expressions that, if matched, prevent Atuin from recording the
21
+ command at all (it never enters the local DB, and therefore never
22
+ syncs).
23
+
24
+ ## How it ships
25
+
26
+ Patterns are sourced from `.chezmoidata/secrets-patterns.toml` and
27
+ materialised into `~/.config/atuin/config.toml` by the chezmoi template
28
+ at `dot_config/atuin/config.toml.tmpl`.
29
+
30
+ ```
31
+ .chezmoidata/secrets-patterns.toml
32
+ └── [atuin.history_filter]
33
+ defaults = [...] # audited baseline (this repo)
34
+ extra = [...] # empty by default; populated per machine
35
+
36
+ dot_config/atuin/config.toml.tmpl
37
+ └── chezmoi apply ─────► ~/.config/atuin/config.toml
38
+ ```
39
+
40
+ Run `chezmoi apply ~/.config/atuin/config.toml` after editing the
41
+ defaults; `dot doctor` reports the count of deployed patterns and
42
+ fails loud if the block is missing.
43
+
44
+ ## What's filtered by default
45
+
46
+ The audited baseline covers:
47
+
48
+ - Generic env-var exports: `^export (SECRET|TOKEN|PASSWORD|API_KEY|AWS_)`,
49
+ `^PASSWORD=`, `^[A-Z_]+_TOKEN=`, `^[A-Z_]+_KEY=`.
50
+ - Cloud provider auth: `aws ... configure|auth|login`, `gcloud auth ...`,
51
+ `az login`, `kubectl ... --kubeconfig`.
52
+ - AI provider keys: Anthropic, OpenAI, Gemini, Mistral.
53
+ - SaaS secrets: Stripe, GitHub PAT (`GH_TOKEN`, `GITHUB_TOKEN`), `NPM_TOKEN`,
54
+ `CARGO_REGISTRY_TOKEN`.
55
+ - Authorization headers (`curl -H 'Authorization: ...'`).
56
+ - Embedded creds in git URLs (`git clone https://user:pass@...`).
57
+ - Secret managers: `vault`, `op` (1Password), `chamber`.
58
+ - Key material: `ssh-keygen`, `ssh-add`, `gpg --import|--export-secret`,
59
+ `age -d|-e --passphrase`.
60
+ - DB connection strings with inline creds
61
+ (`postgres|mysql|mongodb|redis://user:pass@host`).
62
+
63
+ See `.chezmoidata/secrets-patterns.toml` for the canonical list.
64
+
65
+ ## Adding per-host patterns
66
+
67
+ Each contributor or machine can extend the list without editing the
68
+ shared template. In `~/.config/chezmoi/chezmoi.toml`:
69
+
70
+ ```toml
71
+ [data.atuin.history_filter]
72
+ extra = [
73
+ "^my-private-tool ",
74
+ "^OUR_CORP_API_KEY=",
75
+ "tailscale up --auth-key=",
76
+ ]
77
+ ```
78
+
79
+ Then re-apply:
80
+
81
+ ```bash
82
+ chezmoi apply ~/.config/atuin/config.toml
83
+ ```
84
+
85
+ The `extra` patterns are appended to the defaults in the deployed
86
+ config.
87
+
88
+ ## Adding a pattern to the project defaults
89
+
90
+ Edit `.chezmoidata/secrets-patterns.toml` and add a regex to
91
+ `[atuin.history_filter].defaults`. Then:
92
+
93
+ 1. Add a fixture command to `tests/unit/secrets/test_atuin_history_filter.sh`
94
+ under `LEAKED_FIXTURES` — your new pattern must catch at least one
95
+ real-shape command.
96
+ 2. Run the test: `bash tests/unit/secrets/test_atuin_history_filter.sh`.
97
+ 3. Add a benign-fixture if your regex is broad enough to risk false
98
+ positives.
99
+ 4. Open a PR; CI runs the same test.
100
+
101
+ ## Trade-offs
102
+
103
+ `history_filter` is a deny-list. Two classes of failure to design
104
+ around:
105
+
106
+ - **False positives**: an overly broad regex hides commands the user
107
+ needs to recall. Mitigation: every new pattern must include a
108
+ fixture under `BENIGN_FIXTURES` that the regex correctly does *not*
109
+ match.
110
+ - **False negatives**: a new secret format ships, no pattern matches,
111
+ the secret lands in history. Mitigation: the OpenSSF Scorecard
112
+ workflow (issue #869) and the nightly drift detector (#875) will
113
+ surface new exposure surfaces; review them quarterly.
114
+
115
+ `history_filter` does not replace:
116
+
117
+ - A real secret manager (`age`/`sops`, 1Password, Vault) — see
118
+ `docs/security/ENCRYPTION.md`.
119
+ - Pre-commit `gitleaks` / `detect-secrets` scans — see
120
+ `config/pre-commit-config.yaml`.
121
+ - Server-side audit logging — see `docs/security/COMPLIANCE.md`.
122
+
123
+ It's the last line of defence against accidental command-line capture,
124
+ not the first.
125
+
126
+ ## References
127
+
128
+ - Atuin config schema: <https://atuin.sh/docs/config>
129
+ - Chezmoi template data: <https://www.chezmoi.io/reference/templates/>
130
+ - Issue #872 (this hardening)
131
+ - `tests/unit/secrets/test_atuin_history_filter.sh` (pattern-coverage test)
132
+ - `scripts/diagnostics/doctor.sh` — "Atuin History Filter" section
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Incident Response Plan
2
6
 
3
7
  Incident response procedures for the dotfiles repository. Covers supply chain compromise, secrets exposure, configuration drift, tool tampering, and CI pipeline attacks. Based on NIST SP 800-61 Rev. 2 (Computer Security Incident Handling Guide).
@@ -0,0 +1,122 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # Install Verification
6
+
7
+ This page documents what gets verified during `install.sh` execution,
8
+ why those checks matter, and how to obtain the per-release expected
9
+ hashes used by the verified-install path in the README.
10
+
11
+ Managed under
12
+ [#858](https://github.com/sebastienrousseau/dotfiles/issues/858).
13
+
14
+ ## What is verified
15
+
16
+ `install.sh` performs three classes of verification before doing
17
+ anything destructive:
18
+
19
+ ### 1. The installer itself (verified path)
20
+
21
+ The README's **Verified install** snippet pins to a release tag
22
+ (e.g. `v0.2.501`), downloads the installer, and asks `shasum -a 256
23
+ -c` (or `sha256sum -c`) to check the contents against an expected
24
+ hash. If the hash doesn't match, the verify step exits non-zero and
25
+ the install never starts.
26
+
27
+ ### 2. The `chezmoi` binary (always verified when possible)
28
+
29
+ `install.sh` prefers the bundled checksum-verified installer at
30
+ `scripts/ci/install-chezmoi-verified.sh`, which:
31
+
32
+ - Resolves the platform (`uname -s` + `uname -m`).
33
+ - Downloads `chezmoi_<version>_<os>_<arch>.tar.gz` AND the matching
34
+ `chezmoi_<version>_checksums.txt` from the official
35
+ `twpayne/chezmoi` GitHub release.
36
+ - Greps the checksum file for the asset's expected SHA256.
37
+ - Verifies the downloaded tarball against that SHA256 using
38
+ `shasum -a 256 -c` / `sha256sum -c`.
39
+ - Aborts with a clear error if the asset isn't in the checksum file
40
+ or the verification fails.
41
+
42
+ When the verified installer isn't available (e.g. the curl one-liner
43
+ mode where `install.sh` is fetched in isolation), the code falls back
44
+ to `get.chezmoi.io` with two defense-in-depth checks:
45
+
46
+ - The downloaded installer must be smaller than 100 KiB (sanity
47
+ guard against a CDN serving an arbitrary binary).
48
+ - The first line must start with `#!/` (must look like a shell
49
+ script).
50
+
51
+ These are weaker than a SHA256 check, but they catch the obvious
52
+ "installer got replaced with a 50 MB malicious binary" failure mode.
53
+
54
+ ### 3. The chezmoi source tree
55
+
56
+ After chezmoi is installed, `install.sh` clones the dotfiles repo
57
+ itself. This isn't currently cryptographically verified beyond Git's
58
+ own object integrity, but commits in the repo are SSH-signed and
59
+ branch protection on `master` requires signed commits (see #853).
60
+
61
+ ## How to obtain per-release hashes
62
+
63
+ The verified-install snippet uses the SHA256 of the `install.sh`
64
+ file *as it exists at the release tag*. To regenerate after a release:
65
+
66
+ ```bash
67
+ git switch master
68
+ git pull
69
+ NEW_TAG="v0.2.502" # adjust
70
+ git tag -s "$NEW_TAG" -m "..."
71
+ git push origin "$NEW_TAG"
72
+
73
+ # Compute the hash:
74
+ shasum -a 256 install.sh
75
+
76
+ # Update README.md's verified-install snippet with the new hash + tag.
77
+ ```
78
+
79
+ A follow-up automation (tracked at the bottom of this page) will
80
+ publish a `.sha256` sibling next to the install.sh asset in GitHub
81
+ Releases so the README snippet can reference a stable URL instead
82
+ of a hardcoded value.
83
+
84
+ ## What to do if the hash doesn't match
85
+
86
+ If you run the verified install and `shasum -a 256 -c` reports
87
+ `FAILED`:
88
+
89
+ 1. **Don't run the installer.** The hash mismatch means either the
90
+ release was retagged (rare) or someone is MITM-ing your download.
91
+ 2. Check the [Releases page](https://github.com/sebastienrousseau/dotfiles/releases)
92
+ for the matching tag. The per-release `install.sh` SHA is
93
+ embedded in the README at the time of that release; you can also
94
+ recover it from the git history of `README.md`.
95
+ 3. If the README hash is stale (release was retagged for legitimate
96
+ reasons), `git log` on `install.sh` will show the change. Inspect
97
+ the diff before trusting a new hash.
98
+
99
+ ## What is NOT verified (yet)
100
+
101
+ - **Cosign keyless signature** on `install.sh` — tracked separately
102
+ under #876.
103
+ - **deps.dev attestation lookup** for npm/Python deps used during
104
+ install — tracked under #877.
105
+ - **Reproducible-build guarantee** for the chezmoi binary itself —
106
+ out of scope; rely on the upstream project's release engineering.
107
+
108
+ ## Negative-test coverage
109
+
110
+ `tests/unit/install/test_install_chezmoi_verified.sh` exercises the
111
+ verification path with a deliberately tampered checksum to confirm
112
+ the installer aborts. The test ships with the repo and runs on every
113
+ PR.
114
+
115
+ ## References
116
+
117
+ - `install.sh` — the entry point.
118
+ - `scripts/ci/install-chezmoi-verified.sh` — the SHA256-pinned
119
+ chezmoi installer.
120
+ - `tests/unit/install/test_install_chezmoi_verified.sh` — the
121
+ negative test.
122
+ - Issue [#858](https://github.com/sebastienrousseau/dotfiles/issues/858).
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Keybindings
2
6
 
3
7
  This is the single source of truth for navigation and muscle-memory shortcuts
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Key Rotation Guide
2
6
 
3
7
  This guide covers rotating encryption keys for secrets managed by Age and SOPS.
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # MCP Policy
2
6
 
3
7
  MCP is treated as a controlled execution boundary.
@@ -7,6 +11,7 @@ MCP is treated as a controlled execution boundary.
7
11
  The tracked default is `strict-local`.
8
12
 
9
13
  Properties:
14
+
10
15
  - local-first
11
16
  - least privilege
12
17
  - no broad filesystem roots
@@ -21,6 +26,7 @@ Approved package pins live in [mcp-lock.json](/home/seb/.dotfiles/dot_config/dot
21
26
  Tracked server registry entries live in [mcp-registry.json](/home/seb/.dotfiles/dot_config/dotfiles/mcp-registry.json).
22
27
 
23
28
  Current defaults:
29
+
24
30
  - Allowed launchers: `npx`, `node`, `uvx`
25
31
  - Trusted transports: `stdio`, `http`
26
32
  - Blocked filesystem roots: `/`, `/home`, `/Users`
@@ -45,6 +51,7 @@ The JSON form is the audit artifact for CI, release validation, and workstation
45
51
  ## Change control
46
52
 
47
53
  Any change to MCP policy requires:
54
+
48
55
  1. A signed commit
49
56
  2. A matching test update
50
57
  3. A release note if the effective trust boundary changes
@@ -55,11 +62,13 @@ Any change to MCP policy requires:
55
62
  Phase 2 adds explicit package locking for default MCP servers.
56
63
 
57
64
  Current approved refs:
65
+
58
66
  - `mcp-server-git@2025.1.14`
59
67
  - `@modelcontextprotocol/server-memory@2025.8.4`
60
68
  - `mcp-server-sqlite@2025.1.14`
61
69
 
62
70
  `dot mcp --strict` and `dot mcp -s` now verify that:
71
+
63
72
  - package refs are version-pinned
64
73
  - the pinned refs match the tracked lock manifest
65
74
  - non-approved package refs are rejected in strict mode
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Policy Bundle Releases
2
6
 
3
7
  Policy bundles are released as tracked governance artifacts.
@@ -1,3 +1,7 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
1
5
  # Security Documentation
2
6
 
3
7
  This directory contains security documentation for the dotfiles project.
@@ -0,0 +1,80 @@
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)
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. Codified at `.github/rulesets/master.json` and `.github/branch-protection-config.json`. |
42
+ | Code-Review | ✓ | Every PR requires at least one approval; CODEOWNERS in place. |
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). Coverage is the script's CLI surface plus chaos input fixtures — not full corpus fuzzing yet. |
46
+ | License | ✓ | Apache-2.0 at repo root. |
47
+ | Maintained | ✓ | Active commit cadence; the [README](../../README.md) lists the current `dotfiles_version` (v0.2.501). |
48
+ | Pinned-Dependencies | ✓ | Every workflow action is pinned to a 40-char commit SHA; the lint rule under `actionlint` enforces this on PR. |
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 | ✓ | Workflows use least-privilege `permissions:` blocks. `harden-runner` adoption (#878) tightens this further. |
53
+ | Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `master` (#852). |
54
+ | Webhooks | n/a | No external webhooks configured. |
55
+ | CI-Tests | ✓ | Comprehensive CI matrix (Linux + macOS Intel + Apple Silicon, 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
+
60
+ ## Open work
61
+
62
+ - Apply for the [OpenSSF Best Practices badge (CII)](https://www.bestpractices.dev/) and embed it next to the Scorecard badge. (Maintainer action — needs the project to register with the BestPractices.dev site.)
63
+ - Once `harden-runner` is in `block` mode across all jobs (#878), the **Token-Permissions** check should hit its maximum.
64
+ - Once Cosign keyless signing is wired into the release pipeline (#876), the **Signed-Releases** check should hit its maximum.
65
+
66
+ ## Exceptions
67
+
68
+ | Check | Expiry | Rationale |
69
+ |---|---|---|
70
+ | *(none currently)* | *—* | *—* |
71
+
72
+ If you add an exception, include the check name, an expiry date
73
+ (don't allow indefinite), and the rationale. Re-evaluate every quarter.
74
+
75
+ ## References
76
+
77
+ - `.github/workflows/scorecard.yml` — the scanner.
78
+ - [Scorecard project](https://github.com/ossf/scorecard).
79
+ - [Scorecard checks reference](https://github.com/ossf/scorecard/blob/main/docs/checks.md).
80
+ - Issue [#869](https://github.com/sebastienrousseau/dotfiles/issues/869).