npx skills add ...
npx skills add theorcdev/skills --skill github-to-origin
Agent runbook for moving a repository from GitHub to Cursor Origin code hosting, including repointing Vercel so production keeps deploying. The agent executes every step itself and verifies each one. Use when the user wants to move, migrate, or switch a repo to Origin, mentions Cursor Origin hosting, says "move to origin", or asks why pushes to Origin are not deploying.
npx skills add theorcdev/skills --skill github-to-origin
You are the agent. The user says "move this repo to Origin" and you do the rest: run the commands, verify every step with another command, and report what you proved, not what you assume. Ask the user only for the inputs below and at the two moments where a human is unavoidable.
The code move is the easy half. The half that breaks things is Vercel: a repo can be on Origin while production still builds from GitHub, so pushes appear to succeed and the live site silently stops updating.
Mirror status: inbound in origin repo view. Mirrors even accept
pushes, so a successful push proves nothing about who is authoritative.acme/site. If the user is unsure, run
origin repo list and show them the candidates.www.acme.com. You will use it to find the right
Vercel project, so do not guess it.origin auth login opens a browser the user must complete.Everything else is yours. Do not hand the user a command you can run yourself.
Origin needs a paid Cursor plan and is early beta. Uncommitted work in the tree is fine, but never commit it as part of the migration.
Capture what correct looks like so the migration can be proved later:
Run origin auth login in the background and let it live until it exits on its
own. Never wrap it in a timeout and never kill it: killing invalidates the
challenge and no token is stored, even if the user completed the browser step.
Verify, do not assume:
Login also installs a git credential helper for origin.cursor.com, so no
further git auth setup is needed.
Mirror status: inbound means synced mirror. Continue; step 6 converts it.origin repo create <org>/<repo>.Add Origin under a temporary name so the existing origin remote stays
untouched until the push is proved:
Only when nothing is missing:
Keeping GitHub as a named remote is what makes the migration reversible.
Until this is done, GitHub is still the source of truth.
At cursor.com/codebase/<org>/<repo>: Settings > General >
Danger Zone > Detach from GitHub, then type <org>/<repo> in the
confirm dialog. The dialog states the GitHub repo is not deleted.
Verify from the terminal:
This is the step that decides whether production updates.
Trap: do not let the CLI auto-link. vercel ls and vercel link in an
unlinked directory silently link by directory name, which can pick a similarly
named project that does not own the domain. Find the real project through the
domain instead:
Then repoint the Git connection:
Both subcommands exist (verified on Vercel CLI 46.1.0). The docs only promise
"a Git provider repository" and never name Origin, so if connect rejects the
URL, fall back to the dashboard: Project Settings > Git >
Connected Git Repository > Disconnect, then connect the Origin repo.
Always repoint the existing project. Never let the Origin Vercel app create a fresh project: the existing one holds the production domain, the environment variables, and the deployment history, and a new one starts with none of them.
Push a real commit to origin, then poll:
Do not verify by grepping the served HTML for markup you changed. Props passed from server components to client components do not reliably appear in the HTML, so that check reports failure for deploys that shipped fine. The CLI is the authority on which deployment is live.
Finish with a health sweep:
GitHub Actions only run on GitHub. After the cutover, every workflow in
.github/workflows/ stops firing, and nothing fails because nothing runs.
Origin runs existing workflows through Depot or Buildkite, connected from the
repo's Apps tab. Until one is connected, the only gate is whatever local
git hooks exist on the developer's machine. Tell the user this explicitly and
offer to set a replacement up.
origin auth status # expect: Token: validorigin repo view <org>/<repo>git remote add cursor https://origin.cursor.com/<org>/<repo>.git
git fetch cursor
git push --dry-run cursor main # proves writes are accepted
git push cursor --all
git tag | grep -q . && git push cursor --tagsgit fetch cursor --prune
for b in $(git branch --format='%(refname:short)'); do
git rev-parse --verify -q "cursor/$b" >/dev/null || echo "MISSING: $b"
done
git rev-parse main cursor/main # must print the same sha twicegit remote rename origin github
git remote rename cursor origin
git branch --set-upstream-to=origin/main mainorigin repo view <org>/<repo> # the Mirror status line must be gonevercel inspect https://<production-domain>
# read the "name" field: that project owns the domain
rm -rf .vercel
vercel link --yes --project <that-name>vercel git disconnect
vercel git connect https://origin.cursor.com/<org>/<repo>.gitvercel ls # note the newest Production deployment URLvercel ls # until a NEW Production deployment appears with status Ready
vercel inspect https://<production-domain>
# its "url" must equal the new deployment; "created" must be minutes agofor p in / <key routes>; do
curl -s -o /dev/null -w "%{http_code} $p\n" "https://<production-domain>$p"
done[ ] snapshot taken: branches, commits, head, root
[ ] origin auth status: Token valid
[ ] every branch verified present on Origin
[ ] remotes: origin -> Origin, github -> GitHub backup
[ ] detached: Mirror status line gone
[ ] Vercel project found via the domain, not auto-link
[ ] vercel git disconnect + connect done (or dashboard fallback)
[ ] new deployment proved live via vercel inspect
[ ] key routes return 200
[ ] user told CI is dark, replacement offered