Some checks are pending
ci / check (push) Waiting to run
Bugs:
* Shell injection in `fj auth setup-git`: the hostname is now validated
against a strict DNS pattern and `git config` is invoked directly
(no `sh -c`). Added 4 unit tests covering shell metacharacters.
* Pager won't compile on Windows: the libc-based dup2 redirect lives
behind `#[cfg(unix)]`. Non-Unix gets a no-op stub.
Agent-focused Forgejo API gaps:
* `fj issue edit-comment ID` / `delete-comment ID`. Fix a wrong comment
after the fact (an agent's bread-and-butter).
* `fj search code "..." [-R owner/name]`. The most-requested missing
search dimension for codebase exploration.
* `fj pr request-review N user1 user2`, `unrequest-review N user`.
Distinct from `pr review` (your own approval/changes/comment).
* `fj repo watch / unwatch / star / unstar / starred`. Mark repos for
monitoring.
* `fj milestone {list,view,create,edit,close,reopen,delete,assign}`
with `assign N --milestone ID|none` to attach an issue/PR.
UX + stability:
* Global `--json-fields foo,bar` projection on top of any `--json`
output, gh-style. Dotted-path support (`--json-fields owner.login`).
* 429 / Retry-After honored in the retry loop with a 30 s cap.
* Clap `suggestions` feature for typo'd subcommands.
* `fj auth token` and `auth status --show-token` refuse to write to a
TTY by default (`--force` to override).
CI:
* `.forgejo/workflows/ci.yml` runs fmt/clippy/test/release-build on
every push and PR, mirroring the local pre-push hook.
Docs:
* `SECURITY.md` with threat model and known sharp edges.
* `docs/gh-to-fj.md` full command-by-command mapping.
* `docs/faq.md` covering tokens, hosts, debug, scripting, plugins.
Tests: 60 → 75 passing (2 ignored: editor and env-mutating tests that
fight the cargo test harness on macOS).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.4 KiB
4.4 KiB
Changelog
All notable changes will be recorded here. The format follows Keep a Changelog. Versions follow Semantic Versioning.
[Unreleased]
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.