Some checks are pending
ci / check (push) Waiting to run
release / build (darwin-aarch64, macos, aarch64-apple-darwin) (push) Waiting to run
release / build (darwin-x86_64, macos, x86_64-apple-darwin) (push) Waiting to run
release / build (rust:1.95-bookworm, linux-x86_64, docker, x86_64-unknown-linux-gnu) (push) Waiting to run
release / publish (push) Blocked by required conditions
Release infrastructure:
* .forgejo/workflows/release.yml: on v* tags, builds darwin-aarch64,
darwin-x86_64, linux-x86_64 tarballs, computes SHA256SUMS, uploads to
the Forgejo release, and writes a ready-to-commit fj.rb formula.
* dist/homebrew/fj.rb.tmpl + scripts/render-homebrew-formula.sh for
local rendering. Publishes into rasterandstate/homebrew-tap.
Issue + PR templates:
* .forgejo/issue_template/{bug,feature,api-gap}.md so triage isn't
guessing at the user's environment.
* .forgejo/pull_request_template.md with a fmt/clippy/test checklist
and a "what to update" surface-changes section.
README demo scaffolding:
* scripts/record-demo.sh drives asciinema through a representative
~30s session covering --version, repo view (auto-detect), issue/pr
list, api, --json-fields, browse.
* README has a commented-out asciicast embed waiting for the v0.1.0
recording.
Compatibility:
* docs/compatibility.md: tested Forgejo versions, caveats for older
Gitea (≤1.19), Forgejo-only endpoints we expose.
* `fj auth login` now probes /api/v1/version once and warns to stderr
when the server reports a pre-7.x version. Parser is pure-fn tested
(modern, old, unparseable cases).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.4 KiB
5.4 KiB
Changelog
All notable changes will be recorded here. The format follows Keep a Changelog. Versions follow Semantic Versioning.
[Unreleased]
Added (distribution + open-source ready)
LICENSE(MIT) at the repo root. Cargo.toml had always declared MIT; the file was just missing..forgejo/workflows/release.yml: onv*tags, builds fordarwin-aarch64,darwin-x86_64,linux-x86_64; uploads tarballs,SHA256SUMS, and a pre-renderedfj.rbto the Forgejo release.- Homebrew formula template at
dist/homebrew/fj.rb.tmplandscripts/render-homebrew-formula.shto fill SHA256s post-release. Publishes into the existingrasterandstate/homebrew-tap. .forgejo/issue_template/{bug,feature,api-gap}.mdand.forgejo/pull_request_template.mdto keep triage cheap.scripts/record-demo.sh+scripts/_demo-session.shto record an asciinema demo; README has a placeholder embed for the v0.1.0 cast.docs/compatibility.md: tested Forgejo versions, caveats for older Gitea, and Forgejo-only endpoints.- One-shot version probe during
fj auth loginthat warns when the server reports a pre-7.x version (with tests for the parser).
Added (agent-focused Forgejo gaps)
fj issue edit-comment/delete-comment. Lets an agent (or you) fix or remove a wrong comment after the fact.fj search code "..."(and-R owner/nameto scope to one repo). Powered by Forgejo's/repos/search/codeendpoint.fj pr request-review N user1 user2,user3andfj pr unrequest-review N user1. Distinct frompr review, which submits your own review.fj repo watch/unwatch/star/unstar/starred.fj milestone {list,view,create,edit,close,reopen,delete,assign}. Includesfj milestone assign N --milestone ID|noneto attach an issue or PR to a milestone.
Added (UX + stability)
--json-fields field1,field2global flag. gh-style projection on top of any--jsonoutput, with dotted-path support (--json-fields owner.login,id).- 429 / Retry-After honored in the retry loop with a 30 s cap. Wiremock test added.
did you meansuggestions on typo'd subcommands via clap'ssuggestionsfeature.fj auth tokenandfj auth status --show-tokennow refuse to write to a TTY (use--forceto override). Avoids accidental shoulder- surfing or capture in shell history.tokio::signal::ctrl_c()race incli::runso the pager guard drops cleanly on SIGINT.- 10 wiremock-backed HTTP client integration tests covering retry behavior (5xx, 429), header forwarding, pagination, and panic-free error paths.
Client::for_base_urltest constructor pointing at an arbitrary URL..forgejo/workflows/ci.ymlruns the same gate as the pre-push hook on every push and PR.
Added (docs)
SECURITY.mdcovering threat model, known sharp edges, and reporting.docs/gh-to-fj.md— complete command-by-command mapping.docs/faq.md— common questions about tokens, hosts, debug, scripting, plugins.
Changed
- Trimmed dependencies (no more
indicatif,futures-util,is-terminal,textwrap,tempfilein prod). Dropped reqwest features we don't use (stream,brotli). Release profile useslto = "fat"andpanic = "abort". - HTTP retry loop builds the request once and clones via
reqwest::Request::try_cloneper attempt. - Binary size: 5.94 MB → 4.15 MB stripped (-30%).
Fixed
- Shell injection in
fj auth setup-git. The hostname now must match a strict DNS pattern before being interpolated into the credential-helper string, and we callgit configdirectly with separate args instead of going throughsh -c. - Pager won't compile on Windows. The libc-based
dup2redirect now lives behind#[cfg(unix)]; non-Unix gets a no-op stub that returnsNonefrommaybe_start. - Removed the unsafe
std::env::set_var("FJ_NO_PAGER")from dispatch.--no-pageris now threaded intopager::maybe_start(force_disabled). - Replaced the panicking
.expect("token contains invalid header chars")inauth_headerswith a typed error.
0.1.0 — 2026-05-13
Initial release. Multi-host Forgejo CLI with feature parity to gh
across the surface Forgejo exposes. Commands:
auth: login, status, logout, list, switch, token, refresh, setup-gitrepo: list, view, clone, create, fork, sync, edit, rename, archive, unarchive, delete, branches, topics, mirror, mirror-syncissue: list, view, create, edit, close, reopen, comment, developpr: list, view, create, edit, diff, commits, files, checks, ready, review, status, checkout, merge, close, reopenrelease: list, view, create, edit, delete, upload, downloadlabel,run,secret,variable,search,browse,status,org,ssh-key,gpg-key,alias,config,protect,hook,extension,gist,api,completion,man
Other highlights:
- Repo auto-detection from
upstream/origingit remote. --webflag on all list/view subcommands.$EDITORintegration for body inputs.fj apiwith-H,-X,-f,-F,--paginate,--include,--silent,--jq(dot-paths,[N]/[-N], pipes).--debug/FJ_DEBUGrequest logging.- Tokens in the OS keychain.
- Pager via
dup2redirect to$FJ_PAGER/$PAGER/less -FRX. - Pre-push hook running fmt, clippy
-D warnings, tests, and release build before any push. Live API smoke gated onFJ_E2E=1.