tsdown-migrate SkillSAFE
The elegant bundler for libraries powered by Rolldown
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Agent skill that teaches AI coding agents how to migrate projects from tsup to tsdown.
Installation
This skill is included when you install the tsdown skills:
npx skills add rolldown/tsdown
Or install it separately:
npx skills add rolldown/tsdown --skill tsdown-migrate
What's Included
This skill provides AI agents with complete knowledge to perform tsup→tsdown migrations:
- Option Mappings - Every tsup option and its tsdown equivalent
- Config Transformations - File renames, import changes, value transforms
- Default Differences - What changed between tsup and tsdown defaults
- Unsupported Options - What to remove and what alternatives exist
- Package.json Migration - Dependency, script, and config field changes
- New Features - tsdown-exclusive features to suggest after migration
Usage
Once installed, AI agents will use this knowledge when:
- Migrating tsup projects to tsdown
- Explaining differences between tsup and tsdown
- Troubleshooting post-migration build issues
- Advising on tsdown configuration after migration
Example Prompts
Migrate my tsup project to tsdown
What are the differences between tsup and tsdown options?
Convert my tsup.config.ts to tsdown format
My build broke after migrating from tsup — help me fix it
Documentation
Related Skills
- tsdown - Core tsdown skill for building and configuring TypeScript libraries
License
MIT
2a751fd2ff3aOBSERVED · 2026-10-21Install
Commands as the repository documents them. They are shown, not run.
npx skills add rolldown/tsdown
npx skills add rolldown/tsdown --skill tsdown-migrate
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: tsdown-migrate description: Migrate TypeScript library projects from tsup to tsdown. Provides complete option mappings, config transformation rules, default value differences, and unsupported option alternatives so AI agents can intelligently perform migrations. --- # Migrating from tsup to tsdown Knowledge base for AI agents to migrate tsup projects to tsdown — the Rolldown-powered library bundler. ## Target Version: Two-Stage Migration tsdown v0.23 removed all previously-deprecated tsup compatibility options — `bundle`, `outExtension`, `publicDir`, `removeNodeProtocol`, `injectStyle`, and `skipNodeModulesBundle` are no longer recognized. They fail TypeScript type checking and are **silently ignored at runtime**, so a missed mapping on v0.23+ produces wrong output without any error. Migrating directly to v0.23+ is therefore unsafe. tsdown **v0.22.14** is the last version that still accepts these options and flags each one with a deprecation warning, making it the safe migration checkpoint. Migrate in **two stages**: 1. **Stage 1 — migrate on `[email protected]`**: Install `[email protected]`, migrate the config per the tables below, run a build, and resolve **every** deprecation warning by mapping each flagged tsup option to its real tsdown equivalent. The warnings are the completeness check — the migration is not done until the build produces **zero warnings**. 2. **Stage 2 — upgrade to the latest tsdown (`^0.23.0` or newer)**: Only after a warning-free build on 0.22.14. Since the config no longer uses any removed compat options, the silent-ignore behavior of v0.23+ is no longer a risk. ## Runtime Requirement `tsdown` requires **Node.js `^22.18.0 || ^24.11.0 || >=26.0.0` to run** (build-time only) — that is, Node.js 22.18+, 24.11+, or 26+. Odd-numbered and EOL release lines (e.g. Node.js 23, 25) are not supported. The bundled output can still target lower Node.js versions via the [`target`](../tsdown/references/option-target.md) option, so a library that previously supported Node.js 18 / 20 with tsup can continue to do so after migrating. Recommended workflow when supporting Node.js 18 / 20: - **Build with Node.js 22+ in CI**, setting an explicit `target` such as `'node18'` or `'node20'`. - **Test the built output (or the packed tarball) on the lower Node.js versions** you need to support. ## When to Use - Migrating a project from tsup to tsdown - Understanding differences between tsup and tsdown options - Reviewing or fixing post-migration configuration issues - Advising users on tsup→tsdown compatibility ## Migration Overview Follow these steps to migrate a tsup project: 1. **Rename config file**: `tsup.config.*` → `tsdown.config.*` 2. **Update imports**: `'tsup'` → `'tsdown'` 3. **Apply option mappings**: Rename/transform options per tables below 4. **Preserve tsup defaults**: Explicitly set options that differ (format, clean, dts, target) 5. **Update package.json**: Dependencies (Stage 1: `[email protected]`), scripts, root config field 6. **Remove unsupported options**: Replace with alternatives where available 7. **Test build on 0.22.14**: Run `tsdown` and resolve every deprecation warning — zero warnings required 8. **Upgrade to latest tsdown** (`^0.23.0` or newer) and verify the build again ## Config File Migration ### File Rename | tsup | tsdown | |------|--------| | `tsup.config.ts` | `tsdown.config.ts` | | `tsup.config.cts` | `tsdown.config.cts` | | `tsup.config.mts` | `tsdown.config.mts` | | `tsup.config.js` | `tsdown.config.js` | | `tsup.config.cjs` | `tsdown.config.cjs` | | `tsup.config.mjs` | `tsdown.config.mjs` | | `tsup.config.json` | `tsdown.config.json` | ### Import and Identifier Changes ```ts // Before import { defineConfig } from 'tsup' // After import { defineConfig } from 'tsdown' ``` Replace all identifiers: `tsup` → `tsdown`, `TSUP` → `TSDOWN`. ## Option Mappings ### Property Renames | tsup | tsdown | Notes | |------|--------|-------| | `entryPoints` | `entry` | Also deprecated in tsup itself | | `cjsInterop` | `cjsDefault` | CJS default export handling | | `esbuildPlugins` | `plugins` | Now uses Rolldown/Unplugin plugins | | `outExtension` | `outExtensions` | Custom output extensions | | `publicDir` | `copy` | Copy static files to output | | `bundle: true` | _(remove)_ | Bundle is default behavior | | `bundle: false` | `unbundle: true` | Preserve file structure | | `removeNodeProtocol: true` | `nodeProtocol: 'strip'` | Strip `node:` prefix | | `injectStyle: true` | `css: { inject: true }` | CSS injection | | `injectStyle: false` | _(remove)_ | Default behavior | | `skipNodeModulesBundle` | `deps: { neverBundle: true }` | Externalize all dependencies | None of the old names are recognized by tsdown v0.23+ — always emit the new names. The compatibility options (`outExtension`, `skipNodeModulesBundle`, `publicDir`, `bundle`, `removeNodeProtocol`, `injectStyle`) were accepted with deprecation warnings up to v0.22.14 and removed entirely in v0.23; on v0.23+ leftovers are silently ignored, not errors, so builds misbehave without warning. This is why Stage 1 runs on v0.22.14, where every leftover is flagged. ### Deprecated but Still Accepted `external` and `noExternal` are the **only** tsup option names tsdown v0.23 still accepts. They emit deprecation warnings, will be removed in a future version, and cannot be combined with their replacements (mixing `external` with `deps.neverBundle`, or `noExternal` with `deps.alwaysBundle`, throws an error). Always emit the replacements. | tsup (deprecated) | tsdown (preferred) | Notes | |--------------------|--------------------|-------| | `external: [...]` | `deps: { neverBundle: [...] }` | Moved to deps namespace | | `noExternal: [...]` | `deps: { alwaysBundle: [...] }` | Moved to deps namespace | ### Output Filename Differences For IIFE builds, `tsdown` emits names like `[name].iife.js`, while `tsup` commonly emitted `[name].global.js`. `outExtensions` customizes extensions or suffixes, but it
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | NA |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
2a751fd2ff3afull audit observations/trust-audit/skill/rolldown__tsdown-migrate.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-21 | 2a751fd2ff3a | SAFE | B | 89 | first audit |
Questions
What does the tsdown-migrate — rolldown/tsdown skill do?
The elegant bundler for libraries powered by Rolldown
Is tsdown-migrate — rolldown/tsdown safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can tsdown-migrate — rolldown/tsdown access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
How current is this page?
The grade is for one exact copy of the source (2a751fd2ff3a), read on 2026-10-21. The repository is watched, and a new audit runs when it changes — this is the first audit.
Add this badge to your README
Shows this page's audit result and links back to it. It updates when the audit does.
[](https://modelsatlas.com/skills/rolldown/tsdown-migrate/)
Not your listing, or something out of date? Claim or update your listing.