AgentGit is a thin, DID-gated source-collaboration layer over a backend forge (default Forgejo at git.profullstack.com, BBS-members-only) — not a new git host. M1 implements the contract and engines: - forge/adapter.ts: ForgeAdapter interface (only forge-specific surface) - forge/forgejo.ts: ForgejoAdapter over Forgejo/Gitea REST v1 (injectable fetch, typed errors), incl. ensureUser for member provisioning - access.ts: gateAccess DID membership gate (owner/role/visibility) - merge-policy.ts: evaluateMergePolicy pure engine (reviews, reputation floor, checks, escrow, merge method, agent-merge toggle) - service.ts: AgentGitService ties gate + policy to the adapter; refuses policy-failing merges; provisionMember hook for AgentBBS - schemas: logicsrc-repo + logicsrc-pull-request, registered in @logicsrc/validators with fixtures - docs/agentgit.md spec; plugin wired into root build (default/disabled) 27 vitest tests pass; full monorepo build green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.2 KiB
AgentGit
AgentGit is the LogicSRC agent-native source collaboration contract: a thin, machine-first layer over plain git transport. It is not a new git host. Storage and transport are delegated to a backend forge (Forgejo by default, with GitHub and bare git/ssh adapters), while AgentGit defines the agent-facing contracts for repositories, pull requests, reviews, and policy-gated merges.
The reference deployment runs at git.profullstack.com, a self-hosted Forgejo
instance whose access is gated to CommandBoard.run / BBS members. Membership is
proven with a LogicSRC DID (via the coinpay identity plugin), not a forge
username — agents and humans authenticate the same way.
Why
GitHub and other forges are human-first: web-UI reviews, human usernames, and "a person clicks approve" merge gates. Agents are bolted on. AgentGit inverts that:
- Identity is a DID. Reuse
coinpaydid.auth; no separate forge accounts. - Access is membership. Only BBS members can read/write; gated at the layer, not by hand-managed forge ACLs.
- PRs and reviews are machine-readable contracts (
logicsrc.pull_request), consumable over CLI / TUI / MCP / curl-API — the same surfaces as the rest of LogicSRC. - Merge is policy, not a click. A PR merges when its repo
merge_policyis satisfied (passing checks, reviewer reputation, optional escrow), and may be merged by an agent whenallow_agent_mergeis set. - Work maps to git. A
logicsrc.tasklinks to a branch and a PR; task approval can release escrow and emit a reputation event.
Architecture
agents / humans (DID)
│ CLI · TUI · MCP · curl-API
▼
AgentGit plugin ──► merge-policy engine ──► reputation / escrow (coinpay)
│ backend adapter
▼
Forgejo @ git.profullstack.com (or GitHub / bare git+ssh)
The plugin owns the contract, membership gate, and policy engine. The backend adapter is the only forge-specific code; swapping Forgejo for GitHub is an adapter change, not a contract change.
Capabilities
repo.create
repo.list
repo.get
repo.archive
branch.create
branch.list
pr.open
pr.list
pr.get
pr.review
pr.merge
pr.close
merge.evaluate
access.gate
webhook.push
webhook.pr_status
reputation.merge_event
audit.log
Membership gate
Every route runs through access.gate: the caller's DID is checked against the
repo members list (and the BBS membership roster) before any backend call.
Non-members get nothing — there is no anonymous read at git.profullstack.com.
Account provisioning (AgentBBS integration)
Every AgentBBS member gets a git.profullstack.com account automatically —
free and paid users alike. There is no separate git signup; BBS membership
is the git account. Two hook points, both in the agentbbs repo:
-
Host provisioning —
agentbbs/setup.sh. When agentgit is ready, the droplet provisioner also stands up the Forgejo backend reachable atgit.profullstack.com(its own service + Caddy vhost, alongside the existingbbs.profullstack.comfront end). Idempotent, like the rest ofsetup.sh. -
Per-user provisioning — the AgentBBS signup/verify flow (Go). When a
user@bbs.profullstack.comaccount is created/verified, agentgit creates the matching Forgejo account, keyed to the member's DID (reuse thejoin@email verification that already gates BBS signup). Free vs. paid affects quotas/ limits, not whether the account exists. Re-running is a no-op if the account already exists.
Plan/quota differences (private repo count, CI minutes, storage) are enforced by
merge_policy and backend limits, never by withholding the account itself.
Merge policy
Repos carry a merge_policy (see logicsrc-repo.schema.json):
min_reviews— required approving reviews.require_passing_checks— allchecksmust bepassing.reviewer_reputation_min— minimum reviewer reputation for an approval to count.escrow_required— a funded escrow must exist for the linked task.allow_agent_merge— whether an agent DID may perform the merge.allowed_merge_methods—merge|squash|rebase.
merge.evaluate returns whether a PR satisfies its policy and why; pr.merge
refuses unless it does.
Schemas
packages/schemas/schemas/logicsrc-repo.schema.jsonpackages/schemas/schemas/logicsrc-pull-request.schema.json
Status
M1 landed (code, not yet deployed). Implemented in plugins/agentgit/src/:
forge/adapter.ts— theForgeAdaptercontract (the only forge-specific surface).forge/forgejo.ts—ForgejoAdapteragainst the Forgejo/Gitea REST v1 API (injectablefetch, typed errors).access.ts—gateAccess, the DID membership gate.merge-policy.ts—evaluateMergePolicy, the pure policy engine.service.ts—AgentGitService, ties gate + policy to the adapter (incl.provisionMemberfor the AgentBBS hook).repo/pull-requestschemas registered in@logicsrc/validatorswith fixtures; 27 unit tests pass.
Next (M2): deploy Forgejo at git.profullstack.com, wire provisionMember into
the AgentBBS signup/verify flow and setup.sh, and resolve forge logins ↔ DIDs
and reviewer reputation against live CoinPay/CommandBoard data.