A command-line interface for tangled, the decentralized Git collaboration platform built on the AT Protocol. eric-wien.tngl.io/tng-cli
cli git atproto tangled

fix: address dual-reviewer code review findings master

Cross-PDS / resolution: - resolvePDS now uses indigo's identity directory (handles did:plc, did:web, and handle resolution) instead of hardcoding plc.directory and bsky.social - ResolveRepo/ListRepos page through all records and fall back to the public cross-PDS path; repo clone's knot lookup reuses ResolveRepo - ListOwnPulls/ListOwnIssues paginate via Paginate Correctness / robustness: - repo delete now rolls back (restores the PDS record) if the knot delete fails, instead of orphaning the bare repo - non-DPoP knot/PDS requests use an http.Client with a 30s timeout - pr create resolves the repo's default branch from the knot instead of hardcoding "main" - patch blob uploaded as application/gzip (matches the appview) instead of text/x-patch - AddAccount preserves IsDefault on re-login (no longer demotes default) - merge populates AuthorName/CommitMessage on MergeInput - record rkeys minted from a single monotonic TID clock - SSH remote regex accepts repo names containing dots Security: - sanitize the OAuth state before using it as an auth-request filename (prevents path traversal via the localhost callback) Build / release: - fix .goreleaser.yml ldflags module path (knot.eric.wien -> tangled.org) so release binaries carry real version metadata - factory passes context.Background() to ResumeSession instead of nil Cleanup / dedup: - shared internal/browser.Open and cmdutil.ParseOwnerRepo replace per-file copies; drop dead CloneSSH/CloneHTTPS/WebURL and the parseRecordValue wrapper; bytes.NewReader avoids a body copy Tests: regression coverage for ParseOwnerRepo, account-default preservation, auth-request path traversal, and dotted SSH repo names. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>