add-package
SKILL.md
Add Package
Overview
Use this skill to scaffold and standardize packages so they look and behave like the existing @remix-run/* packages.
Follow this exactly when creating package files, public exports, tests, and docs.
Workflow
- Create the package directory and baseline files.
- Create
packages/<package-name>/. - Add:
package.jsontsconfig.jsontsconfig.build.jsonCHANGELOG.mdREADME.mdLICENSE.changes/README.mdsrc/
- For new packages, start
CHANGELOG.mdwith## Unreleasedas the first section to indicate changes are not released yet.
- Set up
package.jsonusing monorepo conventions.
- Use:
name:@remix-run/<package-name>version(for brand-new packages):"0.0.0"type:"module"license:"MIT"repository.directory:packages/<package-name>homepage:https://github.com/remix-run/remix/tree/main/packages/<package-name>#readme
- Include
files:LICENSEREADME.mddistsrc!src/**/*.test.ts
- Add standard scripts:
build:tsgo -p tsconfig.build.jsonclean:git clean -fdXprepublishOnly:pnpm run buildtest:node --disable-warning=ExperimentalWarning --testtypecheck:tsgo --noEmit
- Use baseline dev dependencies:
"@types/node": "catalog:""@typescript/native-preview": "catalog:"
- Add
keywordslike existing packages (short, lowercase, feature-focused).
- Define exports with
srcentry files only.
- In
exports, map each public subpath to a dedicated file insrc. - Always include
./package.json. - Mirror each export in
publishConfig.exportswithdistoutput:types:./dist/<entry>.d.tsdefault:./dist/<entry>.js
- Rule: every export must have a
srcfile that re-exports fromsrc/lib.- Example: export
./foo->src/foo.ts->export { ... } from './lib/foo.ts'
- Example: export
- Add TypeScript config files with shared defaults.
Use this tsconfig.json pattern:
{
"compilerOptions": {
"strict": true,
"lib": ["ES2024", "DOM", "DOM.Iterable"],
"module": "ES2022",
"moduleResolution": "Bundler",
"target": "ESNext",
"allowImportingTsExtensions": true,
"rewriteRelativeImportExtensions": true,
"verbatimModuleSyntax": true
}
}
Use this tsconfig.build.json pattern:
{
"extends": "./tsconfig.json",
"compilerOptions": {
"declaration": true,
"declarationMap": true,
"outDir": "./dist"
},
"include": ["src"],
"exclude": ["src/**/*.test.ts"]
}
- Implement source structure and test setup.
- Structure source as:
src/<entry>.tsfor public entry pointssrc/lib/*.tsfor implementationsrc/lib/*.test.tsfor tests (colocated with implementation)
- Tests use Node's built-in test runner:
import * as assert from 'node:assert/strict'import { describe, it } from 'node:test'
- Keep tests IDE-friendly:
- Do not generate tests with loops/conditionals inside
describe().
- Do not generate tests with loops/conditionals inside
- Follow monorepo code style rules while implementing.
- Use
import type { ... }andexport type { ... }for types. - Include
.tsextensions in relative imports. - Prefer
letfor locals; useconstonly at module scope. - Never use
var. - Prefer function declarations/expressions for normal functions.
- Use arrow functions for callbacks; use concise callbacks when returning a single expression.
- Use object method shorthand (
method() {}) instead of arrow properties. - Use native class fields and
#privatemembers. - Avoid Node-specific APIs when Web APIs are available.
- Write README in the same style and section order as existing packages.
- Start with:
# <package-name>- One short paragraph describing purpose.
- Typical section order:
## Features## Installation## Usage- Optional deep-dive sections (only if needed)
## Related Packages(if applicable)## License
- Installation instructions must always include installing the
remixpackage. - If using the package requires a peer dependency, installation instructions must also include that peer dependency in the command.
- Preferred installation pattern:
npm i remix
- Example when a peer dependency is required:
npm i remix <peer-dependency>
-
Usage examples must always import from
remixpackage exports, not from@remix-run/<package-name>directly. -
License section format:
See [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)
- Do not manually update the generated
remixpackage in PRs.
packages/remixis generated automatically in CI.- Do not manually edit
packages/remix/package.jsonorpackages/remix/src/*in new pull requests. - Do not add
packages/remix/.changes/*change files in new pull requests. - If user asks for full surfacing, you can still update root
README.mdpackage list when applicable.
- Validate before finishing.
- Run package checks:
pnpm --filter @remix-run/<package-name> run typecheckpnpm --filter @remix-run/<package-name> run testpnpm --filter @remix-run/<package-name> run build
- Run repo lint (required):
pnpm run lint
- Add or update a change file under
packages/<package-name>/.changes/when requested by contribution workflow. - For a brand-new package, the initial change file should use a
minor.filename (for example,minor.initial-release.md) so the first release bumps0.0.0to0.1.0. - Exception: do not add a change file under
packages/remix/.changes/;remixpackage updates are CI-generated.
Templates
Use this minimal src/index.ts style:
export { createThing, type ThingOptions } from './lib/thing.ts'
Use this minimal test style:
import * as assert from 'node:assert/strict'
import { describe, it } from 'node:test'
import { createThing } from './thing.ts'
describe('createThing', () => {
it('returns expected value', () => {
let result = createThing()
assert.equal(result, 'ok')
})
})
Weekly Installs
1
Repository
remix-run/remixGitHub Stars
32.5K
First Seen
1 day ago
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1