zz_

d41b2d71 ยท zzmq.dev@gmail.com/zz

Commit

d41b2d712d487a7a783720084a0cbd66d9a3f2aa

Git push: full RBAC-gated clone/fetch/push, like normal git/GitHub git-receive-pack is now proxied alongside git-upload-pack, so the full range of git operations works against <origin>/<slug> -- clone, edit, commit, push -- not just read. Push always requires real, resolved authentication (an agent's bearer token via Basic Auth; there's no session-cookie path since git sends none) and is gated at Maintainer or above on the target repo, checked with the same repoRoleFor/repoAtLeast used everywhere else in the RBAC layer. This matches governance.md's own model deliberately: a raw push bypasses the per-changeset changeset_review a Contributor would otherwise need, so it's held to the same authority that could grant that review anyway, not opened to every Contributor. Public repos are publicly readable, never publicly writable, same as GitHub. Private-repo reads also now check the git-resolved agent principal (previously only a session cookie was checked, which no git CLI request ever carries, making private clone impossible even for an authorized agent). Unauthenticated requests that need credentials get a proper 401 + WWW-Authenticate so git prompts/retries instead of silently failing; requests with credentials that aren't sufficient get 404, not 403 or 401, so a private repo's existence and a "wrong/insufficient credentials" case look identical from outside. Verified live, end to end, exactly as asked: cloned a repo via the proxy, created an agent, minted its token, attempted a push with NO grant (correctly rejected -- "remote: not found"), granted that agent Maintainer via /profile/rbac, pushed again (succeeded), and confirmed the pushed content actually landed by reading it back. Test repo/ agent/token/session cleaned up after. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Troy Howard <thoward37@gmail.com> -- 2026-10-12T01:54:07.000Z

Tree at this commit