skills/tldraw-migrate/README.md
Note: Are you human? You should probably not be. Pass a link to this file to your agent of choice and have them take it from here.
A portable agent skill that walks an AI coding agent through upgrading a project to a newer version of the tldraw SDK.
This README documents distribution and installation. The skill itself lives in SKILL.md.
The canonical source of truth is skills/tldraw-migrate/ on main in the tldraw monorepo. Distribute the skill by copying the entire folder into the agent-skills directory of the project being migrated. The skill is self-contained — SKILL.md, the three .mjs helpers, and a references/ cache.
Copy skills/tldraw-migrate/ into one of the following paths in the target project. The skill probes them in this order and uses the first one it finds:
| Path | Harness |
|---|---|
.claude/skills/tldraw-migrate/ | Claude Code |
.agents/skills/tldraw-migrate/ | Generic / open agent-skills spec |
.codex/skills/tldraw-migrate/ | OpenAI Codex |
.cursor/skills/tldraw-migrate/ | Cursor |
skills/tldraw-migrate/ | Fallback / vendored alongside source |
If multiple harnesses share a project, install once and symlink the others to the same folder (this is what the tldraw monorepo itself does — see AGENTS.md).
DEST=.claude/skills/tldraw-migrate # or .agents/skills/tldraw-migrate, .cursor/skills/tldraw-migrate, etc.
mkdir -p "$DEST"
curl -fsSL https://github.com/tldraw/tldraw/archive/refs/heads/main.tar.gz \
| tar -xz --strip-components=3 -C "$DEST" tldraw-main/skills/tldraw-migrate
The skill changes whenever migration patterns shift in the SDK (new error categories, new helpers, edge-case fixes). Re-run the one-shot install command above to overwrite SKILL.md and the helper scripts, or pull the latest from tldraw/tldraw main. The skill's content — release notes and docs — is auto-refreshed on every invocation, so updating SKILL.md itself is only needed when the workflow changes.
If the skill is installed somewhere outside the probed locations, export SKILL_DIR before invocation:
SKILL_DIR=/abs/path/to/tldraw-migrate
The auto-fetch blocks and all internal grep examples honor this variable.
detect-versions.mjs, detect-target.mjs, fetch-release-notes.mjs). No npm dependencies — they are zero-dep ES modules.curl for the docs fetch.git is optional but improves from-version detection (the skill compares main, HEAD~1, and the working tree).GITHUB_TOKEN env var is optional; setting it raises the unauthenticated GitHub API rate limit (60/hr) so re-runs and long version ranges don't fail.The skill writes three files into references/ at run time. None of them is committed to the skill's source — they are recreated on demand.
| File | Source | When fetched |
|---|---|---|
tldraw-releases.txt | github.com/tldraw/tldraw → apps/docs/content/releases/v*.mdx, filtered to versions strictly greater than the detected from-version | Always |
tldraw-full-docs.txt | tldraw.dev/llms-full.txt | Cached locally, 30-day TTL — delete the file or wait 30 days to refresh |
tldraw-next.mdx | github.com/tldraw/tldraw → apps/docs/content/releases/next.mdx | Pre-release targets only (canary, next, beta, or pre-release semver) |
GitHub is the source of truth, deliberately. next.mdx does not exist on npm, and tldraw.dev can lag behind main. This means migration recipes for unreleased versions are available to the skill the moment they land in main.
The !-prefix bash blocks at the top of SKILL.md are written for Claude Code's auto-execute syntax. Other harnesses (Cursor, Codex, plain Claude API, etc.) must run each block as a shell command before continuing the workflow. The skill flags this explicitly at the top of the resources section.
For agent harnesses without slash-command support, the skill still works as a plain workflow document — point the agent at SKILL.md and the same step-by-step process applies.
SKILL.md — the skill workflow itselfdetect-versions.mjs — resolves the from-version (explicit arg → main → HEAD~1 → working tree)detect-target.mjs — resolves the target version (default latest; accepts a dist-tag or semver)fetch-release-notes.mjs — pulls release notes between two versions from tldraw/tldraw mainreferences/ — auto-populated cache of fetched references (gitignored or freshly recreated)README.md — this file