Releases: DanConwayDev/ngit-cli
Releases · DanConwayDev/ngit-cli
v2.5.0
Changed
git push pr/<branch>andngit sendnow default to PR kind for new proposals when the repository has at least one GRASP server; previously only oversized commits (>60 KB) or those containing submodules triggered PR kind automatically- When a PR cannot be pushed to the repository's GRASP servers, ngit uses GRASP-06 instead of creating a new personal-fork announcement;
ngit send --git-serverorgit push -o git-server=<url>lets contributors target a custom git URL or GRASP server explicitly ngit initrepublishes now preserve unknown tags from the existing announcement instead of silently stripping them, so tags added by a future ngit version or third-party tool are never lost on republish; a yellow warning lists the carried-over tag names and--cleanwill remove themngit pr apply,ngit pr checkout, andngit pr listnow consult git servers lazily — only when the needed commit is not already present locally — and share a single fetch helper; previously each command had its own near-duplicate fetch logic, andcheckoutfetched unconditionally even when the commit was already local — thanks to m0wer for the contributionngit pr checkout(and the interactive path inngit pr list) now tries the submitter-supplied clone URLs from the PR event as a fallback when the repo's declared git servers don't carry the PR tip, matching the existing behaviour inngit pr apply; this fallback is disabled for passivegit clone/git fetchpaths to prevent a malicious submitter slowing down every repo operation- Integration test harness completely rewritten for greater reliability and speed
Fixed
- Force-pushing a rebased
pr/<branch>produced a PR update event with a stalemerge-basetag; the remote helper was forwarding the original stored tag instead of recomputing from the actual git topology; the merge-base is now always recomputed fromgit merge-basefor every push type ngit pr checkoutcorrectly checked out the PR as a local branch but left the working directory at its previous statengit pr checkout --forceon a patch-kind proposal failed with "failed to find parent commit" when the new revision depended on a commit not yet in the local repo; the fetcher now retrieves the parent from the git servers before applyingngit send --in-reply-to <hex_event_id>for a non-root reference (e.g. an issue mention) emitted an["e", ...]tag instead of the NIP-21["q", ...]quote tag; hex and bech32 inputs now produce the same tag
v2.4.4
Added
ngit sync --trust-server(-t): when a git server is fast-forward ahead of nostr state, sync reports the affected refs and requires--trust-serverto sign and publish an updated state event reflecting the server's commits; in non-interactive mode the update is auto-acceptednostr.trust-server-domainsgit config setting: semicolon-separated list of git-server hostnames thatngit syncautomatically trusts when they are fast-forward ahead of nostr state, without requiring--trust-server; the new commits are also pushed to any other git servers; can be set globally (git config --global nostr.trust-server-domains 'github.com;codeberg.org') or per-repository- Diverged-branch detection in
ngit sync: branches where the git server and nostr state have each made commits the other lacks are always reported with a concrete recovery command (git fetch <url> <branch> && git push <nostr-remote> +<branch>) and cannot be resolved with--trust-server
Fixed
- fast-forward push to a
pr/branch backed by a PR event (kind 1618) or PR update event (kind 1619) failed with "event is not a patch"; these events store the tip commit in a"c"tag rather than a"commit"tag, soget_commit_id_from_patchnow checks the"c"tag for PR/PR-update events before falling back to the mbox content heuristic - fast-forward push to a
pr/branch that is based on an existing PR event produced a PR update event with an incorrectmerge-basetag; the previous tip of the PR was used as the merge-base instead of the original branch divergence point; the fix reads themerge-basetag from the root PR event and forwards it unchanged into the PR update event - patches containing submodule entries (mode 160000) now return an error from
create_commit_from_patchinstead of crashing thegit-remote-nostrprocess with signal 11 (SIGSEGV); libgit2'sapply_to_treedereferences a null pointer on such entries rather than reporting an error, so the submodule diff is detected before calling into libgit2 and the proposal is skipped gracefully;ngit sendand thepr/branch push path ingit-remote-nostrnow also detect submodule entries up-front and automatically use PR mode so the commits are pushed directly rather than sent as patch events
Documentation
- strengthen
pr/branch prefix requirement in ngit skill: add a mandatory key rule bullet and a CRITICAL callout in the PR workflow to prevent LLMs from omitting the prefix - document in ngit skill that omitting
-o title=/-o description=when pushing a single-commit PR is preferred — ngit uses the commit subject and body automatically - clarify newline handling in ngit skill:
git push -o 'description=...'requires literal\n\n(ngit's push-option parser converts them);ngit send --descriptionrequires$'...\n\n...'ANSI-C quoting since the shell passes the argument verbatim and does not interpret\nin double-quoted strings
v2.4.3
Fixed
- when a repo has multiple
nostr://remotes sharing the same identifier, relays could return state events authored by maintainers of the other remote; without filtering, the newest event won regardless of author, pointing refs at the wrong commits; state event candidates inrun_listare now filtered to maintainers of the current remote's repo announcement
v2.4.2
Fixed
- when submitting a PR (via
--force-pror when the existing proposal is already a PR kind), repository GRASP servers were never tried when pushing proposal refs; a URL normalisation mismatch (repo_graspsholds normalised hostnames but the comparison was made against full clone URLs) meant the candidate server list was always empty, so every submission fell through to the fork-creation / personal GRASP server fallback path instead of pushing directly to the repository's own GRASP servers
v2.4.1
Fixed
fatalerrors during clone/fetch when an open PR's git data isn't available on the repository's specified git servers
v2.4.0
Added
- git worktree support (a3b0bf6) - thanks to new contributor m0wer
Fixed
- more robust patch parsing and gracefully handle errors (7a36aed, e1dd109, 6a2245d)
- panic when cloning a bare
nostr://npub/identifierURL with no relay hints (f3a6ae8) - repository identifiers containing reserved characters (e.g. spaces, emoji) are now percent-encoded in
nostr://clone URLs and GRASP HTTP paths, per NIP-34 - gracefully handle errors identifying potential PR merges on push (3daf61e)
v2.3.0
Added
- Issue management: new
ngit issuesubcommand group (list,view,create,close,resolved,reopen,comment,label) for creating and viewing NIP-34 issues and posting NIP-22 comments - PR comments and viewing:
ngit pr viewshows full PR details with all comments in chronological order;ngit pr commentposts a NIP-22 comment - NIP-32 labels: apply hashtag labels to issues and PRs via
ngit issue label/ngit pr label; labels from kind-1985 events are merged with inlinettags (author and maintainer only) - Set subject:
ngit pr set-subject/ngit issue set-subject— update the displayed title of a PR or issue after the fact via a NIP-32 kind-1985#subjectlabel event (author or maintainer only) - Cover notes (kind 1624, experimental): attach a summary or context note to a PR or issue via
ngit pr set-cover-note/ngit issue set-cover-note; displayed in place of the description inviewoutput; designed to be pinned to the top of long threads - Repo-only relays: new
nostr.repo-relay-onlygit config key; whentrue, nostr events are sent only to the repository's own relays, skipping personal write and default relays; enable withgit config nostr.repo-relay-only trueorngit init --repo-relay-only ngit account whoami: show the currently logged-in account(s); improved detection of credentials set at the system git config level (/etc/gitconfig)- SKILL.md: AI agent skill file for working with ngit repositories
Fixed
ngit pr checkoutnow requires--forcewhen the local branch has diverged from the proposal branchngit issue listmissing--commentsflag added- NIP-22 comment compliance fixes;
--reply-toflag added for threaded replies on issues and PRs - Login local config takes precedence correctly when posting comments
v2.2.3
Fixed
- Regression introduced in 28ad544:
ngit synccrashed with "invalid refspec refs/remotes/origin/v1.4.4^{}:refs/tags/v1.4.4^{}" on repos with annotated tags;RepoState::try_fromnow retains^{}peeled-tag entries in state, but the sync refspec builder did not skip them; fixed by guarding all three iteration sites in sync.rs andidentify_remote_sync_issuesin list.rs; also corrected the always-false logic bug ininvalid_nostr_state_ref
v2.2.1
Fixed
- IPv6 connection failures with Happy Eyeballs (RFC 8305)
v2.2.0
- **Non-interactive by default**: all commands now work without promp…