vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Let an account be a bot
29a795b9d5b79cf5c8f2b7f3b4f6572f7cdff444 · Keenan Nemetz · 6d ago · parent e7aa0785
Let an account be a bot An automation needs an identity: something to assign an issue to, mention in a comment, and name in an approval and the audit log. An account already gives all of that, so this adds only the invariants a bot needs and the word for it. A bot is created with `vole admin account create --bot`, with the repository role the admin decides it should have. It has no browser sign-in — `account invite` and adding a passkey are refused — and it cannot hold the instance-admin role, because Admin reaches every repository and every instance surface while a bot is a repository automation. It is marked as a bot in the user directory and on its profile. Everything else is deliberately unchanged. A bot obeys the rules of its role: a contribute bot pushes only its own contributor branch and its CI waits for a maintainer to allow the tip; a maintain bot pushes shared branches, runs CI immediately, and its approval counts. The kind is fixed at creation, like the name, and a roster that predates it reads every account as a person. This is the first of three slices of #165. The per-run credential that lets a workflow act as a bot without a long-lived key in a repository secret is next; this slice changes no push rule and no permission.
server/web/profile.go +2−1
| @@ -78,6 +78,7 @@ type profileRepoRow struct { | |||
| 78 | 78 | type profileView struct { | |
| 79 | 79 | Page | |
| 80 | 80 | Name string | |
| 81 | Bot bool | ||
| 81 | 82 | Active bool | |
| 82 | 83 | Joined time.Time | |
| 83 | 84 | ShowRole bool | |
| @@ -137,7 +138,7 @@ func (w *Web) ProfilePage(rw http.ResponseWriter, r *http.Request) { | |||
| 137 | 138 | } | |
| 138 | 139 | page.NoIndex = true | |
| 139 | 140 | view := profileView{ | |
| 140 | Page: page, Name: acct.Name, Active: acct.Active(), Joined: acct.Created, | ||
| 141 | Page: page, Name: acct.Name, Bot: acct.Bot(), Active: acct.Active(), Joined: acct.Created, | ||
| 141 | 142 | Stats: stats, Repos: repos, Type: filter.query, Events: events, Pager: pages, | |
| 142 | 143 | } | |
| 143 | 144 | // The instance role is a targeting list rather than a description of | |