feat(cli): add domains transfer command for same-store project moves#3089
Merged
jorgemoya merged 4 commits intoJul 10, 2026
Merged
Conversation
🦋 Changeset detectedLatest commit: f82d65b The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Bundle Size ReportComparing against baseline from No bundle size changes detected. |
Base automatically changed from
jorgemoya/ltrac-1106-implement-domain-claiming-functionality-in-the-cli
to
canary
July 8, 2026 19:46
Contributor
Unlighthouse Performance Comparison — VercelComparing PR preview deployment Unlighthouse scores vs production Unlighthouse scores. Summary ScoreAggregate score across all categories as reported by Unlighthouse.
Category Scores
Core Web Vitals
|
915ddb2 to
6fb0d10
Compare
6fb0d10 to
d811f05
Compare
d811f05 to
24fa1b5
Compare
Contributor
Author
|
Testing: |
Add `catalyst domains transfer <domain>` to move a custom domain from its
current project to another project in the same store — the same-store
counterpart to `domains claim` (cross-store). The source is the linked project;
the destination is `--to-project-uuid`, or, when that's omitted, chosen
interactively from the store's other projects (the source is excluded).
Adds a `transferDomain` client (`POST .../domains/{domain}/transfer` with
`{ new_project_uuid }`), the subcommand with `--wait`, a default MSW handler,
and tests.
Refs LTRAC-1117
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`domains transfer` moves a domain from the linked (source) project to a destination. When the linked project doesn't own the domain, the Domains API rejected the transfer with an opaque "domain is not owned by the specified project" error — after the user had already picked a destination. Add a `findDomain` client (a `getDomain` that returns null on a 404 instead of throwing) and a pre-flight in the transfer command: before prompting for a destination, confirm the domain is on the source project, otherwise throw an actionable error pointing at `--project-uuid` and `catalyst domains list`. Refs LTRAC-1117 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
consola's fancy reporter printed a per-line wall-clock timestamp. It adds
noise for a short-lived CLI (no comparable dev CLI does it), and on long lines
consola can't right-align it, so it falls back to an inline `[time]` prefix
that breaks copy-pasteable command suggestions. Disable it with
`formatOptions: { date: false }`. The `logs` command is unaffected: its
timestamps come from the log payload, not consola's clock.
Also move the runnable command in the add/claim "already in use" error
branches onto its own unprefixed `consola.log` line so it stays clean to copy
at any terminal width.
Refs LTRAC-1117
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The transfer pre-flight told the user to run `catalyst domains list` to find which project owns the domain, but `list` only shows the *current* project's domains — so it could never surface a domain that lives on another project. When the linked project doesn't own the domain, scan the store's other projects and name the one that does, with the exact `--project-uuid` command to re-run. If no project in the store owns it, say so and point at `catalyst domains claim` for the cross-store case. Refs LTRAC-1117 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c30d407 to
f82d65b
Compare
jordanarldt
approved these changes
Jul 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear: LTRAC-1117
What/Why?
Adds
catalyst domains transfer <domain>— moves a custom domain from its current project to another project in the same store. This is the same-store counterpart todomains claim(cross-store): when youdomains adda domain already bound to another project in your store, the API tells you to use transfer.--project-uuid); destination =--to-project-uuid.--to-project-uuidis omitted: fetches the store's projects and prompts you to pick one, excluding the source (mirrors the project picker used byproject link/deploy). Pass the flag for non-interactive/CI use.--waitto poll until it leavespending.Client:
transferDomain→POST /…/projects/{source}/domains/{domain}/transferwith{ new_project_uuid }. Clear errors useUserActionableError(from #3088, now merged) so a bad destination or "no other projects" prints plainly without the Correlation ID / support framing; API 4xx errors flow through the sharedassertDomainResponse.Pre-flight ownership check (follow-up)
transfermoves a domain from the linked (source) project. If the linked project doesn't own the domain, the API rejected the transfer with an opaquedomain is not owned by the specified projecterror — and only after the user had already picked a destination. Added afindDomainclient (agetDomainthat returnsnullon a 404 instead of throwing) and a pre-flight that runs before the destination prompt: it confirms the domain is on the source project.When the linked project doesn't own the domain, the pre-flight now scans the store's other projects and names the one that actually owns it, printing the exact
--project-uuidcommand to re-run. (An earlier version pointed users atdomains list, which is dead-end guidance —listonly shows the current project's domains, so it can never surface a domain that lives elsewhere.) If no project in the store owns it, it says so and points atdomains claimfor the cross-store case. The transfer is never attempted and the picker never opens on failure.Logging polish (follow-up)
formatOptions: { date: false }). It added noise, and on long lines consola couldn't right-align it so it fell back to an inline[time]prefix that broke copy-pasteable command suggestions. Thelogscommand is unaffected — its timestamps come from the log payload, not consola's clock.add/claim"already in use" branches now print on their own unprefixedconsola.logline, so they stay clean to copy at any terminal width.Testing
pnpm typecheck,pnpm lint,domains.spec.ts(43 passing, incl. transfer + pre-flight). New tests: request shape;--to-project-uuid(no prompt); interactive selection excludes the source; destination==source rejected; no-other-projects error;findDomainreturns/null/throws; transfer names the owning project (and never calls the API or prompts) when the domain is on a different project; transfer errors when the domain is on no project in the store. Verifieddomains transfer --helpand timestamp-free output on the built CLI.Migration
None. Docs: documented in docs-v2 #332 (alongside
claim).