@toon-protocol/git 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/chunk-4WFGAICZ.js +707 -0
- package/dist/chunk-4WFGAICZ.js.map +1 -0
- package/dist/chunk-KXXHAUXL.js +109 -0
- package/dist/chunk-KXXHAUXL.js.map +1 -0
- package/dist/chunk-LJA7PPZI.js +144 -0
- package/dist/chunk-LJA7PPZI.js.map +1 -0
- package/dist/chunk-M7O4SEVW.js +56 -0
- package/dist/chunk-M7O4SEVW.js.map +1 -0
- package/dist/chunk-R3JVS6SX.js +345 -0
- package/dist/chunk-R3JVS6SX.js.map +1 -0
- package/dist/chunk-SBMFWVCP.js +265 -0
- package/dist/chunk-SBMFWVCP.js.map +1 -0
- package/dist/cli/rig.d.ts +1 -0
- package/dist/cli/rig.js +1430 -0
- package/dist/cli/rig.js.map +1 -0
- package/dist/index.d.ts +742 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/publisher-VEIEQHl6.d.ts +254 -0
- package/dist/standalone/index.d.ts +272 -0
- package/dist/standalone/index.js +30 -0
- package/dist/standalone/index.js.map +1 -0
- package/dist/standalone-mode-UFMHGUOM.js +132 -0
- package/dist/standalone-mode-UFMHGUOM.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/rig.ts","../../src/cli/events.ts","../../src/cli/daemon.ts","../../src/cli/mode.ts","../../src/cli/errors.ts","../../src/cli/git-config.ts","../../src/cli/push.ts","../../src/cli/render.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `rig` — the Git-to-TOON CLI shipped by `@toon-protocol/git` (epic #222).\n *\n * Subcommands:\n * push estimate → confirm → execute (#229)\n * issue | comment | pr | status single NIP-34 event publishes (#231)\n */\n\nimport { createInterface } from 'node:readline/promises';\nimport {\n runComment,\n runIssue,\n runPr,\n runStatus,\n type EventCommandDeps,\n} from './events.js';\nimport { runPush, PUSH_USAGE, type CliIo } from './push.js';\n\nconst USAGE = `rig — push git repos to TOON (pay-to-write Nostr + Arweave)\n\nUsage: rig <command> [options]\n\nCommands:\n push [refspecs...] plan, price, confirm, and execute a paid push\n issue create file an issue (kind:1621) against a repo\n comment <root-event-id> comment (kind:1622) on an issue or patch\n pr create publish a patch (kind:1617) with real\n \\`git format-patch\\` content\n status <event-id> <state> set an issue/patch status (kind:1630-1633):\n open | applied | closed | draft\n\nRun \\`rig <command> --help\\` for the command's flags. All writes are paid,\npermanent, and non-refundable; each command quotes its fee and asks for\nconfirmation before spending (--yes skips, --json emits machine output).`;\n\n/** Real terminal I/O: stdout lines, stderr lines, readline y/N confirm. */\nfunction makeIo(): CliIo {\n return {\n out: (line) => process.stdout.write(`${line}\\n`),\n err: (line) => process.stderr.write(`${line}\\n`),\n isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n confirm: async (question) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n try {\n const answer = (await rl.question(question)).trim().toLowerCase();\n return answer === 'y' || answer === 'yes';\n } finally {\n rl.close();\n }\n },\n };\n}\n\nasync function main(): Promise<number> {\n const [command, ...rest] = process.argv.slice(2);\n const io = makeIo();\n const deps: EventCommandDeps = {\n io,\n env: process.env,\n cwd: process.cwd(),\n fetchImpl: fetch,\n };\n\n switch (command) {\n case 'push':\n return runPush(rest, deps);\n case 'issue':\n return runIssue(rest, deps);\n case 'comment':\n return runComment(rest, deps);\n case 'pr':\n return runPr(rest, deps);\n case 'status':\n return runStatus(rest, deps);\n case 'help':\n case '--help':\n case '-h':\n io.out(USAGE);\n io.out('');\n io.out(PUSH_USAGE);\n return 0;\n case undefined:\n io.err(USAGE);\n return 2;\n default:\n io.err(`unknown command: ${command}`);\n io.err(USAGE);\n return 2;\n }\n}\n\nmain().then(\n (code) => {\n process.exitCode = code;\n },\n (err: unknown) => {\n process.stderr.write(\n `rig: unexpected error: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\\n`\n );\n process.exitCode = 1;\n }\n);\n","/**\n * The single-event `rig` subcommands (#231): issue / comment / pr / status.\n *\n * One shared pipeline behind four thin arg-parsers, mirroring `rig push`\n * (./push.ts) exactly: repo addressing from the `toon.*` git config keys the\n * first push persisted (`--repo-id`/`--owner` override; actionable error\n * when unconfigured), publisher-mode selection via ./mode.ts, a fee-quoting\n * confirm gate (`--yes` skips; a non-TTY session without it refuses;\n * `--json` without `--yes` is a pure estimate), and the same two transports:\n *\n * daemon POST /git/issue|comment|patch|status (the daemon builds,\n * signs, and pays);\n * standalone build the NIP-34 event locally (../nip34-events.ts — the\n * same builders the daemon uses) and pay-to-publish through\n * the embedded, nonce-guarded StandalonePublisher. Standalone\n * publishes to a SINGLE relay; multiple configured relays are\n * refused before anything is paid (same guard as push).\n *\n * `rig pr create --range` runs REAL `git format-patch --stdout <range>` in\n * the local repository and publishes its output as the kind:1617 content —\n * one event for the whole series (cover-letter threading is out of scope in\n * v1; see the usage text).\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { parseArgs } from 'node:util';\nimport {\n REPOSITORY_ANNOUNCEMENT_KIND,\n STATUS_APPLIED_KIND,\n STATUS_CLOSED_KIND,\n STATUS_DRAFT_KIND,\n STATUS_OPEN_KIND,\n} from '@toon-protocol/core/nip34';\nimport {\n buildComment,\n buildIssue,\n buildPatch,\n buildStatus,\n type StatusKind,\n type UnsignedEvent,\n} from '../nip34-events.js';\nimport { GitRepoReader } from '../repo-reader.js';\nimport {\n serializeEventReceipt,\n type GitEventResponse,\n type GitRepoAddr,\n type GitStatusValue,\n} from '../routes.js';\nimport { DaemonGitClient } from './daemon.js';\nimport { describeError, UnconfiguredRepoAddressError } from './errors.js';\nimport { readToonConfig, resolveRepoRoot, type ToonRepoConfig } from './git-config.js';\nimport { selectMode, type PushMode } from './mode.js';\nimport { defaultLoadStandalone, type PushDeps } from './push.js';\nimport { feeLabel, renderEventPlan, renderEventReceipt } from './render.js';\nimport type { StandaloneContext } from './standalone-context.js';\n\n// ---------------------------------------------------------------------------\n// Deps\n// ---------------------------------------------------------------------------\n\n/** Push deps plus a stdin reader (issue-body fallback); tests inject both. */\nexport interface EventCommandDeps extends PushDeps {\n /** Read all of stdin as UTF-8 (default: the real process stdin). */\n readStdin?: () => Promise<string>;\n}\n\nconst defaultReadStdin = async (): Promise<string> => {\n // Never block waiting for keyboard input (e.g. stdout piped but stdin a\n // TTY): an interactive stdin yields no body, which surfaces as the clear\n // \"body is empty\" error instead of a hang.\n if (process.stdin.isTTY) return '';\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf-8');\n};\n\n// ---------------------------------------------------------------------------\n// Usage\n// ---------------------------------------------------------------------------\n\n/** Flags every single-event subcommand shares (mirrors `rig push`). */\nconst COMMON_FLAGS_USAGE = ` --repo-id <id> repository id / NIP-34 d-tag (default: git config toon.repoid)\n --owner <pubkey> repository owner pubkey, 64-char hex (default: git config\n toon.owner, then the active publisher identity)\n --relay <url> relay to publish to in standalone mode (default: git config\n toon.relay, then the mode's default; standalone supports\n exactly one relay — daemon mode publishes via its apex)\n --yes skip the fee confirmation (required when not a TTY)\n --json machine-readable receipt; without --yes it is a pure\n estimate (nothing published, exit 0)\n --daemon force daemon mode (toon-clientd control API)\n --standalone force standalone mode (embedded client from TOON_CLIENT_MNEMONIC)\n -h, --help show this help`;\n\nexport const ISSUE_USAGE = `Usage: rig issue create --title <title> [options]\n\nFile an issue (kind:1621) against a TOON repo — a paid publish; writes are\npermanent and non-refundable. The repo address (30617:<owner>:<repoId>) comes\nfrom the toon.* git config keys \\`rig push\\` persists.\n\nBody source (exactly one): --body, --body-file, or piped stdin.\n\nOptions:\n --title <title> issue title (subject tag) [required]\n --body <text> issue body (Markdown)\n --body-file <path> read the issue body from a file\n --label <label> label (t tag); repeatable\n${COMMON_FLAGS_USAGE}`;\n\nexport const COMMENT_USAGE = `Usage: rig comment <root-event-id> --body <text> [options]\n\nComment (kind:1622) on an issue or patch — a paid publish; writes are\npermanent and non-refundable. <root-event-id> is the 64-char hex id of the\nkind:1621 issue / kind:1617 patch being commented on.\n\nOptions:\n --body <text> comment body (Markdown) [required]\n --parent-author <pubkey> pubkey of the TARGET event's author (p threading\n tag; default: the repo owner)\n --marker <root|reply> e-tag marker (default: root — commenting directly\n on the issue/patch)\n${COMMON_FLAGS_USAGE}`;\n\nexport const PR_USAGE = `Usage: rig pr create --title <title> (--range <range> | --patch-file <path>) [options]\n\nPublish a patch (kind:1617) whose content is REAL \\`git format-patch\\` output —\na paid publish; writes are permanent and non-refundable. --range runs\n\\`git format-patch --stdout <range>\\` in the local repository and derives the\ncommit/parent-commit tags; --patch-file publishes a pre-generated patch\nverbatim. A multi-commit range publishes ONE kind:1617 event carrying the\nfull series text — cover-letter threading (one event per commit) is out of\nscope in v1.\n\nOptions:\n --title <title> patch/PR title (subject tag) [required]\n --range <range> revision range for format-patch: <rev>, <rev>..<rev>,\n or <rev>...<rev> (mutually exclusive with --patch-file)\n --patch-file <path> literal patch text to publish\n --branch <name> branch name (t tag)\n${COMMON_FLAGS_USAGE}`;\n\nexport const STATUS_USAGE = `Usage: rig status <target-event-id> <open|applied|closed|draft> [options]\n\nSet the status of an issue or patch — a paid publish; writes are permanent\nand non-refundable. Publishes kind:1630 (open), 1631 (applied), 1632\n(closed), or 1633 (draft) against the 64-char hex id of the target event,\nwith the repo a-tag attached so readers can scope a status stream to the\nrepository.\n\nOptions:\n${COMMON_FLAGS_USAGE}`;\n\n// ---------------------------------------------------------------------------\n// Shared flag parsing\n// ---------------------------------------------------------------------------\n\nconst HEX64_RE = /^[0-9a-f]{64}$/;\n\nfunction assertHex64(value: string, what: string): void {\n if (!HEX64_RE.test(value)) {\n throw new Error(\n `${what} must be a 64-char lowercase hex id (got ${JSON.stringify(value)})`\n );\n }\n}\n\n/** parseArgs options every subcommand accepts (mirrors `rig push`). */\nconst COMMON_OPTIONS = {\n yes: { type: 'boolean', default: false },\n json: { type: 'boolean', default: false },\n daemon: { type: 'boolean', default: false },\n standalone: { type: 'boolean', default: false },\n relay: { type: 'string', multiple: true },\n 'repo-id': { type: 'string' },\n owner: { type: 'string' },\n help: { type: 'boolean', short: 'h', default: false },\n} as const;\n\ninterface CommonFlags {\n yes: boolean;\n json: boolean;\n daemon: boolean;\n standalone: boolean;\n relay: string[];\n repoId?: string;\n owner?: string;\n help: boolean;\n}\n\nfunction pickCommon(values: Record<string, unknown>): CommonFlags {\n const flags: CommonFlags = {\n yes: values['yes'] === true,\n json: values['json'] === true,\n daemon: values['daemon'] === true,\n standalone: values['standalone'] === true,\n relay: Array.isArray(values['relay']) ? (values['relay'] as string[]) : [],\n help: values['help'] === true,\n };\n const repoId = values['repo-id'];\n if (typeof repoId === 'string') flags.repoId = repoId;\n const owner = values['owner'];\n if (typeof owner === 'string') {\n assertHex64(owner, '--owner');\n flags.owner = owner;\n }\n return flags;\n}\n\n// ---------------------------------------------------------------------------\n// Shared publish pipeline\n// ---------------------------------------------------------------------------\n\ntype EventCommand = 'issue' | 'comment' | 'pr' | 'status';\n\ninterface RunEventOptions {\n command: EventCommand;\n flags: CommonFlags;\n deps: EventCommandDeps;\n /** Human action label WITHOUT the kind, e.g. `issue \"Fix the flux\"`. */\n actionLabel: string;\n /**\n * Build the unsigned NIP-34 event for the resolved repo address — the\n * standalone publish payload, and the source of truth for the kind. May do\n * real work (pr runs format-patch here), so failures land in the normal\n * error path.\n */\n buildEvent: (addr: GitRepoAddr) => Promise<UnsignedEvent>;\n /** Drive the matching daemon `/git/*` route. */\n sendDaemon: (\n client: DaemonGitClient,\n addr: GitRepoAddr\n ) => Promise<GitEventResponse>;\n}\n\n/** JSON envelope emitted by `--json` runs (agents consume this). */\ninterface EventJsonOutput {\n command: EventCommand;\n mode: PushMode;\n repoAddr: GitRepoAddr;\n /** NIP-34 kind this command publishes. */\n kind: number;\n /** True when the paid publish ran. */\n executed: boolean;\n /** Per-event fee (base units, decimal string), when known pre-publish. */\n feeEstimate: string | null;\n result?: GitEventResponse;\n hint?: string;\n}\n\n/**\n * The estimate → confirm → execute flow shared by all four subcommands.\n * Money moves only after the confirm gate, and in standalone mode only after\n * the single-relay guard.\n */\nasync function runEvent(opts: RunEventOptions): Promise<number> {\n const { command, flags, deps, actionLabel } = opts;\n const { io, env, fetchImpl } = deps;\n\n let standaloneCtx: StandaloneContext | undefined;\n try {\n // ── Repo addressing (best-effort git config; flags can stand alone) ─────\n let toonConfig: ToonRepoConfig = { relays: [] };\n try {\n toonConfig = await readToonConfig(await resolveRepoRoot(deps.cwd));\n } catch {\n // Not inside a git repository — --repo-id/--owner must carry the address.\n }\n const repoId = flags.repoId ?? toonConfig.repoId;\n if (!repoId) throw new UnconfiguredRepoAddressError('repository id');\n\n /** Explicitly-known relays (flags → git config); undefined = mode default. */\n const explicitRelays =\n flags.relay.length > 0\n ? flags.relay\n : toonConfig.relays.length > 0\n ? toonConfig.relays\n : undefined;\n\n // ── Mode selection + per-event fee ──────────────────────────────────────\n const { mode, probe } = await selectMode({\n daemon: flags.daemon,\n standalone: flags.standalone,\n env,\n fetchImpl,\n });\n const daemonClient = new DaemonGitClient(probe.baseUrl, fetchImpl);\n\n let identity: string | undefined;\n let fee: string | undefined;\n let relaysUsed: string[] | undefined = explicitRelays;\n if (mode === 'daemon') {\n identity = probe.identity;\n fee = probe.feePerEvent;\n } else {\n standaloneCtx = await (deps.loadStandalone ?? defaultLoadStandalone)(env);\n identity = standaloneCtx.ownerPubkey;\n relaysUsed ??= standaloneCtx.defaultRelayUrls;\n // Same pre-pay guard as push (#243 review): StandalonePublisher\n // publishes to exactly one relay, and multiple can arrive without\n // explicit intent (daemon-persisted git config + a later daemon outage\n // auto-selecting standalone). Refuse before anything is paid.\n if (relaysUsed.length > 1) {\n io.err(\n `standalone mode publishes to a single relay, but ${relaysUsed.length} are ` +\n `configured (${relaysUsed.join(', ')}) — re-run with exactly one ` +\n '--relay <url> (or trim git config toon.relay). Nothing was published or paid.'\n );\n return 1;\n }\n fee = (await standaloneCtx.publisher.getFeeRates()).eventFee.toString();\n }\n\n const owner = flags.owner ?? toonConfig.owner ?? identity;\n if (!owner) throw new UnconfiguredRepoAddressError('repository owner');\n const addr: GitRepoAddr = { ownerPubkey: owner, repoId };\n\n // Built once: the standalone publish payload AND the kind for rendering.\n const event = await opts.buildEvent(addr);\n const action = `kind:${event.kind} ${actionLabel}`;\n\n // ── Confirm gate (identical semantics to `rig push`) ────────────────────\n if (!flags.json) {\n for (const line of renderEventPlan({\n action,\n addr,\n mode,\n ...(fee !== undefined ? { fee } : {}),\n })) {\n io.out(line);\n }\n }\n if (!flags.yes) {\n if (flags.json) {\n io.out(\n jsonOut({\n command,\n mode,\n repoAddr: addr,\n kind: event.kind,\n executed: false,\n feeEstimate: fee ?? null,\n hint: 'estimate only — re-run with --yes to publish (permanent, non-refundable)',\n })\n );\n return 0;\n }\n if (!io.isInteractive) {\n io.err(\n 'refusing to spend channel funds without confirmation in a non-interactive ' +\n 'session — re-run with --yes (or use --json for an estimate)'\n );\n return 1;\n }\n const proceed = await io.confirm(\n `Proceed with paid publish (${feeLabel(fee)})? [y/N] `\n );\n if (!proceed) {\n io.err('aborted — nothing was published.');\n return 1;\n }\n }\n\n // ── Execute ─────────────────────────────────────────────────────────────\n let result: GitEventResponse;\n if (mode === 'daemon') {\n result = await opts.sendDaemon(daemonClient, addr);\n } else {\n if (!standaloneCtx) throw new Error('internal: standalone context missing');\n const receipt = await standaloneCtx.publisher.publishEvent(\n event,\n relaysUsed ?? []\n );\n result = serializeEventReceipt(event.kind, receipt);\n }\n\n // ── Receipts ────────────────────────────────────────────────────────────\n if (flags.json) {\n io.out(\n jsonOut({\n command,\n mode,\n repoAddr: addr,\n kind: result.kind,\n executed: true,\n feeEstimate: fee ?? null,\n result,\n })\n );\n } else {\n for (const line of renderEventReceipt(action, result)) io.out(line);\n }\n return 0;\n } catch (err) {\n const described = describeError(err, command);\n if (flags.json) {\n io.out(JSON.stringify({ command, ...described.json }, null, 2));\n } else {\n for (const line of described.lines) io.err(line);\n }\n return 1;\n } finally {\n if (standaloneCtx) {\n try {\n await standaloneCtx.stop();\n } catch {\n // best-effort teardown\n }\n }\n }\n}\n\nfunction jsonOut(output: EventJsonOutput): string {\n return JSON.stringify(output, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// rig issue create\n// ---------------------------------------------------------------------------\n\n/** Run `rig issue …`; returns the process exit code. */\nexport async function runIssue(\n args: string[],\n deps: EventCommandDeps\n): Promise<number> {\n const { io } = deps;\n const [sub, ...rest] = args;\n if (sub === '--help' || sub === '-h' || sub === 'help') {\n io.out(ISSUE_USAGE);\n return 0;\n }\n if (sub !== 'create') {\n io.err(\n sub === undefined\n ? 'missing subcommand: rig issue create'\n : `unknown rig issue subcommand: ${sub}`\n );\n io.err(ISSUE_USAGE);\n return 2;\n }\n\n let flags: CommonFlags;\n let title: string;\n let bodyFlag: string | undefined;\n let bodyFile: string | undefined;\n let labels: string[];\n try {\n const { values } = parseArgs({\n args: rest,\n options: {\n ...COMMON_OPTIONS,\n title: { type: 'string' },\n body: { type: 'string' },\n 'body-file': { type: 'string' },\n label: { type: 'string', multiple: true },\n },\n allowPositionals: false,\n });\n flags = pickCommon(values);\n if (!flags.help && (values.title === undefined || values.title === '')) {\n throw new Error('--title is required');\n }\n if (values.body !== undefined && values['body-file'] !== undefined) {\n throw new Error('--body and --body-file are mutually exclusive');\n }\n title = values.title ?? '';\n bodyFlag = values.body;\n bodyFile = values['body-file'];\n labels = values.label ?? [];\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n io.err(ISSUE_USAGE);\n return 2;\n }\n if (flags.help) {\n io.out(ISSUE_USAGE);\n return 0;\n }\n\n // Body source: --body → --body-file → piped stdin.\n let body: string;\n if (bodyFlag !== undefined) {\n body = bodyFlag;\n } else if (bodyFile !== undefined) {\n try {\n body = await readFile(bodyFile, 'utf-8');\n } catch (err) {\n io.err(\n `cannot read --body-file ${bodyFile}: ${err instanceof Error ? err.message : String(err)}`\n );\n return 2;\n }\n } else if (!io.isInteractive) {\n body = await (deps.readStdin ?? defaultReadStdin)();\n } else {\n io.err('an issue body is required: pass --body/--body-file or pipe stdin');\n io.err(ISSUE_USAGE);\n return 2;\n }\n if (body.trim() === '') {\n io.err('the issue body is empty — nothing to publish');\n return 2;\n }\n\n return runEvent({\n command: 'issue',\n flags,\n deps,\n actionLabel: `issue ${JSON.stringify(title)}`,\n buildEvent: async (addr) =>\n buildIssue(addr.ownerPubkey, addr.repoId, title, body, labels),\n sendDaemon: (client, addr) =>\n client.gitIssue({\n repoAddr: addr,\n title,\n body,\n ...(labels.length > 0 ? { labels } : {}),\n }),\n });\n}\n\n// ---------------------------------------------------------------------------\n// rig comment\n// ---------------------------------------------------------------------------\n\n/** Run `rig comment …`; returns the process exit code. */\nexport async function runComment(\n args: string[],\n deps: EventCommandDeps\n): Promise<number> {\n const { io } = deps;\n\n let flags: CommonFlags;\n let rootEventId: string;\n let body: string;\n let parentAuthor: string | undefined;\n let marker: 'root' | 'reply';\n try {\n const { values, positionals } = parseArgs({\n args,\n options: {\n ...COMMON_OPTIONS,\n body: { type: 'string' },\n 'parent-author': { type: 'string' },\n marker: { type: 'string' },\n },\n allowPositionals: true,\n });\n flags = pickCommon(values);\n if (flags.help) {\n io.out(COMMENT_USAGE);\n return 0;\n }\n if (positionals.length !== 1) {\n throw new Error(\n positionals.length === 0\n ? '<root-event-id> is required'\n : `expected exactly one <root-event-id>, got ${positionals.length} positionals`\n );\n }\n rootEventId = positionals[0] as string;\n assertHex64(rootEventId, '<root-event-id>');\n if (values.body === undefined || values.body === '') {\n throw new Error('--body is required');\n }\n body = values.body;\n parentAuthor = values['parent-author'];\n if (parentAuthor !== undefined) assertHex64(parentAuthor, '--parent-author');\n const rawMarker = values.marker ?? 'root';\n if (rawMarker !== 'root' && rawMarker !== 'reply') {\n throw new Error(`--marker must be root or reply (got ${JSON.stringify(rawMarker)})`);\n }\n marker = rawMarker;\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n io.err(COMMENT_USAGE);\n return 2;\n }\n\n return runEvent({\n command: 'comment',\n flags,\n deps,\n actionLabel: `comment on ${rootEventId.slice(0, 8)}…`,\n buildEvent: async (addr) =>\n buildComment(\n addr.ownerPubkey,\n addr.repoId,\n rootEventId,\n parentAuthor ?? addr.ownerPubkey,\n body,\n marker\n ),\n sendDaemon: (client, addr) =>\n client.gitComment({\n repoAddr: addr,\n rootEventId,\n body,\n marker,\n ...(parentAuthor !== undefined\n ? { parentAuthorPubkey: parentAuthor }\n : {}),\n }),\n });\n}\n\n// ---------------------------------------------------------------------------\n// rig pr create\n// ---------------------------------------------------------------------------\n\n/** `From <sha> <date>` separator lines of `git format-patch --stdout` output. */\nconst PATCH_FROM_RE = /^From ([0-9a-f]{40}) /gm;\n\n/** Commit SHAs of a format-patch series, in patch (oldest-first) order. */\nexport function extractPatchShas(patchText: string): string[] {\n return [...patchText.matchAll(PATCH_FROM_RE)].map((m) => m[1] as string);\n}\n\n/** Run `rig pr …`; returns the process exit code. */\nexport async function runPr(\n args: string[],\n deps: EventCommandDeps\n): Promise<number> {\n const { io } = deps;\n const [sub, ...rest] = args;\n if (sub === '--help' || sub === '-h' || sub === 'help') {\n io.out(PR_USAGE);\n return 0;\n }\n if (sub !== 'create') {\n io.err(\n sub === undefined\n ? 'missing subcommand: rig pr create'\n : `unknown rig pr subcommand: ${sub}`\n );\n io.err(PR_USAGE);\n return 2;\n }\n\n let flags: CommonFlags;\n let title: string;\n let range: string | undefined;\n let patchFile: string | undefined;\n let branch: string | undefined;\n try {\n const { values } = parseArgs({\n args: rest,\n options: {\n ...COMMON_OPTIONS,\n title: { type: 'string' },\n range: { type: 'string' },\n 'patch-file': { type: 'string' },\n branch: { type: 'string' },\n },\n allowPositionals: false,\n });\n flags = pickCommon(values);\n if (flags.help) {\n io.out(PR_USAGE);\n return 0;\n }\n if (values.title === undefined || values.title === '') {\n throw new Error('--title is required');\n }\n if ((values.range === undefined) === (values['patch-file'] === undefined)) {\n throw new Error('exactly one of --range or --patch-file is required');\n }\n title = values.title;\n range = values.range;\n patchFile = values['patch-file'];\n branch = values.branch;\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n io.err(PR_USAGE);\n return 2;\n }\n\n // Lazily prepared patch content, shared by build (standalone) and send\n // (daemon) so format-patch runs once; failures land in runEvent's error path.\n let prepared:\n | { patchText: string; commits: { sha: string; parentSha: string }[] }\n | undefined;\n const prepare = async (): Promise<NonNullable<typeof prepared>> => {\n if (prepared) return prepared;\n if (range !== undefined) {\n // REAL format-patch output from the local repository (v1 publishes the\n // whole series as ONE event; see PR_USAGE).\n const reader = new GitRepoReader(await resolveRepoRoot(deps.cwd));\n const patchText = await reader.formatPatch(range);\n if (patchText === '') {\n throw new Error(\n `range ${JSON.stringify(range)} selects no commits — nothing to publish`\n );\n }\n // commit/parent-commit tags for exactly the commits the series carries\n // (parsed from the patch itself, so the tags can never drift from the\n // content). Root commits have no parent and contribute no tag pair.\n const shas = extractPatchShas(patchText);\n const parents = await reader.commitParents(shas);\n const commits = shas.flatMap((sha) => {\n const parentSha = parents.get(sha)?.[0];\n return parentSha ? [{ sha, parentSha }] : [];\n });\n prepared = { patchText, commits };\n } else {\n const patchText = await readFile(patchFile as string, 'utf-8');\n if (patchText.trim() === '') {\n throw new Error(`--patch-file ${patchFile} is empty — nothing to publish`);\n }\n prepared = { patchText, commits: [] };\n }\n return prepared;\n };\n\n return runEvent({\n command: 'pr',\n flags,\n deps,\n actionLabel: `patch ${JSON.stringify(title)}`,\n buildEvent: async (addr) => {\n const { patchText, commits } = await prepare();\n return buildPatch(\n addr.ownerPubkey,\n addr.repoId,\n title,\n commits,\n branch,\n patchText\n );\n },\n sendDaemon: async (client, addr) => {\n const { patchText, commits } = await prepare();\n return client.gitPatch({\n repoAddr: addr,\n title,\n patchText,\n ...(commits.length > 0 ? { commits } : {}),\n ...(branch !== undefined ? { branch } : {}),\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// rig status\n// ---------------------------------------------------------------------------\n\n/** NIP-34 status kinds by wire value (mirrors the daemon's mapping). */\nconst STATUS_KIND_BY_VALUE: Record<GitStatusValue, StatusKind> = {\n open: STATUS_OPEN_KIND,\n applied: STATUS_APPLIED_KIND,\n closed: STATUS_CLOSED_KIND,\n draft: STATUS_DRAFT_KIND,\n};\n\nfunction isStatusValue(value: string): value is GitStatusValue {\n return Object.hasOwn(STATUS_KIND_BY_VALUE, value);\n}\n\n/** Run `rig status …`; returns the process exit code. */\nexport async function runStatus(\n args: string[],\n deps: EventCommandDeps\n): Promise<number> {\n const { io } = deps;\n\n let flags: CommonFlags;\n let targetEventId: string;\n let status: GitStatusValue;\n try {\n const { values, positionals } = parseArgs({\n args,\n options: COMMON_OPTIONS,\n allowPositionals: true,\n });\n flags = pickCommon(values);\n if (flags.help) {\n io.out(STATUS_USAGE);\n return 0;\n }\n if (positionals.length !== 2) {\n throw new Error(\n 'expected exactly two arguments: <target-event-id> <open|applied|closed|draft>'\n );\n }\n targetEventId = positionals[0] as string;\n assertHex64(targetEventId, '<target-event-id>');\n const rawStatus = positionals[1] as string;\n if (!isStatusValue(rawStatus)) {\n throw new Error(\n `status must be one of open | applied | closed | draft (got ${JSON.stringify(rawStatus)})`\n );\n }\n status = rawStatus;\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n io.err(STATUS_USAGE);\n return 2;\n }\n\n return runEvent({\n command: 'status',\n flags,\n deps,\n actionLabel: `status ${status} on ${targetEventId.slice(0, 8)}…`,\n buildEvent: async (addr) => {\n const event = buildStatus(targetEventId, STATUS_KIND_BY_VALUE[status]);\n // NIP-34 status events also carry the repo `a` tag so readers can scope\n // a status stream to the repository without resolving the target first\n // (mirrors the daemon's gitStatus).\n event.tags.push([\n 'a',\n `${REPOSITORY_ANNOUNCEMENT_KIND}:${addr.ownerPubkey}:${addr.repoId}`,\n ]);\n return event;\n },\n sendDaemon: (client, addr) =>\n client.gitStatus({ repoAddr: addr, targetEventId, status }),\n });\n}\n","/**\n * Plain-fetch client for the toon-clientd loopback `/git/*` routes.\n *\n * Deliberately NOT built on `@toon-protocol/client-mcp`'s ControlClient —\n * that package depends on this one (its daemon Publisher wraps our planner),\n * so importing it back would be circular. The route conventions (loopback\n * base URL, JSON bodies, the `ErrorResponse` envelope with structured 409\n * `non_fast_forward` / 413 `oversize_objects` payloads) are mirrored here;\n * the wire types live in `../routes.ts` for client-mcp to adopt.\n */\n\nimport type {\n GitCommentRequest,\n GitErrorEnvelope,\n GitEstimateRequest,\n GitEstimateResponse,\n GitEventResponse,\n GitIssueRequest,\n GitPatchRequest,\n GitPushRequest,\n GitPushResponse,\n GitStatusRequest,\n} from '../routes.js';\n\n/** The daemon answered a `/git/*` route with a non-2xx error envelope. */\nexport class DaemonRouteError extends Error {\n constructor(\n /** HTTP status code (409 non_fast_forward, 413 oversize_objects, …). */\n public readonly status: number,\n /** The parsed error envelope (structured payloads at the top level). */\n public readonly envelope: GitErrorEnvelope\n ) {\n super(envelope.detail ?? envelope.error);\n this.name = 'DaemonRouteError';\n }\n}\n\n/** The daemon control API could not be reached at all. */\nexport class DaemonUnreachableError extends Error {\n constructor(\n public readonly baseUrl: string,\n cause: unknown\n ) {\n super(\n `toon-clientd control API is not reachable at ${baseUrl} — ` +\n `start the daemon (\\`toon-clientd\\`, shipped by @toon-protocol/client-mcp) ` +\n `and re-run, or use --standalone with TOON_CLIENT_MNEMONIC set` +\n (cause instanceof Error ? ` (${cause.message})` : '')\n );\n this.name = 'DaemonUnreachableError';\n }\n}\n\nexport class DaemonGitClient {\n constructor(\n private readonly baseUrl: string,\n private readonly fetchImpl: typeof fetch\n ) {}\n\n gitEstimate(req: GitEstimateRequest): Promise<GitEstimateResponse> {\n return this.post<GitEstimateResponse>('/git/estimate', req);\n }\n\n gitPush(req: GitPushRequest): Promise<GitPushResponse> {\n return this.post<GitPushResponse>('/git/push', req);\n }\n\n gitIssue(req: GitIssueRequest): Promise<GitEventResponse> {\n return this.post<GitEventResponse>('/git/issue', req);\n }\n\n gitComment(req: GitCommentRequest): Promise<GitEventResponse> {\n return this.post<GitEventResponse>('/git/comment', req);\n }\n\n gitPatch(req: GitPatchRequest): Promise<GitEventResponse> {\n return this.post<GitEventResponse>('/git/patch', req);\n }\n\n gitStatus(req: GitStatusRequest): Promise<GitEventResponse> {\n return this.post<GitEventResponse>('/git/status', req);\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n let res: Response;\n try {\n res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n } catch (err) {\n throw new DaemonUnreachableError(this.baseUrl, err);\n }\n const text = await res.text();\n let parsed: unknown;\n try {\n parsed = text === '' ? {} : JSON.parse(text);\n } catch {\n throw new DaemonRouteError(res.status, {\n error: 'invalid_response',\n detail: `daemon returned non-JSON (HTTP ${res.status}): ${text.slice(0, 200)}`,\n });\n }\n if (!res.ok) {\n const envelope =\n parsed && typeof parsed === 'object' && 'error' in parsed\n ? (parsed as GitErrorEnvelope)\n : { error: 'http_error', detail: `HTTP ${res.status}` };\n throw new DaemonRouteError(res.status, envelope);\n }\n return parsed as T;\n }\n}\n","/**\n * Publisher-mode selection for the `rig` CLI (#229).\n *\n * Two ways to pay for a push:\n *\n * daemon — a running `toon-clientd` control API on loopback; the CLI\n * drives its `/git/*` routes with plain fetch (this package\n * must NOT import `@toon-protocol/client-mcp` — that package\n * depends on this one, the import would be circular; the\n * loopback conventions are mirrored here the same way\n * `standalone/nonce-guard.ts` mirrors them).\n * standalone — an embedded ToonClient built from the caller's own\n * mnemonic (`@toon-protocol/git/standalone`).\n *\n * Selection: explicit `--daemon` / `--standalone` flags win; otherwise probe\n * the daemon `/status` — reachable AND reporting an identity ⇒ daemon; else\n * standalone when a mnemonic source exists (`TOON_CLIENT_MNEMONIC` or the\n * shared `~/.toon-client/config.json`); else a hard error naming both options.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { DEFAULT_DAEMON_PORT } from '../standalone/nonce-guard.js';\n\nexport type PushMode = 'daemon' | 'standalone';\n\n/** Result of probing the toon-clientd loopback `/status`. */\nexport interface DaemonProbe {\n /** Control API base URL probed, e.g. `http://127.0.0.1:8787`. */\n baseUrl: string;\n /** True when `/status` answered 200 with parseable JSON. */\n reachable: boolean;\n /** `identity.nostrPubkey` from the status body (when reachable). */\n identity?: string;\n /** `ready` from the status body (channel open, publish-ready). */\n ready?: boolean;\n /** Daemon's default relay URL (`relay.url`), for git-config persistence. */\n relayUrl?: string;\n /**\n * Daemon's flat per-event publish fee (`feePerEvent`, base units, decimal\n * string) — what the single-event subcommands quote before confirming.\n */\n feePerEvent?: string;\n}\n\n/** Availability of standalone mode (a mnemonic source exists). */\nexport interface StandaloneAvailability {\n available: boolean;\n /** Where the mnemonic would come from. */\n source?: 'env' | 'config';\n /** The client config path consulted (for error messages). */\n configPath: string;\n}\n\n/** Loopback control API base URL (port: `TOON_CLIENT_HTTP_PORT`, else 8787). */\nexport function daemonBaseUrl(env: NodeJS.ProcessEnv): string {\n const raw = env['TOON_CLIENT_HTTP_PORT'];\n const parsed = raw ? Number(raw) : NaN;\n const port =\n Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_DAEMON_PORT;\n return `http://127.0.0.1:${port}`;\n}\n\n/**\n * Probe `GET /status` on the loopback control API. Anything short of a 200\n * with JSON (no listener, timeout, other service) reports unreachable — the\n * caller then falls back to standalone or errors with remediation.\n */\nexport async function probeDaemon(\n env: NodeJS.ProcessEnv,\n fetchImpl: typeof fetch,\n timeoutMs = 1500\n): Promise<DaemonProbe> {\n const baseUrl = daemonBaseUrl(env);\n try {\n const res = await fetchImpl(`${baseUrl}/status`, {\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return { baseUrl, reachable: false };\n const body = (await res.json()) as {\n ready?: unknown;\n identity?: { nostrPubkey?: unknown };\n relay?: { url?: unknown };\n feePerEvent?: unknown;\n };\n const probe: DaemonProbe = { baseUrl, reachable: true };\n const pubkey = body?.identity?.nostrPubkey;\n if (typeof pubkey === 'string' && pubkey !== '') probe.identity = pubkey;\n if (typeof body?.ready === 'boolean') probe.ready = body.ready;\n if (typeof body?.relay?.url === 'string' && body.relay.url !== '') {\n probe.relayUrl = body.relay.url;\n }\n if (typeof body?.feePerEvent === 'string' && body.feePerEvent !== '') {\n probe.feePerEvent = body.feePerEvent;\n }\n return probe;\n } catch {\n return { baseUrl, reachable: false };\n }\n}\n\n/** Shared client state dir (duplicated convention: `TOON_CLIENT_HOME`, else `~/.toon-client`). */\nexport function clientConfigPath(env: NodeJS.ProcessEnv): string {\n const dir = env['TOON_CLIENT_HOME'] ?? join(homedir(), '.toon-client');\n return join(dir, 'config.json');\n}\n\n/**\n * True when standalone mode has an identity to work with: the\n * `TOON_CLIENT_MNEMONIC` env var, or a `mnemonic`/`keystorePath` entry in the\n * shared client config file. Deliberately import-free of\n * `@toon-protocol/client` — this runs during mode selection, before the\n * (optional) standalone dependency is ever loaded.\n */\nexport function standaloneAvailability(\n env: NodeJS.ProcessEnv\n): StandaloneAvailability {\n const configPath = clientConfigPath(env);\n if (env['TOON_CLIENT_MNEMONIC']) {\n return { available: true, source: 'env', configPath };\n }\n if (existsSync(configPath)) {\n try {\n const file = JSON.parse(readFileSync(configPath, 'utf8')) as {\n mnemonic?: unknown;\n keystorePath?: unknown;\n };\n if (\n (typeof file.mnemonic === 'string' && file.mnemonic !== '') ||\n (typeof file.keystorePath === 'string' && file.keystorePath !== '')\n ) {\n return { available: true, source: 'config', configPath };\n }\n } catch {\n // Unreadable config → no standalone identity from it.\n }\n }\n return { available: false, configPath };\n}\n\n/** Raised when neither mode is usable; message carries both remediations. */\nexport class NoPublisherError extends Error {\n constructor(probe: DaemonProbe, standalone: StandaloneAvailability) {\n super(\n 'no way to pay for this push — neither publisher mode is available:\\n' +\n ` • daemon: no toon-clientd control API at ${probe.baseUrl}/status — ` +\n 'start it (`toon-clientd`, shipped by @toon-protocol/client-mcp) and re-run, ' +\n 'or pass --daemon once it is up\\n' +\n ' • standalone: no identity found — set TOON_CLIENT_MNEMONIC (BIP-39 seed ' +\n `phrase) or configure ${standalone.configPath} (mnemonic / keystorePath), ` +\n 'then re-run (or pass --standalone)'\n );\n this.name = 'NoPublisherError';\n }\n}\n\nexport interface SelectModeOptions {\n /** Explicit `--daemon` flag. */\n daemon: boolean;\n /** Explicit `--standalone` flag. */\n standalone: boolean;\n env: NodeJS.ProcessEnv;\n fetchImpl: typeof fetch;\n}\n\nexport interface SelectedMode {\n mode: PushMode;\n /** Probe result (always populated in daemon mode; best-effort otherwise). */\n probe: DaemonProbe;\n}\n\n/**\n * Pick the publisher mode. Explicit flags win (an unreachable `--daemon`\n * still selects daemon — the push then fails with the exact \"start\n * toon-clientd\" remediation); default is probe-daemon-first with a\n * standalone fallback.\n */\nexport async function selectMode(\n options: SelectModeOptions\n): Promise<SelectedMode> {\n const { env, fetchImpl } = options;\n if (options.daemon && options.standalone) {\n throw new Error('--daemon and --standalone are mutually exclusive');\n }\n if (options.standalone) {\n return {\n mode: 'standalone',\n probe: { baseUrl: daemonBaseUrl(env), reachable: false },\n };\n }\n const probe = await probeDaemon(env, fetchImpl);\n if (options.daemon) return { mode: 'daemon', probe };\n\n if (probe.reachable && probe.identity) return { mode: 'daemon', probe };\n\n const standalone = standaloneAvailability(env);\n if (standalone.available) return { mode: 'standalone', probe };\n\n throw new NoPublisherError(probe, standalone);\n}\n","/**\n * Error UX for the `rig` commands: map structured planner/daemon errors to\n * actionable terminal output (and a machine-readable envelope for `--json`).\n *\n * The daemon and standalone paths surface the SAME failures in different\n * clothing — HTTP envelopes (409 `non_fast_forward`, 413 `oversize_objects`,\n * 503 `bootstrapping`, 402 `insufficient_gas`) vs. thrown planner errors\n * (`NonFastForwardError`, `OversizeObjectsError`) — so both are normalized\n * here to one rendering per failure class.\n */\n\nimport { MAX_OBJECT_SIZE } from '../objects.js';\nimport {\n NonFastForwardError,\n OversizeObjectsError,\n type OversizeObject,\n type RejectedRefUpdate,\n} from '../push.js';\nimport { GitError } from '../repo-reader.js';\nimport { DaemonRouteError, DaemonUnreachableError } from './daemon.js';\nimport { NoPublisherError } from './mode.js';\n\n/** Normalized error description: terminal lines + `--json` envelope. */\nexport interface DescribedError {\n /** Stable machine code (mirrors the daemon envelope's `error` field). */\n code: string;\n /** Human-facing lines (message first, remediation after). */\n lines: string[];\n /** Machine envelope for `--json` output (structured payload included). */\n json: Record<string, unknown>;\n}\n\nconst FUNDING_REMEDIATION = (command: string): string[] => [\n 'Remediation:',\n ' • fund the settlement wallet: run the toon_fund_wallet MCP tool (devnet faucet), or send gas/tokens to the wallet yourself',\n ' • open (or top up) a payment channel: toon_open_channel / toon_channel_deposit',\n ` • then re-run rig ${command}`,\n];\n\n/**\n * The single-event subcommands (issue/comment/pr/status) could not resolve\n * the NIP-34 repo address (`30617:<ownerPubkey>:<repoId>`) from flags or the\n * `toon.*` git config keys `rig push` persists.\n */\nexport class UnconfiguredRepoAddressError extends Error {\n constructor(\n /** Which half of the address is missing. */\n public readonly missing: 'repository id' | 'repository owner'\n ) {\n super(\n `no ${missing} configured — this command addresses the repo as ` +\n '30617:<ownerPubkey>:<repoId>. Run `rig push` once inside the repo ' +\n '(it persists toon.repoid/toon.owner/toon.relay to git config), or ' +\n `pass ${missing === 'repository id' ? '--repo-id <id>' : '--owner <pubkey>'} ` +\n \"explicitly (use --owner for repos you don't own).\"\n );\n this.name = 'UnconfiguredRepoAddressError';\n }\n}\n\nfunction nonFastForwardLines(refs: RejectedRefUpdate[]): string[] {\n return [\n 'Push rejected: non-fast-forward update for:',\n ...refs.map(\n (r) =>\n ` ${r.refname} remote ${r.remoteSha.slice(0, 7)} is not an ancestor of local ${r.localSha.slice(0, 7)}`\n ),\n 'The remote moved since your last push. Re-run with --force to overwrite it',\n 'WARNING: --force rewrites the published ref history for every reader of this repo.',\n ];\n}\n\nfunction oversizeLines(objects: OversizeObject[]): string[] {\n return [\n `Push rejected: ${objects.length} object(s) exceed the ${MAX_OBJECT_SIZE}-byte (95KB) upload limit:`,\n ...objects.map(\n (o) => ` ${o.path ?? o.sha} ${o.type}, ${o.size} bytes`\n ),\n 'Objects over 95KB are a hard error in v1 — split or remove the file(s) from history to push.',\n 'Large-object support is tracked in toon-client#235.',\n ];\n}\n\nfunction fromDaemonEnvelope(err: DaemonRouteError, command: string): DescribedError {\n const { envelope, status } = err;\n const json: Record<string, unknown> = { ...envelope, status };\n switch (envelope.error) {\n case 'non_fast_forward': {\n const refs = Array.isArray(envelope['refs'])\n ? (envelope['refs'] as RejectedRefUpdate[])\n : [];\n return { code: 'non_fast_forward', lines: nonFastForwardLines(refs), json };\n }\n case 'oversize_objects': {\n const objects = Array.isArray(envelope['objects'])\n ? (envelope['objects'] as OversizeObject[])\n : [];\n return { code: 'oversize_objects', lines: oversizeLines(objects), json };\n }\n case 'bootstrapping':\n return {\n code: 'bootstrapping',\n lines: [\n `toon-clientd is still bootstrapping: ${envelope.detail ?? 'transport/channel coming up'}`,\n 'Retry in a few seconds. If it never becomes ready, check the toon-clientd logs.',\n ],\n json,\n };\n case 'insufficient_gas':\n return {\n code: 'insufficient_gas',\n lines: [\n `Payment failed: ${envelope.detail ?? 'the settlement wallet cannot fund the channel'}`,\n ...FUNDING_REMEDIATION(command),\n ],\n json,\n };\n default:\n return {\n code: envelope.error,\n lines: [\n `rig ${command} failed (${envelope.error}, HTTP ${status})` +\n (envelope.detail ? `: ${envelope.detail}` : ''),\n ...(envelope.retryable ? ['This error is retryable — try again shortly.'] : []),\n ],\n json,\n };\n }\n}\n\n/**\n * Normalize any command-path error for rendering. `command` names the rig\n * subcommand for the generic \"rig <command> failed\" lines and the funding\n * remediation's re-run hint.\n */\nexport function describeError(err: unknown, command = 'push'): DescribedError {\n if (err instanceof DaemonRouteError) return fromDaemonEnvelope(err, command);\n\n if (err instanceof UnconfiguredRepoAddressError) {\n return {\n code: 'unconfigured_repo_address',\n lines: err.message.split('\\n'),\n json: { error: 'unconfigured_repo_address', detail: err.message },\n };\n }\n if (err instanceof DaemonUnreachableError) {\n return {\n code: 'daemon_unreachable',\n lines: [err.message],\n json: { error: 'daemon_unreachable', detail: err.message },\n };\n }\n if (err instanceof NoPublisherError) {\n return {\n code: 'no_publisher',\n lines: err.message.split('\\n'),\n json: { error: 'no_publisher', detail: err.message },\n };\n }\n if (err instanceof NonFastForwardError) {\n return {\n code: 'non_fast_forward',\n lines: nonFastForwardLines(err.refs),\n json: { error: 'non_fast_forward', detail: err.message, refs: err.refs },\n };\n }\n if (err instanceof OversizeObjectsError) {\n return {\n code: 'oversize_objects',\n lines: oversizeLines(err.objects),\n json: {\n error: 'oversize_objects',\n detail: err.message,\n objects: err.objects,\n },\n };\n }\n if (err instanceof GitError) {\n return {\n code: 'git_error',\n lines: [`git failed: ${err.message}`],\n json: { error: 'git_error', detail: err.message },\n };\n }\n\n // Standalone-path tagged errors (matched by name — the classes live behind\n // the optional dynamic import).\n const name = err instanceof Error ? err.name : '';\n const message = err instanceof Error ? err.message : String(err);\n if (name === 'DaemonIdentityConflictError') {\n return {\n code: 'daemon_identity_conflict',\n lines: [message, 'Re-run without --standalone (or with --daemon) to push through the running daemon.'],\n json: { error: 'daemon_identity_conflict', detail: message },\n };\n }\n if (name === 'MissingMnemonicError' || name === 'MissingUplinkError') {\n return {\n code: name === 'MissingMnemonicError' ? 'missing_mnemonic' : 'missing_uplink',\n lines: [message],\n json: { error: 'standalone_unavailable', detail: message },\n };\n }\n\n return {\n code: 'error',\n lines: [`rig ${command} failed: ${message}`],\n json: { error: 'error', detail: message },\n };\n}\n","/**\n * Repo-local `rig` configuration, persisted as git config keys (the\n * `rig init`-lite behavior: written after the first successful push):\n *\n * toon.repoid NIP-34 repository identifier (`d` tag)\n * toon.owner repository owner's Nostr pubkey (hex) — the identity that\n * signs kind:30617/30618 (`a`-tag `30617:<owner>:<repoId>`)\n * toon.relay relay URL(s), multi-valued\n *\n * All access goes through `execFile git config` with argument arrays (same\n * injection posture as GitRepoReader — never a shell).\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n/** The rig-relevant git config keys of one repository. */\nexport interface ToonRepoConfig {\n repoId?: string;\n owner?: string;\n relays: string[];\n}\n\nasync function git(\n repoPath: string,\n args: string[],\n allowExitCodes: number[] = []\n): Promise<{ stdout: string; exitCode: number }> {\n try {\n const { stdout } = await execFileAsync('git', args, {\n cwd: repoPath,\n encoding: 'utf-8',\n });\n return { stdout, exitCode: 0 };\n } catch (err) {\n const e = err as NodeJS.ErrnoException & {\n code?: number | string;\n stdout?: string;\n stderr?: string;\n };\n const exitCode = typeof e.code === 'number' ? e.code : undefined;\n if (exitCode !== undefined && allowExitCodes.includes(exitCode)) {\n return { stdout: e.stdout ?? '', exitCode };\n }\n throw new Error(\n `git ${args.join(' ')} failed${exitCode !== undefined ? ` (exit ${exitCode})` : ''}: ` +\n `${(e.stderr ?? e.message ?? '').trim()}`\n );\n }\n}\n\n/**\n * Resolve the repository worktree root for `cwd` via\n * `git rev-parse --show-toplevel`. Throws a clear error when `cwd` is not\n * inside a git repository.\n */\nexport async function resolveRepoRoot(cwd: string): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\n 'git',\n ['rev-parse', '--show-toplevel'],\n { cwd, encoding: 'utf-8' }\n );\n const root = stdout.trim();\n if (!root) throw new Error('empty rev-parse output');\n return root;\n } catch (err) {\n const e = err as { stderr?: string; message?: string };\n throw new Error(\n `not a git repository (run rig inside a repo): ${(e.stderr ?? e.message ?? '').trim()}`\n );\n }\n}\n\n/** Read the `toon.*` git config keys of the repository at `repoPath`. */\nexport async function readToonConfig(repoPath: string): Promise<ToonRepoConfig> {\n // exit 1 = key unset (git config --get convention) — tolerated everywhere.\n const [repoId, owner, relays] = await Promise.all([\n git(repoPath, ['config', '--get', 'toon.repoid'], [1]),\n git(repoPath, ['config', '--get', 'toon.owner'], [1]),\n git(repoPath, ['config', '--get-all', 'toon.relay'], [1]),\n ]);\n const config: ToonRepoConfig = {\n relays: relays.stdout\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean),\n };\n const id = repoId.stdout.trim();\n if (repoId.exitCode === 0 && id) config.repoId = id;\n const own = owner.stdout.trim();\n if (owner.exitCode === 0 && own) config.owner = own;\n return config;\n}\n\n/**\n * Persist the `toon.*` keys (repo-local config). Only supplied fields are\n * written; `relays` replaces the whole multi-valued list.\n */\nexport async function writeToonConfig(\n repoPath: string,\n config: { repoId?: string; owner?: string; relays?: string[] }\n): Promise<void> {\n if (config.repoId !== undefined) {\n await git(repoPath, ['config', 'toon.repoid', config.repoId]);\n }\n if (config.owner !== undefined) {\n await git(repoPath, ['config', 'toon.owner', config.owner]);\n }\n if (config.relays !== undefined && config.relays.length > 0) {\n // Replace the whole list: unset-all (exit 5 = key did not exist) + re-add.\n await git(repoPath, ['config', '--unset-all', 'toon.relay'], [5]);\n for (const relay of config.relays) {\n await git(repoPath, ['config', '--add', 'toon.relay', relay]);\n }\n }\n}\n","/**\n * `rig push [refspecs...]` — estimate → confirm → execute (#229).\n *\n * One flow, two publisher modes (see ./mode.ts):\n * daemon estimate/execute via toon-clientd `POST /git/estimate|push`\n * (the daemon plans AND publishes; its key signs, so its\n * identity is the repo owner);\n * standalone plan locally (`planPush`) and execute through the embedded,\n * nonce-guarded StandalonePublisher (loaded via dynamic import\n * so daemon-mode runs never need `@toon-protocol/client`).\n *\n * Money is only spent after the confirm gate: `--yes`, or an interactive\n * y/N prompt (a non-TTY session without `--yes` refuses). `--json` emits the\n * wire-shaped plan/receipts for agent consumers; without `--yes` it becomes\n * a pure estimate (plan JSON, nothing executed, exit 0).\n */\n\nimport { basename } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport { planPush, executePush, type PushPlan } from '../push.js';\nimport type { RemoteState } from '../remote-state.js';\nimport { GitRepoReader } from '../repo-reader.js';\nimport { renderPlan, renderResult } from './render.js';\nimport {\n serializePushPlan,\n serializePushResult,\n type GitEstimateRequest,\n type GitEstimateResponse,\n type GitPushResponse,\n} from '../routes.js';\nimport { DaemonGitClient } from './daemon.js';\nimport { describeError } from './errors.js';\nimport {\n readToonConfig,\n resolveRepoRoot,\n writeToonConfig,\n} from './git-config.js';\nimport { selectMode, type PushMode } from './mode.js';\nimport type { LoadStandalone, StandaloneContext } from './standalone-context.js';\n\n// ---------------------------------------------------------------------------\n// Dependency seam (real wiring in rig.ts; tests inject fakes)\n// ---------------------------------------------------------------------------\n\n/** Terminal I/O seam. */\nexport interface CliIo {\n /** Write one line to stdout. */\n out(line: string): void;\n /** Write one line to stderr. */\n err(line: string): void;\n /** True when stdin+stdout are TTYs (interactive confirm possible). */\n isInteractive: boolean;\n /** Ask a y/N question; resolves true on explicit yes. */\n confirm(question: string): Promise<boolean>;\n}\n\nexport interface PushDeps {\n io: CliIo;\n env: NodeJS.ProcessEnv;\n cwd: string;\n fetchImpl: typeof fetch;\n /** Standalone factory; defaults to the real dynamic-import loader. */\n loadStandalone?: LoadStandalone;\n}\n\n/**\n * Default standalone factory (shared with the single-event subcommands in\n * ./events.ts). Dynamic import: `standalone-mode` (and its optional\n * `@toon-protocol/client` peer dependency) only loads when standalone mode\n * is actually selected.\n */\nexport const defaultLoadStandalone: LoadStandalone = async (env) => {\n const mod = await import('./standalone-mode.js');\n return mod.createStandaloneContext(env);\n};\n\n// ---------------------------------------------------------------------------\n// Usage\n// ---------------------------------------------------------------------------\n\nexport const PUSH_USAGE = `Usage: rig push [refspecs...] [options]\n\nPush local git refs to TOON: uploads the object delta to Arweave (paid) and\npublishes the NIP-34 refs event (kind:30618; kind:30617 announce on first\npush). Writes are permanent and non-refundable.\n\nRefspecs are branch/tag names or full refnames; default is the current branch.\n\nOptions:\n --force allow non-fast-forward ref updates (overwrites remote history)\n --all push all local branches\n --tags push all local tags\n --yes skip the fee confirmation (required when not a TTY)\n --json machine-readable plan/receipts; without --yes it is a pure\n estimate (nothing executed)\n --relay <url> relay URL (repeatable in daemon mode; standalone mode\n supports exactly one; default: git config toon.relay,\n then the mode's default relay)\n --repo-id <id> repository id / NIP-34 d-tag (default: git config\n toon.repoid, then the repo directory name)\n --daemon force daemon mode (toon-clientd control API)\n --standalone force standalone mode (embedded client from TOON_CLIENT_MNEMONIC)\n -h, --help show this help`;\n\n// ---------------------------------------------------------------------------\n// Refspec selection\n// ---------------------------------------------------------------------------\n\n/**\n * Expand positional refspecs / `--all` / `--tags` into full refnames using\n * the local ref list; default (no selection) is the current branch.\n */\nexport async function selectRefspecs(\n reader: GitRepoReader,\n positionals: string[],\n all: boolean,\n tags: boolean\n): Promise<string[]> {\n const { head, refs } = await reader.listRefs();\n const byName = new Set(refs.map((r) => r.refname));\n\n const selected: string[] = [];\n const add = (refname: string): void => {\n if (!selected.includes(refname)) selected.push(refname);\n };\n\n for (const spec of positionals) {\n if (byName.has(spec)) {\n add(spec);\n } else if (byName.has(`refs/heads/${spec}`)) {\n add(`refs/heads/${spec}`);\n } else if (byName.has(`refs/tags/${spec}`)) {\n add(`refs/tags/${spec}`);\n } else {\n throw new Error(\n `refspec ${JSON.stringify(spec)} matches no local branch or tag ` +\n '(ref deletion is out of scope in v1)'\n );\n }\n }\n if (all) {\n for (const ref of refs) {\n if (ref.refname.startsWith('refs/heads/')) add(ref.refname);\n }\n }\n if (tags) {\n for (const ref of refs) {\n if (ref.refname.startsWith('refs/tags/')) add(ref.refname);\n }\n }\n if (selected.length === 0) {\n if (!head) {\n throw new Error(\n 'HEAD is detached and no refspec was given — pass a branch/tag name, --all, or --tags'\n );\n }\n add(head);\n }\n return selected;\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\ninterface PushFlags {\n force: boolean;\n all: boolean;\n tags: boolean;\n yes: boolean;\n json: boolean;\n daemon: boolean;\n standalone: boolean;\n relay: string[];\n repoId?: string;\n help: boolean;\n positionals: string[];\n}\n\nfunction parsePushArgs(args: string[]): PushFlags {\n const { values, positionals } = parseArgs({\n args,\n options: {\n force: { type: 'boolean', default: false },\n all: { type: 'boolean', default: false },\n tags: { type: 'boolean', default: false },\n yes: { type: 'boolean', default: false },\n json: { type: 'boolean', default: false },\n daemon: { type: 'boolean', default: false },\n standalone: { type: 'boolean', default: false },\n relay: { type: 'string', multiple: true },\n 'repo-id': { type: 'string' },\n help: { type: 'boolean', short: 'h', default: false },\n },\n allowPositionals: true,\n });\n const flags: PushFlags = {\n force: values.force ?? false,\n all: values.all ?? false,\n tags: values.tags ?? false,\n yes: values.yes ?? false,\n json: values.json ?? false,\n daemon: values.daemon ?? false,\n standalone: values.standalone ?? false,\n relay: values.relay ?? [],\n help: values.help ?? false,\n positionals,\n };\n const repoId = values['repo-id'];\n if (repoId !== undefined) flags.repoId = repoId;\n return flags;\n}\n\n/** JSON envelope emitted by `--json` runs (agents consume this). */\ninterface PushJsonOutput {\n command: 'push';\n mode: PushMode;\n repoId: string;\n /** True when the paid execute step ran. */\n executed: boolean;\n /** True when every selected ref already matched the remote (no-op). */\n upToDate: boolean;\n plan: GitEstimateResponse;\n result?: GitPushResponse;\n hint?: string;\n}\n\n/** Run `rig push`; returns the process exit code. */\nexport async function runPush(args: string[], deps: PushDeps): Promise<number> {\n const { io, env, fetchImpl } = deps;\n\n let flags: PushFlags;\n try {\n flags = parsePushArgs(args);\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n io.err(PUSH_USAGE);\n return 2;\n }\n if (flags.help) {\n io.out(PUSH_USAGE);\n return 0;\n }\n\n let standaloneCtx: StandaloneContext | undefined;\n /** Rich standalone plan carried from estimate to execute within this run. */\n let standalonePlan:\n | {\n pushPlan: PushPlan;\n remoteState: RemoteState;\n reader: GitRepoReader;\n relaysUsed: string[];\n }\n | undefined;\n try {\n // ── Repo + config resolution ────────────────────────────────────────────\n const repoRoot = await resolveRepoRoot(deps.cwd);\n const toonConfig = await readToonConfig(repoRoot);\n const repoId = flags.repoId ?? toonConfig.repoId ?? basename(repoRoot);\n const reader = new GitRepoReader(repoRoot);\n const refspecs = await selectRefspecs(\n reader,\n flags.positionals,\n flags.all,\n flags.tags\n );\n /** Explicitly-known relays (flags → git config); undefined = mode default. */\n const explicitRelays =\n flags.relay.length > 0\n ? flags.relay\n : toonConfig.relays.length > 0\n ? toonConfig.relays\n : undefined;\n\n // ── Mode selection ──────────────────────────────────────────────────────\n const { mode, probe } = await selectMode({\n daemon: flags.daemon,\n standalone: flags.standalone,\n env,\n fetchImpl,\n });\n\n // ── Estimate ────────────────────────────────────────────────────────────\n let plan: GitEstimateResponse;\n let identity: string | undefined;\n let relaysUsed: string[] | undefined = explicitRelays;\n const daemonClient = new DaemonGitClient(probe.baseUrl, fetchImpl);\n const daemonRequest: GitEstimateRequest = {\n repoPath: repoRoot,\n repoId,\n refspecs,\n force: flags.force,\n ...(explicitRelays ? { relayUrls: explicitRelays } : {}),\n };\n\n if (mode === 'daemon') {\n identity = probe.identity;\n relaysUsed ??= probe.relayUrl ? [probe.relayUrl] : undefined;\n plan = await daemonClient.gitEstimate(daemonRequest);\n } else {\n standaloneCtx = await (deps.loadStandalone ?? defaultLoadStandalone)(env);\n identity = standaloneCtx.ownerPubkey;\n relaysUsed ??= standaloneCtx.defaultRelayUrls;\n // StandalonePublisher publishes to exactly one relay (its publishEvent\n // throws on >1). Multiple relays can arrive here without explicit\n // intent — e.g. a daemon-mode push persisted several into git config\n // `toon.relay`, and a later daemon outage auto-selected standalone.\n // Refuse up front, before anything is fetched, uploaded, or paid.\n if (relaysUsed && relaysUsed.length > 1) {\n io.err(\n `standalone mode publishes to a single relay, but ${relaysUsed.length} are ` +\n `configured (${relaysUsed.join(', ')}) — re-run with exactly one ` +\n '--relay <url> (or trim git config toon.relay). Nothing was uploaded or paid.'\n );\n return 1;\n }\n const remoteState = await standaloneCtx.fetchRemote({\n ownerPubkey: standaloneCtx.ownerPubkey,\n repoId,\n relayUrls: relaysUsed,\n });\n const feeRates = await standaloneCtx.publisher.getFeeRates();\n const pushPlan = await planPush({\n repoReader: reader,\n remoteState,\n feeRates,\n repoId,\n refs: refspecs,\n force: flags.force,\n });\n plan = serializePushPlan(pushPlan);\n // Keep the rich plan for executePush (avoids a re-plan).\n standalonePlan = { pushPlan, remoteState, reader, relaysUsed };\n }\n\n if (toonConfig.owner && identity && toonConfig.owner !== identity) {\n io.err(\n `warning: git config toon.owner (${toonConfig.owner.slice(0, 8)}…) differs from ` +\n `the active ${mode} identity (${identity.slice(0, 8)}…) — this push publishes ` +\n \"under the ACTIVE identity's repo namespace, not the configured owner's\"\n );\n }\n\n // ── Up-to-date short-circuit (never publish a no-op refs event) ─────────\n const upToDate = plan.refUpdates.every((u) => u.kind === 'up-to-date');\n if (upToDate) {\n if (flags.json) {\n io.out(jsonOut({ command: 'push', mode, repoId, executed: false, upToDate: true, plan }));\n } else {\n io.out('Everything up-to-date — nothing to push (and nothing paid).');\n }\n return 0;\n }\n\n // ── Confirm gate ────────────────────────────────────────────────────────\n if (!flags.json) {\n for (const line of renderPlan(plan, mode)) io.out(line);\n }\n if (!flags.yes) {\n if (flags.json) {\n io.out(\n jsonOut({\n command: 'push',\n mode,\n repoId,\n executed: false,\n upToDate: false,\n plan,\n hint: 'estimate only — re-run with --yes to upload and publish (permanent, non-refundable)',\n })\n );\n return 0;\n }\n if (!io.isInteractive) {\n io.err(\n 'refusing to spend channel funds without confirmation in a non-interactive ' +\n 'session — re-run with --yes (or use --json for an estimate)'\n );\n return 1;\n }\n const proceed = await io.confirm(\n `Proceed with paid push (total ${plan.estimate.totalFee} base units)? [y/N] `\n );\n if (!proceed) {\n io.err('aborted — nothing was uploaded or published.');\n return 1;\n }\n }\n\n // ── Execute ─────────────────────────────────────────────────────────────\n let result: GitPushResponse;\n if (mode === 'daemon') {\n result = await daemonClient.gitPush({ ...daemonRequest, confirm: true });\n } else {\n const cached = standalonePlan;\n if (!cached || !standaloneCtx) {\n throw new Error('internal: standalone plan cache missing');\n }\n const pushResult = await executePush({\n plan: cached.pushPlan,\n publisher: standaloneCtx.publisher,\n remoteState: cached.remoteState,\n repoReader: cached.reader,\n relayUrls: cached.relaysUsed,\n });\n result = serializePushResult(cached.pushPlan, pushResult);\n }\n\n // ── Receipts ────────────────────────────────────────────────────────────\n if (flags.json) {\n io.out(\n jsonOut({ command: 'push', mode, repoId, executed: true, upToDate: false, plan, result })\n );\n } else {\n for (const line of renderResult(result)) io.out(line);\n }\n\n // ── rig init-lite: persist repo addressing after a successful push ──────\n try {\n await writeToonConfig(repoRoot, {\n repoId,\n ...(identity ? { owner: identity } : {}),\n ...(relaysUsed ? { relays: relaysUsed } : {}),\n });\n } catch (err) {\n io.err(\n `warning: push succeeded but persisting git config failed: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return 0;\n } catch (err) {\n const described = describeError(err);\n if (flags.json) {\n io.out(JSON.stringify({ command: 'push', ...described.json }, null, 2));\n } else {\n for (const line of described.lines) io.err(line);\n }\n return 1;\n } finally {\n if (standaloneCtx) {\n try {\n await standaloneCtx.stop();\n } catch {\n // best-effort teardown\n }\n }\n }\n}\n\nfunction jsonOut(output: PushJsonOutput): string {\n return JSON.stringify(output, null, 2);\n}\n","/**\n * Human-facing rendering for `rig push`: the pre-push confirm table and the\n * post-push receipts. Machine consumers use `--json` instead (the raw wire\n * shapes from ../routes.ts) — nothing here is meant to be parsed.\n */\n\nimport type {\n GitEstimateResponse,\n GitEventResponse,\n GitPushResponse,\n GitRefUpdate,\n GitRepoAddr,\n} from '../routes.js';\n\n/** Group thousands for readability: 1234567 → '1,234,567'. */\nexport function formatNumber(value: number | string | bigint): string {\n return String(value).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nfunction shortSha(sha: string | null): string {\n return sha ? sha.slice(0, 7) : '(none)';\n}\n\nfunction refLine(update: GitRefUpdate): string {\n const arrow = `${shortSha(update.remoteSha)} → ${shortSha(update.localSha)}`;\n return ` ${update.refname} ${arrow} (${update.kind})`;\n}\n\n/** The pre-push confirm table (refs, objects, itemized fees, warning). */\nexport function renderPlan(plan: GitEstimateResponse, mode: string): string[] {\n const lines: string[] = [];\n lines.push(\n `Push plan for repo \"${plan.repoId}\" (${mode} mode)` +\n (plan.announceNeeded ? ' — first push, will announce (kind:30617)' : '')\n );\n lines.push('Refs:');\n for (const update of plan.refUpdates) lines.push(refLine(update));\n\n const est = plan.estimate;\n const skipped = Object.keys(plan.knownShaToTxId).length;\n lines.push(\n `Objects: ${est.objectCount} to upload` +\n ` (${formatNumber(est.totalObjectBytes)} bytes)` +\n (skipped > 0 ? `; ${skipped} already on Arweave (free)` : '')\n );\n lines.push('Fees (base units):');\n lines.push(\n ` upload ${est.objectCount} object(s), ${formatNumber(est.totalObjectBytes)} bytes` +\n ` ${formatNumber(est.uploadFee)}`\n );\n lines.push(` events ${est.eventCount} event(s) ${formatNumber(est.eventFees)}`);\n lines.push(` total ${formatNumber(est.totalFee)}`);\n lines.push('Writes are permanent and non-refundable.');\n return lines;\n}\n\n/** Human label for a per-event fee that may be unknown (older daemons). */\nexport function feeLabel(fee: string | undefined): string {\n return fee !== undefined\n ? `${formatNumber(fee)} base units`\n : \"the publisher's configured per-event fee\";\n}\n\n/**\n * Pre-publish summary for the single-event subcommands\n * (issue/comment/pr/status): what is published, against which repo address,\n * at what fee — the confirm gate follows these lines.\n */\nexport function renderEventPlan(opts: {\n /** e.g. `issue \"Fix the flux\" (kind:1621)`. */\n action: string;\n addr: GitRepoAddr;\n mode: string;\n /** Per-event fee (base units, decimal string), when known. */\n fee?: string;\n}): string[] {\n return [\n `Publish ${opts.action} (${opts.mode} mode)`,\n `Repo: 30617:${opts.addr.ownerPubkey}:${opts.addr.repoId}`,\n `Fee: ${feeLabel(opts.fee)}. Writes are permanent and non-refundable.`,\n ];\n}\n\n/** Receipt line for one published single-event git write. */\nexport function renderEventReceipt(\n action: string,\n result: GitEventResponse\n): string[] {\n const lines = [\n `Published ${action}: ${result.eventId} paid ${formatNumber(result.feePaid)} base units`,\n ];\n if (result.channelBalanceAfter !== undefined) {\n lines.push(\n `Channel balance after: ${formatNumber(result.channelBalanceAfter)} base units`\n );\n }\n return lines;\n}\n\n/** Post-push receipts: per-object skipped/paid, event ids, paid-vs-estimate. */\nexport function renderResult(result: GitPushResponse): string[] {\n const lines: string[] = [];\n lines.push(`Pushed \"${result.repoId}\":`);\n const paid = result.uploads.filter((u) => !u.skipped);\n const skipped = result.uploads.filter((u) => u.skipped);\n for (const upload of result.uploads) {\n lines.push(\n ` object ${upload.sha.slice(0, 12)} ${upload.skipped ? 'skipped (already stored)' : `paid ${formatNumber(upload.feePaid)}`}` +\n ` ar:${upload.txId}`\n );\n }\n lines.push(\n `Uploads: ${paid.length} paid, ${skipped.length} skipped (content-addressed).`\n );\n if (result.announceReceipt) {\n lines.push(\n `Announcement (kind:30617): ${result.announceReceipt.eventId}` +\n ` paid ${formatNumber(result.announceReceipt.feePaid)}`\n );\n }\n lines.push(\n `Refs event (kind:30618): ${result.refsReceipt.eventId}` +\n ` paid ${formatNumber(result.refsReceipt.feePaid)}`\n );\n lines.push(\n `Total paid: ${formatNumber(result.totalFeePaid)} base units` +\n ` (estimate was ${formatNumber(result.estimate.totalFee)})`\n );\n return lines;\n}\n"],"mappings":"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","names":["parseArgs","jsonOut","parseArgs"]}
|