@sebastienrousseau/dotfiles 0.2.508 → 0.2.511
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 +42 -0
- package/README.md +5 -5
- package/docs/COPYRIGHT +1 -1
- package/docs/GOVERNANCE.md +2 -2
- package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
- package/docs/articles/.pages +6 -0
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +216 -0
- package/docs/articles/2026-07-05-fish-startup-abbr.md +153 -0
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +128 -0
- package/docs/articles/index.md +36 -0
- package/docs/guides/INSTALL.md +3 -3
- package/docs/index.md +116 -27
- package/docs/interop/A2A.md +2 -2
- package/docs/interop/POWERSHELL.md +4 -4
- package/docs/manual/00-introduction.md +3 -3
- package/docs/manual/01-concepts/02-trust-model.md +3 -3
- package/docs/manual/01-concepts/04-fleet.md +1 -1
- package/docs/manual/02-tutorials/01-first-install.md +1 -1
- package/docs/manual/02-tutorials/05-deploy-fleet.md +2 -2
- package/docs/manual/03-reference/02-config-files.md +1 -1
- package/docs/manual/03-reference/04-templates.md +1 -1
- package/docs/manual/04-cookbook/01-recipes.md +1 -1
- package/docs/manual/04-cookbook/02-troubleshooting.md +1 -1
- package/docs/manual/05-appendices/B-security-checklist.md +1 -1
- package/docs/manual/command-index.md +76 -1
- package/docs/manual/index.md +1 -1
- package/docs/operations/ARCHITECTURE_ROADMAP.md +145 -0
- package/docs/operations/CI_CADENCE.md +2 -2
- package/docs/operations/COMPLETIONS.md +2 -2
- package/docs/operations/COVERAGE.md +4 -4
- package/docs/operations/DRIFT.md +1 -1
- package/docs/operations/MAINTENANCE.md +6 -6
- package/docs/operations/PERFORMANCE.md +6 -6
- package/docs/operations/RELIABILITY.md +1 -1
- package/docs/operations/ROADMAP_V0_2_503.md +1 -1
- package/docs/operations/TRACEABILITY.md +2 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +6 -6
- package/docs/operations/VERSION_SYNC.md +3 -3
- package/docs/reference/UTILS.md +82 -0
- package/docs/security/AUDIT_BYPASS.md +3 -3
- package/docs/security/AUTOMATION_SECRETS.md +1 -1
- package/docs/security/CI_PINNING.md +10 -10
- package/docs/security/COMMIT_SIGNING.md +10 -10
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +4 -4
- package/docs/security/DISCLOSURE.md +3 -3
- package/docs/security/INCIDENT_RESPONSE.md +1 -1
- package/docs/security/INSTALL_VERIFICATION.md +2 -2
- package/docs/security/MCP_POLICY.md +4 -4
- package/docs/security/SCORECARD.md +7 -7
- package/docs/security/SECURITY_CHECKLIST.md +1 -1
- package/docs/security/SHELL_EXEMPTIONS.md +2 -2
- package/docs/security/SOUP_REGISTER.md +4 -4
- package/docs/stylesheets/extra.css +444 -0
- package/docs/themes/hero-shot.svg +1 -1
- package/install.sh +17 -6
- package/package.json +1 -1
- package/scripts/ci/check-copyright-headers.sh +1 -1
- package/scripts/ci/check-shell-preamble.sh +1 -1
- package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
- package/scripts/diagnostics/aliases-manifest.sh +19 -1
- package/scripts/diagnostics/verify_state.sh +6 -2
- package/scripts/diagnostics/version-locks.sh +10 -6
- package/scripts/dot/commands/agent.sh +12 -7
- package/scripts/dot/commands/ai.sh +8 -5
- package/scripts/dot/commands/appearance.sh +14 -1
- package/scripts/dot/commands/completion.sh +134 -0
- package/scripts/dot/commands/core.sh +8 -0
- package/scripts/dot/commands/diagnostics.sh +16 -0
- package/scripts/dot/commands/fleet.sh +11 -4
- package/scripts/dot/commands/lint.sh +55 -30
- package/scripts/dot/commands/registry.sh +7 -1
- package/scripts/dot/commands/secrets.sh +61 -7
- package/scripts/dot/commands/security.sh +8 -0
- package/scripts/dot/commands/tools.sh +11 -2
- package/scripts/dot/powershell/Dot.psm1 +1 -1
- package/scripts/git-hooks/pre-commit-audit.sh +1 -1
- package/scripts/ops/heal-tools.sh +28 -0
- package/scripts/ops/teleport.sh +2 -2
- package/scripts/qa/examples-coverage.sh +94 -0
- package/scripts/tools/detect-collisions.py +19 -1
- package/scripts/version-sync.sh +36 -2
- package/docs/_config.yml +0 -59
|
@@ -5,7 +5,7 @@ render_with_liquid: false
|
|
|
5
5
|
# Pre-Push Audit Bypass
|
|
6
6
|
|
|
7
7
|
This page documents when the pre-push reliability audit can be bypassed,
|
|
8
|
-
how to do it, and why the answer is "almost never on `
|
|
8
|
+
how to do it, and why the answer is "almost never on `main`."
|
|
9
9
|
|
|
10
10
|
## Background
|
|
11
11
|
|
|
@@ -57,7 +57,7 @@ bypassed?" without git archaeology.
|
|
|
57
57
|
|
|
58
58
|
Short list — anything outside this is suspicious:
|
|
59
59
|
|
|
60
|
-
- **Hotfix push to a non-
|
|
60
|
+
- **Hotfix push to a non-main branch** when CI infrastructure itself
|
|
61
61
|
is the audit blocker (e.g., the audit pre-flight depends on a remote
|
|
62
62
|
service that's down). The fix should land *before* the
|
|
63
63
|
infrastructure recovers; bypass is the bridge.
|
|
@@ -66,7 +66,7 @@ Short list — anything outside this is suspicious:
|
|
|
66
66
|
|
|
67
67
|
When bypass is **not** legitimate:
|
|
68
68
|
|
|
69
|
-
- Routine `
|
|
69
|
+
- Routine `main` pushes. The whole point of the audit is to guard
|
|
70
70
|
the protected branch.
|
|
71
71
|
- Pushes whose audit failure is "annoying" — the right move is to fix
|
|
72
72
|
the failure, not skip the check.
|
|
@@ -21,6 +21,6 @@ render_with_liquid: false
|
|
|
21
21
|
## Provisioning notes
|
|
22
22
|
|
|
23
23
|
1. Store the SSH signing private key in GitHub Actions as `ACTIONS_BOT_SIGNING_KEY`.
|
|
24
|
-
2. Store the matching public key in [allowed_signers](
|
|
24
|
+
2. Store the matching public key in [allowed_signers](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/git/allowed_signers.tmpl).
|
|
25
25
|
3. Rotate the key on personnel or workstation change.
|
|
26
26
|
4. Fail closed when secrets are absent.
|
|
@@ -17,7 +17,7 @@ Every external dependency the CI pipeline consumes must be pinned by
|
|
|
17
17
|
When `ci.yml` calls a reusable via `./.github/workflows/reusable-X.yml`,
|
|
18
18
|
GitHub resolves the reusable from the **same ref as the calling
|
|
19
19
|
workflow at run time**. For an in-repo PR that's the PR's branch —
|
|
20
|
-
fine. The risk is the inverse: a malicious push to `
|
|
20
|
+
fine. The risk is the inverse: a malicious push to `main` (or any
|
|
21
21
|
ref the calling workflow might resolve from) can swap reusable
|
|
22
22
|
content under a CI run, with no audit trail in the PR diff.
|
|
23
23
|
|
|
@@ -29,11 +29,11 @@ site — visible in the PR diff, reviewable, revertible.
|
|
|
29
29
|
|
|
30
30
|
```yaml
|
|
31
31
|
# Acceptable — full SHA pin.
|
|
32
|
-
uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@b0615f8fb5c0f3826f58904a5567eff11b6c500e #
|
|
32
|
+
uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@b0615f8fb5c0f3826f58904a5567eff11b6c500e # main
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
The trailing comment is a human-readable hint at what the SHA
|
|
36
|
-
represented when it was pinned (typically `
|
|
36
|
+
represented when it was pinned (typically `main`, sometimes a tag
|
|
37
37
|
like `v0.2.501`). The hint is documentation only — the SHA is what
|
|
38
38
|
GitHub uses.
|
|
39
39
|
|
|
@@ -44,7 +44,7 @@ GitHub uses.
|
|
|
44
44
|
uses: ./.github/workflows/reusable-shell-lint.yml
|
|
45
45
|
|
|
46
46
|
# Rejected — branch ref is mutable.
|
|
47
|
-
uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@
|
|
47
|
+
uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@main
|
|
48
48
|
|
|
49
49
|
# Rejected — tag ref is mutable (tags can be moved).
|
|
50
50
|
uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@v0.2.501
|
|
@@ -57,20 +57,20 @@ rejected forms above.
|
|
|
57
57
|
## Refreshing pinned SHAs
|
|
58
58
|
|
|
59
59
|
`bump-reusable-pins.yml` handles this automatically. On every push to
|
|
60
|
-
`
|
|
60
|
+
`main` that touches `.github/workflows/reusable-*.yml`, the bot scans
|
|
61
61
|
caller workflows for stale pins and opens a PR bumping them to the new
|
|
62
62
|
SHA. Signed with `ACTIONS_BOT_SIGNING_KEY` so the resulting commit
|
|
63
63
|
passes `Verify Commit Signatures`.
|
|
64
64
|
|
|
65
65
|
The manual recipe below stays here as a fallback — for example, if you
|
|
66
|
-
need to bump pins before a merge to
|
|
66
|
+
need to bump pins before a merge to main, or if the bot's run failed
|
|
67
67
|
and you want to short-circuit waiting for the next push trigger.
|
|
68
68
|
|
|
69
69
|
```sh
|
|
70
|
-
# 1. Land the change to the reusable on
|
|
71
|
-
# 2. After merge, capture the new
|
|
72
|
-
git fetch origin
|
|
73
|
-
PIN=$(git rev-parse origin/
|
|
70
|
+
# 1. Land the change to the reusable on main via a PR.
|
|
71
|
+
# 2. After merge, capture the new main SHA:
|
|
72
|
+
git fetch origin main
|
|
73
|
+
PIN=$(git rev-parse origin/main)
|
|
74
74
|
echo "$PIN"
|
|
75
75
|
|
|
76
76
|
# 3. Bump every call site:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Commit Signing — Policy & Setup
|
|
2
2
|
|
|
3
|
-
Every commit that reaches `
|
|
3
|
+
Every commit that reaches `main` in this repository must carry a
|
|
4
4
|
cryptographic signature that GitHub can verify. The policy is enforced
|
|
5
5
|
in three independent layers, so a single bypass does not break the
|
|
6
6
|
chain. This document explains the policy, walks through SSH and GPG
|
|
@@ -24,16 +24,16 @@ is missing. The chain below removes every escape hatch.
|
|
|
24
24
|
`git verify-commit` against every commit in the push range. A
|
|
25
25
|
single unverified commit aborts the push. `--no-verify` skips
|
|
26
26
|
this layer; the next two catch it.
|
|
27
|
-
3. **GitHub Rulesets** — `.github/rulesets/
|
|
28
|
-
`required_signatures` on `refs/heads/
|
|
27
|
+
3. **GitHub Rulesets** — `.github/rulesets/main.json` declares
|
|
28
|
+
`required_signatures` on `refs/heads/main`. The rule is part
|
|
29
29
|
of the repo so it's reproducible across forks. Apply with
|
|
30
|
-
`gh ruleset import .github/rulesets/
|
|
30
|
+
`gh ruleset import .github/rulesets/main.json`.
|
|
31
31
|
4. **`compliance-guard.yml` workflow** — runs on every PR targeting
|
|
32
|
-
`
|
|
32
|
+
`main`. Walks the commit range with `git verify-commit` and
|
|
33
33
|
marks unsigned commits in the PR summary; fails the workflow
|
|
34
34
|
when `unsigned_count > 0`.
|
|
35
35
|
|
|
36
|
-
A merge to `
|
|
36
|
+
A merge to `main` therefore requires (Ruleset accepts the push) AND
|
|
37
37
|
(the workflow's signed-commit check passes) AND (the maintainer's
|
|
38
38
|
push key is allowed). The protection holds even if a contributor's
|
|
39
39
|
local hooks are missing or skipped.
|
|
@@ -100,7 +100,7 @@ git log "$(git merge-base @{u} HEAD)..HEAD" \
|
|
|
100
100
|
for c in $(git rev-list "$(git merge-base @{u} HEAD)..HEAD"); do
|
|
101
101
|
git verify-commit "$c" >/dev/null 2>&1 \
|
|
102
102
|
&& echo "✓ $c" \
|
|
103
|
-
|| echo "✗ $c — unsigned, will be rejected by
|
|
103
|
+
|| echo "✗ $c — unsigned, will be rejected by main ruleset"
|
|
104
104
|
done
|
|
105
105
|
```
|
|
106
106
|
|
|
@@ -112,7 +112,7 @@ done
|
|
|
112
112
|
| `error: Load key "/.../id_ed25519": Permission denied` | SSH key permissions too open | `chmod 600 ~/.ssh/id_ed25519` |
|
|
113
113
|
| GitHub shows "Unverified" on a commit signed locally | Signing key not uploaded to GitHub | `gh ssh-key add … --type signing` (SSH) or `gh gpg-key add` (GPG) |
|
|
114
114
|
| Pre-push hook rejects a merge commit you didn't author | Upstream commit lacks a signature | Either pull the rebased branch, or fast-forward instead of merging |
|
|
115
|
-
| Ruleset import via `gh` complains "invalid JSON" | Rulesets API expects the `target` + `rules` envelope, not just the rules array | Use the file as-is — `gh ruleset import .github/rulesets/
|
|
115
|
+
| Ruleset import via `gh` complains "invalid JSON" | Rulesets API expects the `target` + `rules` envelope, not just the rules array | Use the file as-is — `gh ruleset import .github/rulesets/main.json` |
|
|
116
116
|
|
|
117
117
|
## Re-applying the ruleset after a manual edit
|
|
118
118
|
|
|
@@ -121,14 +121,14 @@ file-of-truth wins. Re-apply:
|
|
|
121
121
|
|
|
122
122
|
```sh
|
|
123
123
|
gh api -X POST repos/{owner}/{repo}/rulesets \
|
|
124
|
-
--input .github/rulesets/
|
|
124
|
+
--input .github/rulesets/main.json
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
(or `-X PUT` against the existing ruleset's ID if it already exists).
|
|
128
128
|
|
|
129
129
|
## References
|
|
130
130
|
|
|
131
|
-
- `.github/rulesets/
|
|
131
|
+
- `.github/rulesets/main.json` — the enforced policy.
|
|
132
132
|
- `.github/workflows/compliance-guard.yml` — the workflow that
|
|
133
133
|
fails PRs containing unsigned commits.
|
|
134
134
|
- `scripts/git-hooks/pre-push` — the local pre-push gate.
|
|
@@ -7,7 +7,7 @@ render_with_liquid: false
|
|
|
7
7
|
The CI workflow `.github/workflows/deps-dev-validation.yml` scans
|
|
8
8
|
direct dependencies (npm + PyPI + GitHub Actions) against the
|
|
9
9
|
[deps.dev Insights API](https://docs.deps.dev/) on every PR, every
|
|
10
|
-
push to `
|
|
10
|
+
push to `main`, and every Tuesday at 04:00 UTC. When an advisory
|
|
11
11
|
is reported at or above the threshold (default `HIGH`), the workflow
|
|
12
12
|
fails.
|
|
13
13
|
|
|
@@ -79,8 +79,8 @@ auto-fail the gate even when they're still listed here.
|
|
|
79
79
|
|
|
80
80
|
## References
|
|
81
81
|
|
|
82
|
-
- [`tools/ci/check-deps-dev.sh`](
|
|
83
|
-
- [`.github/workflows/deps-dev-validation.yml`](
|
|
84
|
-
- [`tests/unit/security/test_check_deps_dev.sh`](
|
|
82
|
+
- [`tools/ci/check-deps-dev.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/check-deps-dev.sh) — the scanner.
|
|
83
|
+
- [`.github/workflows/deps-dev-validation.yml`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/deps-dev-validation.yml) — CI wiring.
|
|
84
|
+
- [`tests/unit/security/test_check_deps_dev.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tests/unit/security/test_check_deps_dev.sh) — contract test against canned fixtures.
|
|
85
85
|
- [deps.dev API reference](https://docs.deps.dev/api/v3/).
|
|
86
86
|
- Issue [#877](https://github.com/sebastienrousseau/dotfiles/issues/877).
|
|
@@ -34,7 +34,7 @@ gpg --fingerprint security@sebastienrousseau.com
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
The fingerprint must match the one published in
|
|
37
|
-
[`.github/SECURITY.md`](
|
|
37
|
+
[`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md). Cross-verify
|
|
38
38
|
against the SSH signing key in `dot_config/git/allowed_signers.tmpl`
|
|
39
39
|
— the maintainer signs commits with the same identity, so both
|
|
40
40
|
fingerprints derive from the same identity claim.
|
|
@@ -75,7 +75,7 @@ subjects in plain text).
|
|
|
75
75
|
## 5. Acknowledgement
|
|
76
76
|
|
|
77
77
|
You should receive an acknowledgement within the SLA in
|
|
78
|
-
[`.github/SECURITY.md`](
|
|
78
|
+
[`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md):
|
|
79
79
|
|
|
80
80
|
| Severity | Initial response |
|
|
81
81
|
|---|---|
|
|
@@ -122,7 +122,7 @@ The maintainer commits to:
|
|
|
122
122
|
|
|
123
123
|
## See also
|
|
124
124
|
|
|
125
|
-
- [`.github/SECURITY.md`](
|
|
125
|
+
- [`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md) — policy
|
|
126
126
|
overview + fingerprint.
|
|
127
127
|
- [`docs/security/KEY_ROTATION.md`](KEY_ROTATION.md) — schedule for
|
|
128
128
|
when the disclosure key is rotated.
|
|
@@ -113,7 +113,7 @@ lock-configs
|
|
|
113
113
|
gh workflow disable <workflow-name>
|
|
114
114
|
|
|
115
115
|
# Force-protect the main branch
|
|
116
|
-
gh api repos/{owner}/{repo}/branches/
|
|
116
|
+
gh api repos/{owner}/{repo}/branches/main/protection \
|
|
117
117
|
--method PUT \
|
|
118
118
|
--field required_status_checks='{"strict":true,"contexts":["ci"]}' \
|
|
119
119
|
--field enforce_admins=true
|
|
@@ -56,7 +56,7 @@ These are weaker than a SHA256 check, but they catch the obvious
|
|
|
56
56
|
After chezmoi is installed, `install.sh` clones the dotfiles repo
|
|
57
57
|
itself. This isn't currently cryptographically verified beyond Git's
|
|
58
58
|
own object integrity, but commits in the repo are SSH-signed and
|
|
59
|
-
branch protection on `
|
|
59
|
+
branch protection on `main` requires signed commits (see #853).
|
|
60
60
|
|
|
61
61
|
## How to obtain per-release hashes
|
|
62
62
|
|
|
@@ -64,7 +64,7 @@ The verified-install snippet uses the SHA256 of the `install.sh`
|
|
|
64
64
|
file *as it exists at the release tag*. To regenerate after a release:
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
git switch
|
|
67
|
+
git switch main
|
|
68
68
|
git pull
|
|
69
69
|
NEW_TAG="v0.2.502" # adjust
|
|
70
70
|
git tag -s "$NEW_TAG" -m "..."
|
|
@@ -21,9 +21,9 @@ Properties:
|
|
|
21
21
|
|
|
22
22
|
## Policy artifact
|
|
23
23
|
|
|
24
|
-
The source of truth lives in [mcp-policy.json](
|
|
25
|
-
Approved package pins live in [mcp-lock.json](
|
|
26
|
-
Tracked server registry entries live in [mcp-registry.json](
|
|
24
|
+
The source of truth lives in [mcp-policy.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-policy.json).
|
|
25
|
+
Approved package pins live in [mcp-lock.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-lock.json).
|
|
26
|
+
Tracked server registry entries live in [mcp-registry.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-registry.json).
|
|
27
27
|
|
|
28
28
|
Current defaults:
|
|
29
29
|
|
|
@@ -75,4 +75,4 @@ Current approved refs:
|
|
|
75
75
|
- active servers match the tracked registry entries
|
|
76
76
|
- remote HTTP transports are HTTPS and OAuth-backed
|
|
77
77
|
|
|
78
|
-
Policy bundle baselines live in [policy-bundles.json](
|
|
78
|
+
Policy bundle baselines live in [policy-bundles.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/policy-bundles.json).
|
|
@@ -41,7 +41,7 @@ Aggregate score **7.6 / 10** at 2026-05-17T08:11:51Z.
|
|
|
41
41
|
[](https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles)
|
|
42
42
|
|
|
43
43
|
The badge above is regenerated every Monday at 06:00 UTC and on every
|
|
44
|
-
push to `
|
|
44
|
+
push to `main` by `.github/workflows/scorecard.yml`. The SARIF
|
|
45
45
|
result is uploaded to GitHub Code Scanning (Security tab) and
|
|
46
46
|
retained as a 30-day workflow artifact.
|
|
47
47
|
|
|
@@ -57,7 +57,7 @@ Regressions are triaged within one Monday cycle: identify the check
|
|
|
57
57
|
that dropped, either remediate or file an exception entry below with
|
|
58
58
|
a rationale and an expiry date.
|
|
59
59
|
|
|
60
|
-
## Per-check posture (snapshot,
|
|
60
|
+
## Per-check posture (snapshot, main HEAD)
|
|
61
61
|
|
|
62
62
|
The checks below come from OpenSSF Scorecard's published rubric. Tick
|
|
63
63
|
marks reflect this repo's posture at the time of writing — the
|
|
@@ -65,19 +65,19 @@ marks reflect this repo's posture at the time of writing — the
|
|
|
65
65
|
|
|
66
66
|
| Check | Status | Notes |
|
|
67
67
|
|---|---|---|
|
|
68
|
-
| Branch-Protection | ⚠ | `
|
|
68
|
+
| Branch-Protection | ⚠ | `main` requires signed commits, linear history, required checks (`.github/rulesets/main.json`). Scorecard can't read classic protection rules without a fine-grained PAT, so this check reports as `-1` ("internal error"). |
|
|
69
69
|
| Code-Review | ⚠ | Single-maintainer repo; PRs are self-merged after CI. Scorecard scores 0/30 here by design — see `Open findings` below. |
|
|
70
70
|
| Signed-Commits | ✓ | Enforced by pre-push hook (`scripts/git-hooks/pre-push`) and at-push by branch protection (#853 + #857). |
|
|
71
71
|
| Dependency-Update-Tool | ✓ | Dependabot configured for github-actions / npm / docker / devcontainers / uv. |
|
|
72
72
|
| 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. |
|
|
73
73
|
| License | ✓ | MIT at repo root (`LICENSE`). |
|
|
74
|
-
| Maintained | ✓ | Active commit cadence; the [README](
|
|
74
|
+
| Maintained | ✓ | Active commit cadence; the [README](https://github.com/sebastienrousseau/dotfiles/blob/main/README.md) lists the current `dotfiles_version`. |
|
|
75
75
|
| 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`. |
|
|
76
76
|
| SAST | ✓ | CodeQL (`.github/workflows/codeql.yml`) + Checkov + Grype. |
|
|
77
77
|
| SBOM | ✓ | Generated per PR by `sbom-diff.yml` and per release by `security-release.yml`. |
|
|
78
78
|
| Security-Policy | ✓ | `.github/SECURITY.md` + this page + `docs/security/THREAT_MODEL.md`. |
|
|
79
79
|
| Token-Permissions | ✓ | Top-level `permissions:` blocks restricted to `contents: read`. `write` scopes scoped to the jobs that need them (#886). |
|
|
80
|
-
| Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `
|
|
80
|
+
| Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `main` (#852). |
|
|
81
81
|
| Webhooks | n/a | No external webhooks configured. |
|
|
82
82
|
| CI-Tests | ✓ | Linux + macOS Intel + Apple Silicon matrix; optional Windows. |
|
|
83
83
|
| CII-Best-Practices | ☐ | Not applied yet — see `Open work` below. |
|
|
@@ -138,7 +138,7 @@ false positives in Scorecard's regex.
|
|
|
138
138
|
- **Re-trigger Scorecard after SLSA backfill propagates** — expected `Signed-Releases` 3 → 10.
|
|
139
139
|
- **`harden-runner` block-mode adoption (#878)** — should tighten the `Token-Permissions` check further.
|
|
140
140
|
- **Investigate `License` 9/10 false-positive** — repo is MIT (SPDX-compliant), Scorecard's penalty should not apply.
|
|
141
|
-
- **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/
|
|
141
|
+
- **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/main/protection` and document.
|
|
142
142
|
|
|
143
143
|
### Enabling Branch-Protection + Webhooks checks (one-time PAT setup)
|
|
144
144
|
|
|
@@ -180,7 +180,7 @@ gh api 'repos/sebastienrousseau/dotfiles/code-scanning/alerts?state=open&per_pag
|
|
|
180
180
|
--jq '[.[].rule.id] | group_by(.) | map({rule: .[0], count: length})'
|
|
181
181
|
|
|
182
182
|
# Trigger Scorecard manually:
|
|
183
|
-
gh workflow run scorecard.yml --ref
|
|
183
|
+
gh workflow run scorecard.yml --ref main
|
|
184
184
|
```
|
|
185
185
|
|
|
186
186
|
If a new category appears, add a row to the matching bucket. If a
|
|
@@ -45,7 +45,7 @@ Run `dot mcp --strict --json` to validate all MCP server configurations and capt
|
|
|
45
45
|
- [ ] **SBOM Generation**: Verify `dotfiles-sbom.spdx.json` is generated in release workflow.
|
|
46
46
|
- [ ] **Attestation Signing**: Confirm `actions/attest-build-provenance` signs the release artifacts.
|
|
47
47
|
- [ ] **Attestation Verification**: Verify with `gh attestation verify <artifact> --repo sebastienrousseau/dotfiles`.
|
|
48
|
-
- [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on
|
|
48
|
+
- [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on main.
|
|
49
49
|
- [ ] **Automation Keying**: Confirm `ACTIONS_BOT_SIGNING_KEY` exists and matches the signer in `dot_config/git/allowed_signers`.
|
|
50
50
|
|
|
51
51
|
## 7. Final Verification
|
|
@@ -7,10 +7,10 @@ render_with_liquid: false
|
|
|
7
7
|
Every bash script in this repo must include `set -euo pipefail` (or
|
|
8
8
|
`set -eu` for POSIX `sh`) within its first 50 lines. The rule is
|
|
9
9
|
enforced by
|
|
10
|
-
[`tools/ci/check-shell-preamble.sh`](
|
|
10
|
+
[`tools/ci/check-shell-preamble.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/check-shell-preamble.sh),
|
|
11
11
|
wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
|
|
12
12
|
Tests pin the contract under
|
|
13
|
-
[`tests/unit/security/test_shell_preamble_lint.sh`](
|
|
13
|
+
[`tests/unit/security/test_shell_preamble_lint.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tests/unit/security/test_shell_preamble_lint.sh).
|
|
14
14
|
|
|
15
15
|
## Why the preamble is mandatory
|
|
16
16
|
|
|
@@ -12,13 +12,13 @@ Controlled inventory for software of unknown pedigree used by the dotfiles platf
|
|
|
12
12
|
|
|
13
13
|
| Component | Source | Version control | Verification path | Owner | Status |
|
|
14
14
|
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
15
|
-
| Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](
|
|
15
|
+
| Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](https://github.com/sebastienrousseau/dotfiles/blob/main/install/lib/package_managers.sh) | Repo maintainer | Conditional |
|
|
16
16
|
| Chezmoi installer | `get.chezmoi.io` | Pinned by `CHEZMOI_INSTALLER_SHA256` when used | SHA-256 in `install/lib/chezmoi.sh` | Repo maintainer | Controlled |
|
|
17
17
|
| GitHub Actions marketplace actions | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pins | Repo maintainer | Controlled |
|
|
18
|
-
| Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](
|
|
19
|
-
| Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](
|
|
18
|
+
| Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
|
|
19
|
+
| Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
|
|
20
20
|
| Checkov action | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pin | Repo maintainer | Controlled |
|
|
21
|
-
| Nix inputs | GitHub flakes | Locked in [flake.lock](
|
|
21
|
+
| Nix inputs | GitHub flakes | Locked in [flake.lock](https://github.com/sebastienrousseau/dotfiles/blob/main/flake.lock) | `narHash` and revision lock | Repo maintainer | Controlled |
|
|
22
22
|
| GitHub release metadata queries | GitHub API | Discovery only, not release validation | `update-deps.yml` query path | Repo maintainer | Monitored |
|
|
23
23
|
|
|
24
24
|
## Validation record
|