···153153```sh
154154tang repo clone onev.cat/tang-playground
155155tang repo clone onev.cat/tang-playground ./playground
156156+tang repo clone git@tangled.org:onev.cat/tang-playground ./playground
156157```
157158158158-`repo clone` uses the SSH clone URL shown by the Tangled web UI, for example
159159-`git@tangled.org:onev.cat/tang-playground`. Make sure the matching public key is
160160-registered in Tangled before cloning private or writable repositories.
159159+When the repository argument is `OWNER/REPO`, `repo clone` chooses the clone URL
160160+from `clone.protocol`. The default is `https`, matching GitHub CLI's configured
161161+protocol model. Set it to `ssh` when you want Tangled's SSH clone URL:
162162+163163+```sh
164164+tang config get clone.protocol
165165+tang config set clone.protocol ssh
166166+tang config set clone.protocol https
167167+```
168168+169169+When the repository argument is an explicit clone URL, `repo clone` passes it
170170+directly to `git clone` and does not consult `clone.protocol`.
161171162172Create a repository:
163173···290300tang config list
291301tang config get knot.hosts
292302tang config set knot.hosts knot1.tangled.sh,tangled.org
303303+tang config get clone.protocol
304304+tang config set clone.protocol ssh
293305tang config set appview.url https://tangled.org
294306tang config set constellation.url https://constellation.microcosm.blue
295307tang config set remote origin
···357369- Some older pull request records do not contain patch rounds, so `pr diff` and
358370 `pr checkout` cannot operate on them.
359371- SSH clone depends on Tangled's SSH key authorization index. If a freshly added
360360- key is rejected, retry after the key appears in `tang ssh-key list`.
372372+ key is rejected, retry after the key appears in `tang ssh-key list`, or use
373373+ the default HTTPS clone protocol.
361374- `repo create` requires a create-capable knot. Pass `--knot` when the default
362375 service route is not sufficient.
363376- `pr merge` depends on the repository knot's `sh.tangled.repo.merge` endpoint.
+4
ai-docs/2026-05-02-PHASE_3_repo_pr.md
···4848 - Created PR `at://did:plc:kl2ejrmz5zmxnno3ll4luz76/sh.tangled.repo.pull/3mkuuamwfj322`.
4949 - `tang pr merge 3mkuuamwfj322 --subject "Merge Phase 3 E2E"` succeeded.
5050 - Deleted both temporary remote branches afterward.
5151+- Completed follow-up on 2026-05-03: `clone.protocol` default E2E used an isolated config directory, confirmed `clone.protocol=https`, cloned `onev.cat/tang-playground`, and observed origin `https://tangled.org/onev.cat/tang-playground`.
5252+- Completed follow-up on 2026-05-03: `clone.protocol=ssh` E2E used an isolated config directory, cloned `onev.cat/tang-playground`, and observed origin `git@tangled.org:onev.cat/tang-playground`.
5353+- Completed follow-up on 2026-05-03: explicit URL E2E set `clone.protocol=ssh`, cloned `https://tangled.org/onev.cat/tang-playground`, and confirmed the explicit HTTPS URL was preserved.
51545255## Notes
5356···5659- `pr merge` does not expose `--squash`, `--rebase`, or `--merge`, matching the current Tangled merge endpoint.
5760- Follow-up on 2026-05-03: `knot1.tangled.sh` is now the first default knot host, so `repo create` uses the create-capable knot by default. `tangled.org` remains in the default host list for AppView-style and existing remote URLs.
5861- Follow-up on 2026-05-03: Tangled web maps repos whose record knot is `knot1.tangled.sh` to hosted clone URLs on `tangled.org`. After refreshing the account SSH key, `git clone git@tangled.org:onev.cat/tang-playground` succeeded, so `repo clone` now uses the web-equivalent SSH clone URL.
6262+- Follow-up on 2026-05-03: `repo clone` now follows `clone.protocol` (`https` by default, `ssh` optional) for `OWNER/REPO` inputs, while explicit clone URLs are passed directly to `git clone`. Unit tests cover config validation, hosted clone URL mapping, protocol selection, and explicit URL detection.
59636064## Completion
6165
+1-1
internal/cli/config.go
···7474 if rendered, err := renderJSONIfRequested(cmd, opts, values); rendered || err != nil {
7575 return err
7676 }
7777- for _, key := range []string{"knot.hosts", "constellation.url", "appview.url", "remote"} {
7777+ for _, key := range []string{"knot.hosts", "constellation.url", "appview.url", "clone.protocol", "remote"} {
7878 if _, err := fmt.Fprintf(cmd.OutOrStdout(), "%s=%s\n", key, formatConfigValue(values[key])); err != nil {
7979 return err
8080 }