Skip to content
Development
Skill

/ts-packaging

Use when publishing a TypeScript library — exports map, JSR vs npm, dual ESM/CJS, type validation, provenance. Not for application deployment.

From plugin
fusengine-claude-plugins
34200 skills40 agents34 commands

Claude Code

$ npx -y skills add fusengine/claude-plugins --skill ts-packaging --agent claude-code

SKILL.md

ts-packaging.SKILL.md
name: ts-packaging
description: Use when publishing a TypeScript library — exports map, JSR vs npm, dual ESM/CJS, type validation, provenance. Not for application deployment.
versions:
  node: "26"
  attw: "0.18.5"
user-invocable: true
references: references/exports-map.md, references/jsr-publishing.md, references/npm-publishing.md, references/validation.md, references/templates/package-json-dual.md, references/templates/jsr-json.md, references/templates/publish-workflow.md
related-skills: solid-generic, ts-testing

<objective> This skill covers shipping a TypeScript library correctly: designing the exports map and its conditions ordering (types first, default last), choosing JSR (ESM-only, publishes TS source directly, fixes 'slow types') versus npm (built .js + .d.ts, optionally dual ESM/CJS for CommonJS consumers), validating resolved types with arethetypeswrong (attw) before every publish, and enabling provenance on public releases via CI with id-token: write.

Out of scope: application deployment (not a library) and framework-owned build pipelines belong to the framework expert's own skills. </objective>

TypeScript Packaging

Ship a TypeScript library with a correct exports map, on the right registry.

Agent Workflow (MANDATORY)

Before ANY implementation, spawn 3 agents in parallel, one `Agent` call each with a `name`:

1. **fuse-ai-pilot:explore-codebase** - Inspect package.json, build output, targets 2. **fuse-ai-pilot:research-expert** - Verify latest JSR / npm / Node exports docs via Context7/Exa 3. **mcp__context7__query-docs** - Check conditions ordering, attw usage

After implementation, run **fuse-ai-pilot:sniper** for validation.

---

Overview

| Registry | Format | Publishes | Best for | |----------|--------|-----------|----------| | JSR | ESM only | TS **source** directly | Deno/Node/Bun libs, doc-rich APIs | | npm | ESM (or dual ESM/CJS) | Built `.js` + `.d.ts` | Broadest public reach, CJS consumers |

Rule of thumb: internal or Bun/Deno/ESM-only consumer → **ESM-pure**; broad public library still serving CommonJS → **dual ESM/CJS**.

---

Critical Rules

1. **`"types"` first, `"default"` last** - Conditions match in object order 2. **Match `import`↔ESM and `require`↔CJS** - Never point `require` at ESM 3. **One subpath per module** - Consistent specifier; set `"type": "module"` explicitly 4. **Validate with attw** - `arethetypeswrong` before every publish 5. **Provenance on public releases** - Publish from CI with `id-token: write`

---

Decision Guide

Publishing a TS library?
├── Consumers on Deno/Bun/Node ESM, want source + docs → JSR (ESM only)
│   └── Fix "slow types" (explicit return/prop/const types)
└── Public npm audience
    ├── ESM-only consumers → ESM-pure package.json
    └── Some consumers still on CJS → dual ESM/CJS exports

→ See `references/exports-map.md` for the conditions model

---

Reference Guide

Concepts

| Topic | Reference | Load when | |-------|-----------|-----------| | Exports map & conditions | `references/exports-map.md` | Writing the `exports` field | | JSR publishing | `references/jsr-publishing.md` | Publishing TS source to JSR | | npm publishing | `references/npm-publishing.md` | Publishing to npm (dual/ESM) | | Type validation | `references/validation.md` | Checking types resolve correctly |

Templates

| Template | Use Case | |----------|----------| | `references/templates/package-json-dual.md` | Dual ESM/CJS + ESM-pure package.json | | `references/templates/jsr-json.md` | jsr.json with multi-entry exports | | `references/templates/publish-workflow.md` | GitHub Actions release with provenance |

---

Quick Start

Modern exports (ESM-pure)

{
  "type": "module",
  "exports": {
    ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
  }
}

Validate before publish

npx @arethetypeswrong/cli --pack

→ See `references/validation.md`

---

Best Practices

DO

  • Set `"type"` explicitly, even for CJS packages
  • Provide `types` in every conditional branch
  • Publish from CI so provenance is automatic

DON'T

  • Ship dual CJS when every consumer is ESM (dead weight)
  • Order `"default"` before `"types"` (breaks type resolution)
  • Use `--allow-slow-types` on JSR as a habit (degrades docs + npm compat)
Read more
@fusengine
Ships withfusengine-claude-plugins

A plugin ecosystem that turns Claude Code into a supervised, multi-agent development environment.

34200 skills40 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
34
Star history of fusengine/agents on GitHub, a chart by star-history.com

Other skills on fusengine-claude-plugins.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about ts-packaging.

Which coding agents can use ts-packaging?
ts-packaging installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.