Some checks are pending
ci / check (push) Waiting to run
* scripts/demo.tape: vhs tape file driving a ~30s session: --version, repo view (auto-detect), issue list, pr list, api + jq, selective JSON, help. Catppuccin Mocha, 1100x720. * scripts/record-demo.sh: thin wrapper with preflight checks (vhs + fj installed and authenticated, run from a clone). Outputs assets/demo.gif and assets/demo.mp4. * Removed scripts/_demo-session.sh (the asciinema sketch). vhs is strictly better for scripted demos: deterministic timing, direct GIF/MP4 output, no upload step. * README: replaced the asciinema TODO with the GIF embed (will resolve once assets/demo.gif is recorded and committed). To record: brew install vhs cargo build --release && ln -sf \$PWD/target/release/fj ~/.local/bin/fj fj auth login --host rasterhub.com ./scripts/record-demo.sh 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.