A CLI-first git forge.

cli forge git self-hosted

https://gitbay.org

control: repo blame, repo commit-file, repo refs; milestone on mr show !99

merged cmc wants to merge krz/gitbay:ios-parity-contract into main

cmc

The web reached past the command registry in two places, which is how blame and file editing ended up web-only — unreachable from the CLI, the JSON API, and any native client. Both are commands now, and the web dispatches them.

  • repo blame attributes lines to commits, paging with --from/--to, capped at BlameSpan — which is also the web's page size, so the two cannot drift. Binary and empty files are refusals that say why rather than 404s. The web's handler renders the command's output; the signature badge stays presentation.
  • repo commit-file writes one file and commits it, carrying the rules editSubmit enforced privately: write access, not archived, a verified primary email, and a refusal when the repo requires signed commits — the server authors this commit, so it cannot sign it.
  • repo refs lists branches and tags, so clients offer the same choices the web does instead of asking people to type a branch name.
  • mr show carries its milestone, which was previously a blind write: you could set it and nothing readable changed.
  • runControlInto decodes a command's data into a typed value, so read handlers go through the registry without giving up their types.

The existing web tests are the proof the rewrites preserved behaviour: TestBlameView still renders three hunks with subjects and signature badges, and TestWebAccounts still asserts the edit commit's author, subject, unsigned state, and the require-signed refusal — all now through the registry. New coverage exercises the same capabilities over SSH, including path escapes and a stranger's write attempt.

Full suite green.

Closes #42 Closes #43 Closes #45