Skip to content

v0.3.9 — read-only git passes the staged-secret guard

Latest

Choose a tag to compare

@AndrewDongminYoo AndrewDongminYoo released this 03 Sep 08:52
4a8947c

The guard that scans a commit for credentials used to refuse git commands it could not parse, whether or not they committed anything. This release makes it wait until it knows the subcommand, and closes six ways a real commit slipped past it unseen.

What changed

guard-hooks 0.2.6 → 0.2.7staged-secret-guard no longer blocks read-only git. A global option the parser could not resolve, such as a shell variable in -C or a --no-pager, used to be refused before the subcommand was known, so for d in */; do git -C "$d" log; done came back as an unparsable commit. The verdict now waits for the subcommand and fires only on a real git commit. In the other direction, six shapes that ran a commit the hook never scanned are now caught: a long option carrying its value without = (git --git-dir /repo/.git commit), "$@" and "${name[@]}" expanding to several words, time git commit, a commit option value that can smuggle -a, a git command behind if or in a for/while body, and a subcommand that is itself an expansion (git "$cmd" -m x). -c and --config-env in front of a subcommand the hook cannot identify are still refused, now with a message that says so instead of reporting an unparsable commit, because command-scoped config can alias commit under another name.

The repository also carries docs/notes/staged-secret-guard-approach-review-2026-09-03.md: thirteen ways to reach a commit were run against the guard with a credential staged, and it recognises two. A function wrapper, sh -c, eval, a script file, xargs, make, and npm run all pass it. That is the ceiling of deciding from a command string what it will execute, and the note is there so the next attempt starts from that number.

repo-gate 0.1.5 → 0.1.6 — no code change. The bump exists because two skill changes from 1 September had shipped without one, and the client caches a plugin under its version string, so no installed copy had received them. ci-babysit now names the zero-steps failure shape: a run that fails in seconds with an empty steps array is a billing or runner block upstream of the workflow, read from the run's annotation rather than from a diff. cspell-triage warns that a local dictionary registered under a bundled dictionary's name silently masks the bundled one, and says to check a candidate name against cspell dictionaries before registering it. That last correction is #13 by @webdevsamran, the first outside contribution to this repository.

context-handoff is unchanged (0.1.4).

Why it matters

If you run guard-hooks 0.2.6, any git invocation with a variable in a global option is refused today, including loops over repositories and anything with --no-pager; 0.2.7 lets those through and scans strictly more of the commits that matter. If you run repo-gate 0.1.5, the two skill notes above are not in your copy at all, whatever the changelog says.

Upgrade

claude plugin update guard-hooks@cc-agents-kit
claude plugin update repo-gate@cc-agents-kit