Added
-
ggshield is now available as a MSI package.
-
Add sigstore signature verification for plugin wheels, enforcing identity-based trust via OIDC. Install and update operations are strict by default, while
--allow-unsignedpersists an explicit trust exception for the exact wheel hash so explicitly accepted unsigned plugins can still load at runtime. -
API tokens are now stored in the OS credential store (macOS Keychain, Windows Credential Locker, Linux Secret Service) via the
keyringlibrary instead of cleartext inauth_config.yaml. Existing cleartext tokens are migrated automatically the next time the configuration is saved. If no OS credential store is available orGGSHIELD_NO_KEYRING=1, file-based storage is used as a fall-back. -
Added a new
secret.fail_on_server_errorconfiguration option (defaultTrue), available as the--fail-on-server-error/--no-fail-on-server-errorflag orGITGUARDIAN_FAIL_ON_SERVER_ERRORenvironment variable. When set toFalse,secret scan pre-commit,secret scan pre-push,secret scan pre-receive, andsecret scan ciexit with code0and display a warning instead of blocking the git operation when the GitGuardian server is unreachable or returns a 5xx response. The default preserves the previous blocking behavior. -
New
ggshield ai discovercommand. -
The AI hooks now also log/block MCP activity
Changed
- Breaking:
secret scan pre-receiveno longer fail-opens by default when the GitGuardian server returns a 5xx response. Previously the push was allowed through with a warning; now it is blocked, matching the other git hooks. Setsecret.fail_on_server_errortoFalse(or pass--no-fail-on-server-error) to restore the previous fail-open behavior.
Fixed
-
Forward
signature_modethrough GitHub release and GitHub artifact download paths, ensuring signature verification is applied consistently across all install sources. -
Scans of large repositories no longer fail on a single transient network glitch. ggshield now retries connection errors (e.g.
ConnectionResetError) and 502/503/504 responses with bounded exponential backoff. -
Global Copilot hooks are configured correctly in
~/.copilot.
Security
- Pin the default package index in
pyproject.tomlto public PyPI and add a rollingexclude-newer = "3 days"constraint, so the resolveduv.lockis reproducible for external contributors/CI and newly-published (potentially malicious) releases get a short quarantine window before they can land in the lock.