Skip to content

Releases: DanConwayDev/ngit-cli

v2.5.0

26 May 19:03
v2.5.0
d88bce1

Choose a tag to compare

Changed

  • git push pr/<branch> and ngit send now 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-server or git push -o git-server=<url> lets contributors target a custom git URL or GRASP server explicitly
  • ngit init republishes 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 --clean will remove them
  • ngit pr apply, ngit pr checkout, and ngit pr list now 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, and checkout fetched unconditionally even when the commit was already local — thanks to m0wer for the contribution
  • ngit pr checkout (and the interactive path in ngit 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 in ngit pr apply; this fallback is disabled for passive git clone/git fetch paths 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 stale merge-base tag; the remote helper was forwarding the original stored tag instead of recomputing from the actual git topology; the merge-base is now always recomputed from git merge-base for every push type
  • ngit pr checkout correctly checked out the PR as a local branch but left the working directory at its previous state
  • ngit pr checkout --force on 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 applying
  • ngit 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

16 May 11:31
v2.4.4
05b0edb

Choose a tag to compare

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-server to sign and publish an updated state event reflecting the server's commits; in non-interactive mode the update is auto-accepted
  • nostr.trust-server-domains git config setting: semicolon-separated list of git-server hostnames that ngit sync automatically 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, so get_commit_id_from_patch now 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 incorrect merge-base tag; the previous tip of the PR was used as the merge-base instead of the original branch divergence point; the fix reads the merge-base tag 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_patch instead of crashing the git-remote-nostr process with signal 11 (SIGSEGV); libgit2's apply_to_tree dereferences 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 send and the pr/ branch push path in git-remote-nostr now 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 --description requires $'...\n\n...' ANSI-C quoting since the shell passes the argument verbatim and does not interpret \n in double-quoted strings

v2.4.3

01 May 20:32
v2.4.3
e8c3c49

Choose a tag to compare

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 in run_list are now filtered to maintainers of the current remote's repo announcement

v2.4.2

28 Apr 10:50
v2.4.2
59e467b

Choose a tag to compare

Fixed

  • when submitting a PR (via --force-pr or when the existing proposal is already a PR kind), repository GRASP servers were never tried when pushing proposal refs; a URL normalisation mismatch (repo_grasps holds 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

22 Apr 13:04
v2.4.1
875f4e0

Choose a tag to compare

Fixed

  • fatal errors during clone/fetch when an open PR's git data isn't available on the repository's specified git servers

v2.4.0

10 Apr 20:47
v2.4.0
205ca05

Choose a tag to compare

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/identifier URL 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

05 Mar 22:13
v2.3.0
45b0f8c

Choose a tag to compare

Added

  • Issue management: new ngit issue subcommand 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 view shows full PR details with all comments in chronological order; ngit pr comment posts 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 inline t tags (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 #subject label 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 in view output; designed to be pinned to the top of long threads
  • Repo-only relays: new nostr.repo-relay-only git config key; when true, nostr events are sent only to the repository's own relays, skipping personal write and default relays; enable with git config nostr.repo-relay-only true or ngit 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 checkout now requires --force when the local branch has diverged from the proposal branch
  • ngit issue list missing --comments flag added
  • NIP-22 comment compliance fixes; --reply-to flag added for threaded replies on issues and PRs
  • Login local config takes precedence correctly when posting comments

v2.2.3

27 Feb 17:29
v2.2.3
f91a0d0

Choose a tag to compare

Fixed

  • Regression introduced in 28ad544: ngit sync crashed with "invalid refspec refs/remotes/origin/v1.4.4^{}:refs/tags/v1.4.4^{}" on repos with annotated tags; RepoState::try_from now 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 and identify_remote_sync_issues in list.rs; also corrected the always-false logic bug in invalid_nostr_state_ref

v2.2.1

25 Feb 12:37
v2.2.1
3017faf

Choose a tag to compare

Fixed

  • IPv6 connection failures with Happy Eyeballs (RFC 8305)

v2.2.0

20 Feb 23:28
v2.2.0
3a17877

Choose a tag to compare

- **Non-interactive by default**: all commands now work without promp…