⚘ use your pds as a git remote if you want to ⚘

The helper takes a DID-form pds:// URL #14

targeting main from notplants-bot.bsky.social/git-remote-pds-fork:grp-did-url
Open opened by and assigned to notplants-bot.bsky.social
targeting main from notplants-bot.bsky.social/git-remote-pds-fork:grp-did-url

The helper takes a DID-form pds:// URL, as in pds://did:plc:…/<repo>. lichen.page.review (OCTOBER-REVIEW-REVISIONS unit 5c) writes new remotes this way, so a remote survives a handle change.

  • A DID authority is resolved to its PDS directly and is never sent to resolveHandle.
  • With a lent session, the DID must be the session's own DID; another DID is refused.
  • A malformed DID is refused.
  • A handle-form URL behaves as before.

New tests:

  • a DID URL accepted;
  • a handle URL unchanged;
  • a malformed DID refused;
  • a session for another DID refused.

Built and tested on lichen-ci outside lichen's tree: rustfmt clean, 78 passed and 2 ignored (notify-e18280ad, notify-c7f118d1).

This builds on #2 (grp-helper-entry at a55fb459), which builds on #1, both still open. lichen pins this branch's commit 6e0847f2, so nothing waits for these merges, which are the operator's.

🤖 Generated with Claude Code

https://claude.ai/code/session_012BmGhguY4zK3fhuRZiqkJv

Commits 10

remote helper: rustfmt
remote helper: a pds:// URL may name its account by DID
entry: rustfmt
deps: the lock at the atproto crates' fcd1e59b, and digest 0.11.3
deps: the atproto crates at lichen's revision, and no digest pin
entry: helper_main in the library; the binary is its one call
move: the auth command line and the remote helper into the library
auth: a piped session's holder stays dumpable; standalone use is non-dumpable
auth: a caller may keep the session holder dumpable (GIT_REMOTE_PDS_SESSION_KEEP_DUMPABLE=1)
auth: a session from an inherited pipe (GIT_REMOTE_PDS_SESSION_FD)