• v0.7.0 ba06cdcbb6

    v0.7.0
    All checks were successful
    ci / check (push) Successful in 11m32s
    ci / coverage (push) Successful in 2m14s
    ci / live-e2e (push) Successful in 2m52s
    release / prepare (push) Successful in 4s
    release / build (catthehacker/ubuntu:act-22.04, linux-x86_64, docker, x86_64-unknown-linux-gnu) (push) Successful in 4m4s
    release / build (darwin-aarch64, macos-15, aarch64-apple-darwin) (push) Successful in 4m49s
    release / build (darwin-x86_64, macos-15, x86_64-apple-darwin) (push) Successful in 5m0s
    release / publish (push) Successful in 21s
    release / guard (push) Has been skipped
    Stable

    stephen released this 2026-10-20 17:04:57 +00:00 | 4 commits to main since this release

    Signed by stephen
    GPG key ID: 67F885778E01BF16

    Added

    • fj runner token. Prints an Actions runner registration token and
      nothing else, so provisioning can run
      forgejo-runner register --token "$(fj runner token --org ORG)". Scope is
      the repository (-R, or the current clone) by default, or --org, --user
      or --instance (instance administrators only).

    Fixed

    • fj pr ready clears the draft state. Forgejo and Gitea compute "draft"
      from a work-in-progress title prefix and ignore a draft field on edit, so
      the old {"draft": false} PATCH reported success and changed nothing.
      fj pr ready now removes the WIP: or [WIP] prefix from the title and
      confirms against the response that the pull request is no longer a draft. It
      says so when the pull request was already ready, and fails with the fix
      when the title carries a prefix only the instance knows about. fj stack sync --ready shares the path.
    • fj pr create --draft and fj stack sync --draft open a draft. The
      draft field they sent on create was ignored for the same reason. They now
      prefix the title with WIP: unless it already has a recognised prefix.
    • Ctrl+C exits 130 on the graceful path. Only the forced backstop used the
      conventional status; an interrupt the command loop caught itself exited 1.
    • fj issue list and fj issue create explain a repo without a built-in
      tracker.
      A repo that keeps issues in an external tracker, or has them
      switched off, answers 404 on the issue routes, which read as "not found:
      owner/repo". The message now names the cause and the external tracker URL.
      The exit status is still 3.
    • The Homebrew formula test matches real output. It looked for the short
      description in fj --help, which prints the long one. It now reads fj -h.
    • Run commands find runs older than the newest 50. fj run view, --log,
      --log-failed, rerun, cancel and artifact downloads resolve a run number
      through the run list, and that read never left the first page because Forgejo
      sends no Link header there. An older run in a busy repository was reported
      as not found. The lookup now asks the server for the run number directly, and
      fj run list --paginate follows total_count, so it returns every page too.
      fj run view --log-failed on a run with nothing failed says so (#248).

    Security

    • rustls 0.23.46. Picks up the fixes for RUSTSEC-2026-0346 through 0349,
      which include a ServerHello that could downgrade later connections to
      classical key exchange and Debug output that exposed TLS session secrets.
    Downloads