Summary
Cherry-pick upstream forgejo-cli changes since upstream-reviewed/2026-03-31, bump forgejo-api 0.9.0 → 0.11.0, and expose the new Actions API surface.
Cherry-picked (17 commits)
repo edit & units -- new repo management subcommands:
41a9922feat: repo edit command (forgejo-contrib/forgejo-cli#349)90449f4feat: repo units command (forgejo-contrib/forgejo-cli#349)
repo migrate -- migrate directly into an org:
b075f78feat: allow setting owner for migrated repo (forgejo-contrib/forgejo-cli#416)92c163adocs: add oneline helptext to 'repo migrate' command (forgejo-contrib/forgejo-cli#443)
Issue/PR fixes:
c35fc0ffix: don't include pull requests inissue list(forgejo-contrib/forgejo-cli#393)9d630f3feat(pr-reviews): Add command to view pull request reviews (forgejo-contrib/forgejo-cli#429)6eec300feat: support all casings of README (forgejo-contrib/forgejo-cli#415) -- supersedes ourb44d9aed195b9efeat: add warning aboutgit push --forceon agit prs (forgejo-contrib/forgejo-cli#420)
OAuth/keys:
1514dc7fix(oauth): detach opened browser (forgejo-contrib/forgejo-cli#407)e0e1d04fix(oauth): save new token immediately after refreshing (forgejo-contrib/forgejo-cli#417)1d455acrefactor: movekeys.save()out ofmain(forgejo-contrib/forgejo-cli#417)117c4a7b5da7f6bf10bd5a3ce4dc72cb79erestrict keys.json/tempfile permissions to 0600 on Unix (forgejo-contrib/forgejo-cli#449)b122607feat(login): v16.next.forgejo.org (forgejo-contrib/forgejo-cli#496)4a5e2f2chore(login): remove id for v7.next.forgejo.org (forgejo-contrib/forgejo-cli#497)a5831f5feat!: remove username from keys (forgejo-contrib/forgejo-cli#504) -- BREAKING:auth add-keyloses its<user>positional; old keys.json files still load, new ones won't load in ≤v1.1.0. Warrants a major version bump.
ssh/git:
0796529fix: Use get_ssh_config() to access ssh config (forgejo-contrib/forgejo-cli#462)279af48fix(checkout): don't include port in refspec (forgejo-contrib/forgejo-cli#510)955e6dbfeat: make--hostflag global (forgejo-contrib/forgejo-cli#514)
Deps/chores:
f474338chore: add query parameter tolist_action_tasks(forgejo-contrib/forgejo-cli#422)772c567Update Rust crate comrak to 0.52.0 (forgejo-contrib/forgejo-cli#396)d53ac46Update Rust crate git2 to 0.21.0 (forgejo-contrib/forgejo-cli#467)ff9e70cchore: updateauth-git2to 0.6.0 (forgejo-contrib/forgejo-cli#467)8493d43chore(dep): enablehttpsandsshfeatures on git2 (forgejo-contrib/forgejo-cli#490)36a30e0fix: typos (forgejo-contrib/forgejo-cli#430)e3ad8f2fix typo (forgejo-contrib/forgejo-cli#469)90a5a0dFix project licenses (forgejo-contrib/forgejo-cli#507)cb46e0fbuild: usetrixietag for debian image (forgejo-contrib/forgejo-cli#425)
Adapted (ported manually, upstream diffs entangled with l10n or our divergences)
1244fcc+15e9fb2forgejo-api 0.11.0 bump (forgejo-contrib/forgejo-cli#519, forgejo-contrib/forgejo-cli#422) -- single-step 0.9→0.11; fixespr statusagainst modern servers (relativetarget_url); pre-v16 server compatibility restored via the vendored patch belowf8dbe99supportskippedcommit status (forgejo-contrib/forgejo-cli#519)e040613show warning on archived repos (forgejo-contrib/forgejo-cli#419) -- gated off--jsonso agent output stays clean and costs no extra API callba50965+8b82c17issue/pr assign & unassign (forgejo-contrib/forgejo-cli#414) -- reimplemented over ouredit_assignees; upstream'sunassignhas an invertedretainthat deletes every other assignee (still live at upstream HEAD; regression-tested here)1df2ad5resolve ssh host via ssh config (forgejo-contrib/forgejo-cli#462) -- with the scp-stylegit@host:pathfallback upstream's version regressed, and HostName resolution gated to ssh-scheme URLsc4defdbbreak up auth_server return type (forgejo-contrib/forgejo-cli#484)447091d+d5ab501activity repo_name dedup (forgejo-contrib/forgejo-cli#437) -- kept our dual-format content parser (JSON + legacy pipe)92d90abreplace crossterm with terminal_size (forgejo-contrib/forgejo-cli#526)a0aa39foptimize cargo release profile (forgejo-contrib/forgejo-cli#520)298a3eeclippy fixes, applicable half (forgejo-contrib/forgejo-cli#531)b7192ceorg name message pluralization (fluent-only upstream; plain string here)e10940crand 0.10.1 security floor (forgejo-contrib/forgejo-cli#409)4eee04cserde-saphyr 0.0.28 (consolidates six Renovate bumps; 0.0.x are mutually incompatible so Cargo.toml had to move)
Skipped (~235 commits)
- The entire fluent/l10n localization framework (forgejo-contrib/forgejo-cli#279) and all locale/Weblate commits -- fork policy
1c1228eauth_server unreachable fix,799f35fpr review panic fix -- both fix regressions introduced by l10n commits we don't carry- Lock file maintenance, upstream Woodpecker CI, release/publish infra, version bumps, README badge docs, issue templates
Fork additions
- New:
fj actions run list|view|jobs|logs|cancel|delete,fj actions artifact list|download|delete,fj actions tasks --status,fj pr search --base/--head(new forgejo-api 0.10/0.11 endpoints, Forgejo v15/v16) mainruns the runtime on a 16 MiB thread: forgejo-api 0.11's larger structs overflow the 1 MiB Windows main-thread stack in debug builds- Dropped unused git2/uuid build-dependencies (was compiling a second vendored libgit2)
- Corrected the codefloe.com OAuth client id to upstream's canonical value
--repo/-ron the new repo edit/units and pr review subcommands, mutation confirmations, verbose logging- Test suite grew ~40 tests (assign/unassign regression, archived warnings, readme casings, pr reviews, pr status skipped, actions surface, ssh config aliases, legacy keys.json compat)
Live-testing fixes (found against codeberg.org and a v15 sandbox)
- Vendored forgejo-api with a pre-v16 compatibility patch (
vendor/forgejo-apivia[patch.crates-io]): stock 0.11.0 requires key presence for manyOptionresponse fields, and Forgejo v15 omits several (Organization.created-- also insideTeamobjects embedded in PR responses -- andPublicKey.updated_at). On codeberg.org this brokepr view/pr search --baseon any PR with a team review request, plusorg viewanduser key list. The patch addsserde(default)to 183 presence-requiredOptionfields; seevendor/forgejo-api/PATCHES.md. All four failures verified fixed against codeberg.org (15.0.0) and a 15.0.3 instance. repo units <unit>with no flags now reports status instead of sending a no-op PATCH and claiming "Updated".- ssh config
HostNameIP literals no longer rewrite the API host:Host git.example.com+HostName <ip>redirects the ssh transport, but the domain is still the forge identity; the rewrite made fj derivehttps://<ip>as the API base and miss the saved login.
All 25 test binaries pass (~320 tests). Live-tested read-only against codeberg.org/forgejo/forgejo (search, pagination, reviews, releases, activity) and mutating against a private v15 sandbox (issue lifecycle, milestones, repo create/edit/units/delete with dry-run, archived warnings, full PR create/status/checkout/squash-merge flow, scp-style remotes).