@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.
- package/CHANGELOG.md +77 -0
- package/README.md +82 -44
- package/docs/.vitepress/reports/localization-readability-audit.md +4 -0
- package/docs/AI.md +8 -2
- package/docs/CNAME +1 -0
- package/docs/COPYRIGHT +1 -1
- package/docs/NAMING_CONVENTIONS.md +7 -0
- package/docs/README.md +4 -0
- package/docs/_config.yml +59 -0
- package/docs/adr/ADR-001-ci-cd-pipeline.md +17 -0
- package/docs/adr/ADR-002-shell-performance.md +9 -0
- package/docs/adr/ADR-003-security-first.md +18 -0
- package/docs/adr/ADR-004-cli-architecture.md +14 -0
- package/docs/adr/ADR-005-chezmoi-choice.md +10 -0
- package/docs/adr/ADR-006-shell-selection.md +9 -0
- package/docs/adr/ADR-007-multi-shell-parity.md +10 -1
- package/docs/adr/ADR-008-alias-system-architecture.md +10 -0
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +131 -0
- package/docs/adr/ADR-010-starship-transient-prompt.md +144 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +144 -0
- package/docs/adr/README.md +7 -0
- package/docs/architecture/ARCHITECTURE.md +4 -0
- package/docs/architecture/INTEROP.md +8 -0
- package/docs/architecture/REPO_LAYOUT.md +5 -1
- package/docs/architecture/WALKTHROUGH.md +4 -0
- package/docs/architecture/fleet-deployment.md +4 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +11 -3
- package/docs/archive/LEGACY_ROADMAP.md +45 -27
- package/docs/archive/MILESTONE_v0.2.493.md +4 -0
- package/docs/archive/PLAN.md +46 -8
- package/docs/archive/REPO_AUDIT.md +8 -0
- package/docs/guides/INSTALL.md +4 -0
- package/docs/guides/NEOVIM_IDE_GUIDE.md +9 -0
- package/docs/guides/THEMING.md +8 -0
- package/docs/guides/TROUBLESHOOTING.md +28 -0
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +70 -1
- package/docs/index.md +6 -2
- package/docs/interop/A2A.md +7 -0
- package/docs/interop/POWERSHELL.md +102 -0
- package/docs/manual/00-introduction.md +5 -1
- package/docs/manual/01-concepts/01-architecture.md +4 -0
- package/docs/manual/01-concepts/02-trust-model.md +6 -2
- package/docs/manual/01-concepts/03-theme-engine.md +4 -0
- package/docs/manual/01-concepts/04-fleet.md +7 -1
- package/docs/manual/01-concepts/05-self-healing.md +8 -1
- package/docs/manual/02-tutorials/01-first-install.md +5 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +5 -0
- package/docs/manual/02-tutorials/03-create-profile.md +6 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +6 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +5 -1
- package/docs/manual/03-reference/01-dot-cli.md +4 -0
- package/docs/manual/03-reference/02-config-files.md +8 -2
- package/docs/manual/03-reference/03-environment.md +4 -0
- package/docs/manual/03-reference/04-templates.md +7 -1
- package/docs/manual/03-reference/05-feature-flags.md +10 -0
- package/docs/manual/04-cookbook/01-recipes.md +4 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +32 -0
- package/docs/manual/04-cookbook/03-faq.md +8 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +4 -0
- package/docs/manual/05-appendices/B-security-checklist.md +6 -0
- package/docs/manual/05-appendices/C-glossary.md +4 -0
- package/docs/manual/05-appendices/D-bibliography.md +5 -1
- package/docs/manual/05-appendices/E-license.md +4 -0
- package/docs/manual/_toc.yml +1 -1
- package/docs/manual/command-index.md +4 -0
- package/docs/manual/concept-index.md +4 -0
- package/docs/operations/ATTESTATION.md +5 -0
- package/docs/operations/CI_CADENCE.md +107 -0
- package/docs/operations/CI_COMPOSITES.md +156 -0
- package/docs/operations/COMPLETIONS.md +123 -0
- package/docs/operations/COVERAGE.md +148 -0
- package/docs/operations/DRIFT.md +107 -0
- package/docs/operations/MAINTENANCE.md +5 -1
- package/docs/operations/MIGRATION.md +14 -6
- package/docs/operations/OPERATIONS.md +24 -0
- package/docs/operations/PERFORMANCE.md +133 -0
- package/docs/operations/RELIABILITY.md +6 -0
- package/docs/operations/ROADMAP.md +36 -18
- package/docs/operations/TESTING.md +4 -0
- package/docs/operations/TRACEABILITY.md +4 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +4 -0
- package/docs/operations/VERSION_SYNC.md +54 -5
- package/docs/reference/ALIASES.md +7 -0
- package/docs/reference/ALIASES_CHEATSHEET.md +5 -1
- package/docs/reference/ALIASES_DEPRECATIONS.md +5 -1
- package/docs/reference/FEATURES.md +4 -0
- package/docs/reference/FONTS.md +4 -0
- package/docs/reference/PROFILES.md +4 -0
- package/docs/reference/SCREENSHOTS.md +4 -0
- package/docs/reference/SCRIPTS.md +4 -0
- package/docs/reference/SUPPORT_MATRIX.md +10 -4
- package/docs/reference/THEMES.md +4 -0
- package/docs/reference/TOOLS.md +4 -0
- package/docs/reference/UTILS.md +16 -12
- package/docs/security/AI_ACT_COMPLIANCE.md +4 -0
- package/docs/security/AUDIT_BYPASS.md +103 -0
- package/docs/security/AUTOMATION_SECRETS.md +4 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
- package/docs/security/COMPLIANCE.md +5 -0
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
- package/docs/security/ENCRYPTION.md +5 -0
- package/docs/security/FMEA.md +4 -0
- package/docs/security/HISTORY_FILTERING.md +132 -0
- package/docs/security/INCIDENT_RESPONSE.md +4 -0
- package/docs/security/INSTALL_VERIFICATION.md +122 -0
- package/docs/security/KEYS.md +4 -0
- package/docs/security/KEY_ROTATION.md +4 -0
- package/docs/security/MCP_POLICY.md +9 -0
- package/docs/security/POLICY_RELEASES.md +4 -0
- package/docs/security/README.md +4 -0
- package/docs/security/SCORECARD.md +80 -0
- package/docs/security/SECRETS.md +12 -0
- package/docs/security/SECURITY.md +4 -0
- package/docs/security/SECURITY_CHECKLIST.md +11 -0
- package/docs/security/SHELL_EXEMPTIONS.md +145 -0
- package/docs/security/SOUP_REGISTER.md +4 -0
- package/docs/security/THREAT_MODEL.md +10 -0
- package/docs/security/VERIFICATION_VALIDATION.md +5 -1
- package/docs/themes/README.md +4 -0
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +4 -0
- package/dot_config/ai/identity.md +3 -0
- package/dot_config/ai/patterns/architect.md +2 -0
- package/dot_config/ai/patterns/hardener.md +2 -0
- package/dot_config/ai/patterns/refactor.md +2 -0
- package/dot_config/alacritty/alacritty.toml.tmpl +3 -3
- package/dot_config/atuin/config.toml.tmpl +47 -0
- package/dot_config/dotfiles/agent-card.json +1 -1
- package/dot_config/dotfiles/boot/README.md +2 -0
- package/dot_config/dotfiles/grub/README.md +2 -0
- package/dot_config/dotfiles/lock/README.md +2 -0
- package/dot_config/fish/conf.d/init.fish.tmpl +21 -0
- package/dot_config/fish/functions/_cached_eval.fish +84 -11
- package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
- package/dot_config/foot/foot.ini.tmpl +3 -3
- package/dot_config/fuzzel/fuzzel.ini.tmpl +2 -2
- package/dot_config/ghostty/config.tmpl +3 -3
- package/dot_config/git/hooks/executable_commit-msg +146 -0
- package/dot_config/goose/config.yaml +2 -2
- package/dot_config/gtk-3.0/gtk.css.tmpl +2 -2
- package/dot_config/gtk-3.0/settings.ini.tmpl +2 -2
- package/dot_config/gtk-4.0/gtk.css.tmpl +2 -2
- package/dot_config/gtk-4.0/settings.ini.tmpl +2 -2
- package/dot_config/kitty/kitty.conf.tmpl +3 -3
- package/dot_config/mise/config.toml +1 -1
- package/dot_config/niri/config.kdl.tmpl +2 -2
- package/dot_config/nushell/cached_eval.nu +80 -0
- package/dot_config/nushell/env.nu.tmpl +21 -13
- package/dot_config/shell/00-core-paths.sh.tmpl +1 -0
- package/dot_config/shell/05-core-safety.sh +1 -0
- package/dot_config/shell/10-secrets.sh +1 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +1 -0
- package/dot_config/shell/40-ls-colors.sh +1 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +1 -0
- package/dot_config/shell/50-logic-functions.sh.tmpl +1 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +1 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +1 -0
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +1 -0
- package/dot_config/shell/README.md +25 -8
- package/dot_config/starship.toml.tmpl +2 -2
- package/dot_config/tmux/tmux.conf.tmpl +3 -3
- package/dot_config/user-dirs.dirs +1 -0
- package/dot_config/vscode/settings.json.tmpl +2 -2
- package/dot_config/waybar/config.jsonc.tmpl +2 -2
- package/dot_config/waybar/style.css.tmpl +2 -2
- package/dot_config/wezterm/wezterm.lua.tmpl +3 -3
- package/dot_config/zsh/dot_zshrc.tmpl +154 -17
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +28 -6
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +26 -6
- package/dot_local/bin/executable_bm +2 -0
- package/dot_local/bin/executable_dot +9 -2
- package/dot_local/bin/executable_dot-load-benchmark +1 -1
- package/dot_local/bin/executable_notify +2 -0
- package/dot_local/bin/executable_open +2 -0
- package/dot_local/bin/executable_tour +4 -2
- package/dot_local/bin/executable_up +3 -1
- package/install.sh +12 -4
- package/package.json +1 -1
- package/scripts/ci/check-dangerous-chmod.sh +19 -0
- package/scripts/ci/check-deps-dev.sh +236 -0
- package/scripts/ci/check-insecure-tls.sh +61 -0
- package/scripts/ci/check-regression-traceability.sh +67 -0
- package/scripts/ci/check-shell-preamble.sh +106 -0
- package/scripts/ci/run-coverage.sh +362 -0
- package/scripts/ci/validate-chezmoidata.sh +25 -0
- package/scripts/diagnostics/doctor.sh +173 -5
- package/scripts/diagnostics/drift-dashboard.sh +177 -13
- package/scripts/diagnostics/health.sh +21 -4
- package/scripts/diagnostics/perf.sh +304 -77
- package/scripts/diagnostics/workstation-attestation.sh +6 -1
- package/scripts/dot/commands/agent.sh +14 -5
- package/scripts/dot/commands/ai.sh +75 -10
- package/scripts/dot/lib/bento.sh +2 -1
- package/scripts/dot/lib/log.sh +6 -0
- package/scripts/dot/lib/platform.sh +1 -0
- package/scripts/dot/lib/ui.sh +11 -0
- package/scripts/dot/lib/utils.sh +5 -0
- package/scripts/git-hooks/pre-commit-audit.sh +1 -1
- package/scripts/git-hooks/pre-push +66 -3
- package/scripts/ops/heal-chezmoi.sh +41 -6
- package/scripts/qa/powershell-contract.ps1 +95 -0
- package/scripts/theme/merge-wallpaper.sh +4 -0
- package/scripts/theme/switch.sh +20 -10
- package/dot_config/atuin/config.toml +0 -40
- 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.
|
package/docs/security/FMEA.md
CHANGED
|
@@ -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).
|
package/docs/security/KEYS.md
CHANGED
|
@@ -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
|
package/docs/security/README.md
CHANGED
|
@@ -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
|
+
[](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).
|