| Age | Commit message (Collapse) | Author |
|
- parse nostr: URI mentions in issue bodies, comment bodies, PR
descriptions, patch commit messages and cover letters
- npub/nprofile mentions produce p tags; note/nevent/naddr mentions
produce q tags per NIP-22
- naddr q tag value uses raw <kind>:<pubkey-hex>:<identifier> format
- nevent pubkey field populated from embedded author or local cache lookup
- dedup_tags() removes duplicate p tags and suppresses q tags whose
event-id is already covered by an existing e threading tag
- all parsing errors are non-fatal: invalid nostr: tokens are skipped
|
|
Download kind-1111 NIP-22 comments from relays and show a comment count
in the detail view of `ngit list <id>` and `ngit issue list <id>`.
- git_events: add KIND_COMMENT constant (kind 1111)
- client: import KIND_COMMENT; add `comments` field to FetchReport;
route kind-1111 events into report.comments in process_fetched_events;
consolidate comments across relay reports; display "N comment(s)" in
FetchReport; add a #E-tagged kind-1111 filter in get_fetch_filters
covering all known issue and proposal root IDs
- issue_list: add get_comment_counts() to query the local cache for
kind-1111 events by #E tag and count per issue; extend the filtered
tuple with comment_count; show a CMTS column in the table, a
"Comments: N" line in the detail view, and a "comments" field in JSON
- list: add KIND_COMMENT import; add resolve_event_id() helper and
get_comment_count_for_proposal() to look up the count for a single
proposal from the local cache; pass comment_count into
show_proposal_details(); display "Comments: N" in plain text and
"comments" in JSON; align detail-view labels
|
|
Non-interactive listing of NIP-34 issues (kind 1621) with status
resolution, hashtag display, and detail view.
- get_issues_from_cache: fetch GitIssue events from local cache by repo
coordinate, mirroring get_proposals_and_revisions_from_cache
- ngit issue list: table output of ID, status, title and hashtags at end
of each row; status resolved via existing get_status() logic
- --status: comma-separated filter (open,draft,closed,applied; default: open)
- --hashtag: comma-separated label filter (case-insensitive, OR match)
- --json: machine-readable output including hashtags and description
- --offline: skip network fetch, use local cache only
- <id>: optional positional argument (hex event-id or nevent) to show
full details of a specific issue including body content
|
|
Download kind-1621 issues from relays into the local cache alongside
patches and PRs. Issue IDs are tracked separately from proposal IDs
throughout the fetch pipeline so they never appear in proposal lists.
- get_fetch_filters: include Kind::GitIssue in the #a-tag filter and
add a dedicated issue_ids parameter to fetch status events (1630-1633)
tagged with known issue IDs
- FetchRequest: add issue_ids field populated from the local cache
- fetch_all_from_relay: track fresh_issue_roots independently of
fresh_proposal_roots; loop continues until both are drained
- process_fetched_events: route GitIssue events into fresh_issue_roots
and report.issues; route status events to issue_statuses or statuses
based on whether the root ID is a known issue or proposal
- FetchReport: add issues and issue_statuses fields, consolidated across
relays, and displayed as "N issue(s), M issue status(es)" in the report
|
|
Regression introduced in 28ad5440: ngit sync crashed with
'invalid refspec refs/remotes/origin/v1.4.4^{}:refs/tags/v1.4.4^{}'
on repos with annotated tags. 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.
|
|
kind-5 deletion events that only #e-tag a PR Kind event (kind 1618)
were never fetched because proposal_ids was built from Kind::GitPatch
events only. The deleted PR event remained in the local cache and
continued to appear as a remote ref (refs/heads/pr/<branch>).
|
|
RepoState::try_from was explicitly discarding all refs/tags/*^{} entries
("peeled" refs) when parsing the nostr state event. This meant the list
command only advertised the tag object OID, but git requires two lines for
annotated tags:
<tag-object-oid> refs/tags/v1.0.0
<commit-oid> refs/tags/v1.0.0^{}
Without the ^{} peeled line git cannot resolve the tag to a commit, so
git fetch --prune treats it as unresolvable and deletes it.
The nostr state event already stores both entries correctly (written by
generate_updated_state in push.rs). The fix simply stops try_from from
discarding the ^{} entries on read, so they flow through to the list
output unchanged.
|
|
Replace nsec.app with bucket.coracle.social and nos.lol.
|
|
Sync the defaults vector to the user's actual selections after each
prompt in multi_select_with_custom_value, so deselected items are not
shown as checked on the next loop iteration.
|
|
Previously NostrConnect was only instantiated after the user selected
'waiting for signer app to connect...', so any connection made while
the prompt was visible was missed. Now listening starts immediately
after the QR/URL is displayed, with a spinner that auto-resolves on
connection rather than requiring a manual prompt dismissal.
|
|
reduces noise in normal usage; messages still appear with -v flag
|
|
allows non-interactive bunker:// URL login without requiring --nsec,
by connecting to the remote signer and saving credentials to git config
|
|
display signer relays below QR code and nostrconnect URL with an option
to change them via the existing multiselect UI before connecting
|
|
Add a deletions counter to FetchReport, incremented in
process_fetched_events for each kind-5 event received and accumulated
across relays in consolidate_fetch_reports. The count is included in
the fetch summary display (e.g. "1 deletion", "2 deletions").
|
|
Add a non_proposal_event_ids parameter to get_fetch_filters and a
corresponding field on FetchRequest. On each fetch, the event IDs of
cached repo announcements and the state event are collected and used to
build a dedicated kind-5 filter keyed on #e tags, as specified by
NIP-09. The existing #a-tagged filter already covers addressable-event
deletions; this new filter catches deletions from clients that follow
NIP-09 strictly and do not embed a repo coordinate in their deletion
event.
|
|
The use_concise flag in send_events was computed with || instead of &&,
causing !is_test to short-circuit to true in production and making
--verbose have no effect on published event display.
|
|
FetchReport now captures the full state event seen on each relay during
the nostr fetch (state_per_relay: HashMap<RelayUrl, Option<Event>>).
ngit sync uses this to identify grasp server relays with a missing or
outdated state event and publishes the current state event to them
before attempting git pushes, preventing rejections. An existing login
is loaded silently (no prompt, no profile fetch) to provide a signer
for NIP-42 auth if requested.
|
|
When all git servers reject or skip a push, delete the newly-published
state event from the local nostr cache and restore the previous state
event (if any), so that a subsequent retry starts from a clean baseline
rather than a state that no server ever accepted.
|
|
Change send_events() return type from Result<()> to
Result<Vec<(String, bool)>> so callers can inspect which relays
accepted events. Update the finish message to show
"Published to X/N relays (failed: ...)" instead of the unconditional
"Published ... to nostr relays".
|
|
Any -o option passed to `git push` that is not handled by ngit
(title, description) is forwarded verbatim to the git server via
git2::PushOptions::remote_push_options. This allows options such as
`-o secret-scanning.skip` to pass through transparently.
`ngit send` gains a matching -o / --push-option flag for the same
purpose.
|
|
The Nix environment provides libgit2 1.9.2 via nixpkgs, which
libgit2-sys picks up at build time instead of using its bundled version.
This caused test assertions that hardcode the libgit2 version string
(appended by libgit2 to patch output) to fail after commit 319bb7f
added new Cargo dependencies, though the exact mechanism by which those
dependencies triggered the switch from the bundled 1.9.1 to the system
1.9.2 remains unclear.
Also bump git2 from 0.20.2 to 0.20.4 in both Cargo.toml files so the
bundled libgit2-sys version (0.18.3+1.9.2) properly aligns with the
1.9.2 version in use.
|
|
Implement a custom WebSocketTransport that races IPv6 and IPv4 connections
with a 250ms head start for IPv6, matching browser behavior. This prevents
broken IPv6 from blocking all relay connections indefinitely.
This is a temporary fix until the upstream async-wsocket PR is merged:
https://github.com/shadowylab/async-wsocket/pull/42
|
|
- suppress fetch summary (no updates / updates: X)
- write blank line to stderr after relay errors for clear separation
- show identifier below title only when it differs from name
- show earliest unique commit (root_commit) in metadata
- restructure infrastructure into grasp servers / additional git
servers / additional relays sections
- display grasp servers by domain only (strip scheme, npub, repo path)
- strip wss:// prefix from relay display
- show maintainer names from metadata cache; fall back to short npub
- append (you) next to the current user's name wherever it appears
- show [name] attribution and the maintainer model note only when
there is more than one maintainer
|
|
nos.lol always prompts for nip42 auth even for reading, making it
unsuitable as a default relay.
|
|
when a co-maintainer has no grasp servers of their own, fall back to
the trusted maintainer's grasp servers rather than jumping straight to
system defaults. if the trusted maintainer only uses a single grasp
server, the first system default is appended for redundancy. system
defaults are only used when neither the user nor the trusted maintainer
has any grasp servers configured.
|
|
With no default relays seeded, the multi-select add option was
incorrectly pre-selected when the list was empty. Now add/add-another
is always unselected by default so enter skips straight through.
|
|
ngit init and accept_maintainership_with_defaults no longer seed relay
lists from the client default set. The relay list in a Kind:30617
announcement now contains only grasp-server-derived relay URLs; no
additional public relays are suggested or added automatically.
|
|
move apply_grasp_infrastructure, latest_event_repo_ref to lib/repo_ref.rs
and wait_for_grasp_servers + grasp_servers_from_user_or_fallback to a
new lib/accept_maintainership.rs so both binaries can share them.
add accept_maintainership_with_defaults which publishes the co-maintainer's
own Kind:30617 announcement with defaults (user grasp servers, shared
metadata from existing events) then waits for grasp server provisioning
and updates nostr.repo config and origin remote.
replace the push error block with a call to accept_maintainership_with_defaults
so pushing now silently accepts co-maintainership instead of failing.
|
|
Remove the patch_supports_commit_ids gates in checkout.rs and list.rs
that pre-dated the mbox fallback logic. apply_patch_chain already
handles all fallback cases. Also replace the main-branch TODO fallback
in make_commits_for_proposal with get_parent_commit_from_patch, which
uses timestamp-based best-guess when the parent-commit tag is absent.
|
|
When applying a chain of patches without parent-commit tags, each
patch's parent was resolved independently, meaning patch2 would not
parent off the OID patch1 actually produced. Thread next_parent_override
through the loop and guard the early-return in create_commit_from_patch
so the override is always honoured.
|
|
- Replace .unwrap() calls in filter closure with pattern-let guards
so a missing/invalid mbox commit id conservatively includes the patch
- Use the OID returned by create_commit_from_patch as branch tip instead
of the tag commit id, which may differ for GPG-signed commits
- Add module-level doc comment to mbox_parser explaining design rationale
and known limitations around the mbox envelope SHA1
|
|
- Use mailparse crate to handle RFC 2047 encoded-words (Q/B encoding)
and RFC 2822 header folding in Subject and From headers
- Fix email signature separator check: use exact match 'line == "-- "'
instead of starts_with to avoid false positives on body lines
- Remove dead/incorrect asctime parsing in committer date extraction;
simplify to always return None (falls back to author_timestamp)
|
|
- Add mbox_parser module to extract metadata from patch content
- Extract author/committer from From: and Date: headers when tags missing
- Extract commit message body as fallback for description tag
- Implement best-guess parent commit logic using committer timestamps
- Update patch_supports_commit_ids to accept mbox-parseable patches
- Enable patches without optional tags to appear as pr/ branches
|
|
instead of generic 'Publishing to nostr relays...' messages, describe
what is being published e.g. 'Publishing 3 patches to nostr relays...'
or 'Publishing 1 announcement and 1 state event to nostr relays...'
|
|
Allow users to specify custom signer relays for nostrconnect login.
Relay URLs are auto-prefixed with wss:// if no scheme is provided.
|
|
Add wss://relay.ditto.pub as a second default signer relay alongside
wss://relay.nsec.app for improved reliability during nostrconnect login.
|
|
that expect whitespace then something
|
|
this took a lot of investigation to work out why this was failing
|
|
hide details in non-verbose mode
|
|
always report publishing and finish with published
|
|
to be consistent with the summary version
|
|
'maintainers' is missleading as the announcement authors may not be in
the maitnainer set
|
|
Apply the same hidden-to-visible MultiProgress pattern used for fetch
to send_events. In concise mode (non-verbose, non-test, non-silent),
a spinner is shown immediately and the detail progress bars are
revealed after a delay, using the deferred bar finish mechanism.
|
|
as its not fetching from git servers just yet
|
|
The heading bar was being inserted into the MultiProgress after the
draw target switch, but by then all relay bars were already finished
so indicatif did not re-render the layout. Pre-add the heading bar
at creation time (position 0, before relay bars) and only call
finish_with_message on it after the draw target switches to stderr.
|
|
The 'fetching updates...' heading was finished with finish_with_message
while the draw target was still hidden, so indicatif never rendered it.
Move the draw target switch before the heading insertion so the heading
renders immediately when added.
|
|
indicatif does not re-render bars that called finish_with_message while
the draw target was hidden. Instead of trying to force a redraw, defer
the finish_with_message call until after the draw target switches to
stderr. A BarRevealState coordinates between relay tasks and the timer:
bars that complete before the 5s reveal store their finish state in a
mutex-protected list, which the timer flushes after switching the draw
target. Bars completing after reveal finish immediately as before.
|
|
tick() is a no-op when enable_steady_tick() is active. Use
force_draw() on a bar to trigger a full MultiState redraw
including bars that finished while the draw target was hidden.
|
|
Use a ProgressBar inside the detail multi for the heading instead
of eprintln so it gets cleared with progress_reporter.clear()
and never appears when fetch completes before the delay.
|
|
Replace the broken SpinnerState approach (which checked should_expand at
task spawn time when all tasks spawn simultaneously) with a two-MultiProgress
pattern: a visible spinner shown immediately, and a hidden detail multi that
every relay task always adds bars to. A background timer reveals the detail
bars after 5s, printing a heading before switching the draw target.
|
|
Shows a progress spinner when fetching from git remotes in non-verbose mode.
Suppresses git fetch output and listing messages when not in verbose mode.
Uses NGITTEST environment variable for test timeouts.
|
|
Progress reporters were not being cleared after successful operations,
leaving progress bars visible in the terminal output. Now they are
properly cleared when all operations complete without errors.
|
|
When a PR branch already exists locally, the previous code would silently
move the branch pointer without checking for tracking or fast-forward safety.
Now:
- If branch has tracking: checkout and warn user to git pull
- If no tracking and fast-forward: safely move pointer
- If no tracking and diverged: show copy-paste commands for reset/rebase
- If commit not found locally: suggest fetching
Uses console crate for yellow output instead of hardcoded ANSI codes.
|
|
- Add --relay flag to 'ngit account create' allowing users to specify
relay URLs (repeatable). Defaults to relay-default-set when not provided.
- Remove fallback relays from fetch when repo context exists (repo
coordinate provided). Only use them for bootstrapping (profile discovery
with no repo context).
- Remove fallback relays from publish when repo or user relays exist.
Only use them when neither is available (e.g. new account signup).
- Update --customize help text to reflect new relay-default-set behavior.
|
|
The more_fallback_relays field is never consumed anywhere in the codebase.
Removing it from the Client struct, Params struct, trait definition, and all
related initialization code.
|
|
The relay.nostr.band relay is now offline and should be removed
from the default relay set.
|
|
Update login flow to support non-interactive mode with --nsec flag.
Refactor login logic to handle both interactive and non-interactive cases.
Add better error handling and validation.
|
|
Add CliError type for styled error output and cli_error() helper function.
Update Interactor to support non-interactive mode with default values.
Add prompt methods that respect non-interactive mode and provide better
error messages when required values are missing.
|
|
use more idomatic function
|
|
add additional test to cover this scenario
|
|
it was only checking local cache, where profile events are stored
only stored in global
|
|
because thats not needed
|
|
so that relay/git servers appear dim when fetch action is complete
|
|
copy relay fetching approach to async and reporting
|
|
so it doesnt use the git_repo
|
|
so it shows a summary rather than a lot of lines of issues
|
|
also reduce the clutter in the cli output for grasp servers.
|
|
some test failed and some test jus took too long
|
|
also auto-retry connection after 2s with x1.5 increment until timeout
|
|
otherwise we prompt the user to manually add it to global git config
but they don't know the value. we did it like this to not expose the nsec
but i in this case we should.
|
|
so we dont return a value to the git during remote helper operations
|
|
the user pubkey was being used in bunker-url rather than the bunker pubkey.
fixes
nostr:nevent1qvzqqqqx25pzpv3tq6c9rl2jx2tx4y6y5c6dj4krmse60a0vmjkea5gam3qjpfljqqsx5ztpy48muheny4p49hh634l5zs3jqw9x5980dm9xsjsk98jrk8ch2sdsw
|
|
also fix the report so that we show nip10 style statuses too
|
|
to ensure we dont try and fallback to ssh
|
|
update patches ahead of wider upgrade. clippy required some autofixes
|
|
replaces the "user" in the nostr_url format with
"ssh_key_file", to support the original intent, which was to allow
users to specify different authentication credentials.
most git servers always expect the ssh user to be 'git'.
the idiumatic way of specifying logging in as a different user is to
specify a different ssh key.
the idiomatic way of storing non-default ssh keys is in the location
`~/.ssh/key_name`. "ssh_key_file" can be specified as `key_name`,
for keys in the default location, or as a relative or absolute custom
location eg. `/other_keys/.ssh/nym1` or `../.ssh/nym1`.
BREAKING CHANGE: in nostr git url nym1@ssh/npub123/identifer, nym1 is
now treated as ssh key file location rather than a ssh user. it can
be specified as a file within `~/.ssh` eg `~/.ssh/nym1` or a full or
relative path.
|
|
following its inclusion in the NIP-34 spec
|
|
move the PR push code in 'ngit send' into lib.
reuse the non-interactive fallbacks in git-remote-nostr
|
|
the patch I sent to rust-nostr library got merged
|
|
allow users to use just a nip05 domain in nostr:// urls rather than
requiring _@ prefix.
|
|
abstracted git remote helper fetch functions
added support to `ngit list` to fetch PR data and checkout as proposal
branch
|
|
at some point we introduced a bug were we were taking the state and
git servers from non authorised maintainers.
|
|
|
|
having implemented 3b5c48f5a2a4b9be5d14baa8f5e801fefd5c1166,
a ref pushed to refs/nostr/<event-id> on a github repo was accepted
but was not confirmed
|
|
to keep the user informed of whats happening / happend
|
|
don't treat this as accepted
|
|
attempt to use a range of protocols instead of unath http
|
|
so we can use it elsehwere
|
|
to make it's purpose clearer
|
|
previously server might respond with errors updating refs but we
were not treating this as a failure to push those refs.
|
|
if use is maintainer, push PR to all repo git servers.
if user has a fork, push to all git servers it lists, and repo
grasp servers.
if user hasn't got a fork but has a user grasp list and pushing
push to repo grasp servers fails, create a personal-fork
automatically at each user grasp server and push there.
fallback to prompting user for either grasp servers or git server
with write permission.
if user provides grasp servers, suggesting adding to user preference
list.
|
|
allow specifying ref for pushing PR to custom clone url
|
|
if the repo doesnt list any grasp servers, or pushing to them fails
|
|
send as a PR if the commit would make patches that are too big for
nostr events.
send as a PR update if the proposal is PR.
send as a PR, revising a patch root, if patches would be too big.
in tests `get_pretend_proposal_root_event` has to be a actual proposal
with a tip, rather than just a cover letter, so we have replaced it.
|
|
for future use in `ngit send`
|
|
instead of `match_events` after receiving events
|
|
NIP-34 specifies patch revisions should have a `t` tag of
`root-revision` whereas we have been using `revision-root`.
this fixes it and and handles events created with the incorrect tag.
|
|
where just the nevent will do
|
|
so we can use it in ngit as well as remote helper
|
|
required for rust-nostr v0.43 update
|