From 6b8888638b2e19498e91353f01206f1255a6477e Mon Sep 17 00:00:00 2001 From: Silberengel Date: Fri, 20 Feb 2026 22:54:41 +0100 Subject: [PATCH] Sync from gitrepublic-web monorepo - 2026-02-20 22:54:41 --- gitrepublic-cli-1.0.0.tgz | Bin 0 -> 38264 bytes package.json | 12 +----- scripts/commands/publish/index.js | 4 +- scripts/config.js | 42 ++++++++++++++------ scripts/git-commit-msg-hook.js | 48 ++++++++++++++++++----- scripts/relay/profile-fetcher.js | 63 ++++++++++++++++++++++++++++++ scripts/relay/relay-fetcher.js | 4 +- 7 files changed, 137 insertions(+), 36 deletions(-) create mode 100644 gitrepublic-cli-1.0.0.tgz create mode 100644 scripts/relay/profile-fetcher.js diff --git a/gitrepublic-cli-1.0.0.tgz b/gitrepublic-cli-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0b779eefbbcf9ea82d853990ad053bf0c77fc99e GIT binary patch literal 38264 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 M4V!Z literal 0 HcmV?d00001 diff --git a/package.json b/package.json index c4d8f14..cda9fcd 100644 --- a/package.json +++ b/package.json @@ -40,18 +40,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://git.imwald.eu/silberengel/gitrepublic-cli.git" + "url": "https://github.com/silberengel/gitrepublic-cli.git" }, - "repositories": [ - { - "type": "git", - "url": "https://github.com/silberengel/gitrepublic-cli.git" - }, - { - "type": "git", - "url": "https://git.imwald.eu/silberengel/gitrepublic-cli.git" - } - ], "dependencies": { "nostr-tools": "^2.22.1" }, diff --git a/scripts/commands/publish/index.js b/scripts/commands/publish/index.js index cf8dd10..e61724c 100644 --- a/scripts/commands/publish/index.js +++ b/scripts/commands/publish/index.js @@ -1,6 +1,6 @@ import { getPrivateKeyFromEnv, getPrivateKeyBytes } from '../../utils/keys.js'; import { getPublicKey } from 'nostr-tools'; -import { DEFAULT_RELAYS } from '../../config.js'; +import { DEFAULT_NOSTR_RELAYS } from '../../config.js'; import { publishToRelays } from '../../relay/publisher.js'; import { enhanceRelayList } from '../../relay/relay-fetcher.js'; import { storeEventInJsonl } from '../../utils/event-storage.js'; @@ -35,7 +35,7 @@ export async function publish(args, server, json) { // Get relays from environment or use defaults const relaysEnv = process.env.NOSTR_RELAYS; - const baseRelays = relaysEnv ? relaysEnv.split(',').map(r => r.trim()).filter(r => r.length > 0) : DEFAULT_RELAYS; + const baseRelays = relaysEnv ? relaysEnv.split(',').map(r => r.trim()).filter(r => r.length > 0) : DEFAULT_NOSTR_RELAYS; // Enhance relay list with user's relay preferences (outboxes, local relays, blocked relays) const relays = await enhanceRelayList(baseRelays, pubkey, baseRelays); diff --git a/scripts/config.js b/scripts/config.js index bdce3d4..fdcadc9 100755 --- a/scripts/config.js +++ b/scripts/config.js @@ -8,15 +8,33 @@ export const KIND_NIP98_AUTH = 27235; // Default server URL export const DEFAULT_SERVER = process.env.GITREPUBLIC_SERVER || 'http://localhost:5173'; -// Default relays -export const DEFAULT_RELAYS = [ - 'wss://nostr.land', - 'wss://relay.damus.io', - 'wss://thecitadel.nostr1.com', - 'wss://nostr21.com', - 'wss://theforest.nostr1.com', - 'wss://freelay.sovbit.host', - 'wss://nostr.sovbit.host', - 'wss://bevos.nostr1.com', - 'wss://relay.primal.net', -]; +/** + * Default Nostr relays to use for operations (publishing, fetching) + * Can be overridden by NOSTR_RELAYS env var (comma-separated list) + * + */ +export const DEFAULT_NOSTR_RELAYS = + typeof process !== 'undefined' && process.env?.NOSTR_RELAYS + ? process.env.NOSTR_RELAYS.split(',').map(r => r.trim()).filter(r => r.length > 0) + : [ + 'wss://theforest.nostr1.com', + 'wss://nostr.land', + ]; + +/** + * Nostr relays to use for searching for repositories, profiles, or other events + * Can be overridden by NOSTR_SEARCH_RELAYS env var (comma-separated list) + * + */ +export const DEFAULT_NOSTR_SEARCH_RELAYS = + typeof process !== 'undefined' && process.env?.NOSTR_SEARCH_RELAYS + ? process.env.NOSTR_SEARCH_RELAYS.split(',').map(r => r.trim()).filter(r => r.length > 0) + : [ + 'wss://theforest.nostr1.com', + 'wss://nostr.land', + 'wss://relay.damus.io', + 'wss://thecitadel.nostr1.com', + 'wss://nostr21.com', + 'wss://relay.primal.net', + + ]; \ No newline at end of file diff --git a/scripts/git-commit-msg-hook.js b/scripts/git-commit-msg-hook.js index 830ac33..97bd2e7 100755 --- a/scripts/git-commit-msg-hook.js +++ b/scripts/git-commit-msg-hook.js @@ -245,19 +245,49 @@ async function signCommitMessage(commitMessageFile) { const keyBytes = decodeNostrKey(secretKey); const pubkey = getPublicKey(keyBytes); - // Get author info from git config, fallback to shortened npub + // Get author info from git config, then try to fetch from kind 0 event, fallback to shortened npub let authorName = getGitConfig('user.name'); let authorEmail = getGitConfig('user.email'); + // If not set in git config, try to fetch from kind 0 event if (!authorName || !authorEmail) { - const shortenedNpub = getShortenedNpub(pubkey); - - if (!authorName) { - authorName = shortenedNpub; - } - - if (!authorEmail) { - authorEmail = `${shortenedNpub}@gitrepublic.web`; + try { + const { fetchProfileFromRelays } = await import('./relay/profile-fetcher.js'); + const profile = await fetchProfileFromRelays(pubkey); + + if (!authorName) { + // Try display_name -> name -> shortened npub (20 chars) + if (profile?.displayName) { + authorName = profile.displayName; + } else if (profile?.name) { + authorName = profile.name; + } else { + const npub = nip19.npubEncode(pubkey); + authorName = npub.substring(0, 20); + } + } + + if (!authorEmail) { + // Try NIP-05 -> shortenednpub@gitrepublic.web + if (profile?.nip05) { + authorEmail = profile.nip05; + } else { + const npub = nip19.npubEncode(pubkey); + authorEmail = `${npub.substring(0, 20)}@gitrepublic.web`; + } + } + } catch (profileError) { + // Fallback to shortened npub if profile fetch fails + console.warn(' ⚠️ Failed to fetch profile from relays, using fallback:', profileError instanceof Error ? profileError.message : 'Unknown error'); + const shortenedNpub = getShortenedNpub(pubkey); + + if (!authorName) { + authorName = shortenedNpub; + } + + if (!authorEmail) { + authorEmail = `${shortenedNpub}@gitrepublic.web`; + } } } diff --git a/scripts/relay/profile-fetcher.js b/scripts/relay/profile-fetcher.js new file mode 100644 index 0000000..4f45ed9 --- /dev/null +++ b/scripts/relay/profile-fetcher.js @@ -0,0 +1,63 @@ +/** + * Fetch user profile (kind 0) from Nostr relays + */ + +import { SimplePool } from 'nostr-tools'; +import { DEFAULT_NOSTR_RELAYS } from '../config.js'; + +/** + * Fetch kind 0 profile event from relays + */ +export async function fetchProfileFromRelays(pubkey, relays = null) { + try { + const pool = new SimplePool(); + const relayList = relays || DEFAULT_NOSTR_RELAYS; + + // Ensure pubkey is in hex format (getPublicKey returns hex string) + const pubkeyHex = typeof pubkey === 'string' && pubkey.length === 64 + ? pubkey.toLowerCase() + : pubkey; + + const events = await pool.querySync(relayList, [ + { + kinds: [0], // Kind 0 = profile metadata + authors: [pubkeyHex], + limit: 1 + } + ]); + + pool.close(relayList); + + if (events.length === 0) { + return null; + } + + const event = events[0]; + const profile = {}; + + // Try to parse JSON content + try { + const content = JSON.parse(event.content); + profile.displayName = content.display_name || content.displayName; + profile.name = content.name; + profile.nip05 = content.nip05; + } catch { + // Invalid JSON, try tags + } + + // Check tags for nip05 (newer format) + if (!profile.nip05) { + const nip05Tag = event.tags.find((tag) => + (tag[0] === 'nip05' || tag[0] === 'l') && tag[1] + ); + if (nip05Tag && nip05Tag[1]) { + profile.nip05 = nip05Tag[1]; + } + } + + return profile; + } catch (error) { + console.warn('Failed to fetch profile from relays:', error); + return null; + } +} diff --git a/scripts/relay/relay-fetcher.js b/scripts/relay/relay-fetcher.js index 16bfef9..9bc2259 100644 --- a/scripts/relay/relay-fetcher.js +++ b/scripts/relay/relay-fetcher.js @@ -1,5 +1,5 @@ import { SimplePool } from 'nostr-tools'; -import { DEFAULT_RELAYS } from '../config.js'; +import { DEFAULT_NOSTR_RELAYS } from '../config.js'; /** * Normalize a relay URL (similar to nostr-tools normalizeURL but simpler) @@ -75,7 +75,7 @@ function extractRelayUrls(event) { */ export async function fetchRelayLists(pubkey, queryRelays = null) { const pool = new SimplePool(); - const relays = queryRelays || DEFAULT_RELAYS; + const relays = queryRelays || DEFAULT_NOSTR_RELAYS; const outboxes = []; const localRelays = [];