JavaScript/TypeScript Conventions
Apply these conventions when JavaScript, TypeScript, Node.js tooling, or
package.json is the primary workstream.
Dispatch
| $ARGUMENTS |
Action |
| Active (auto-invoked when JS/TS work is primary) |
Apply the operator contract below |
| Empty |
Display the convention summary and routing guidance |
check |
Verify tooling compliance only |
Reference File Index
| File |
Purpose |
When to Read |
references/tooling-contract.md |
Required package-manager, command, CI, workspace, and package-root rules |
Package commands, scripts, dependencies, lockfiles, or CI |
references/redirection-boundaries.md |
When JS/TS conventions should yield to Python, shell, CI, or framework-specific skills |
Mixed-language or ambiguous work |
references/edge-cases.md |
Exception gates for npm/yarn, Corepack, generated apps, and migrations |
Deviations from pnpm defaults |
references/typescript-patterns.md |
TypeScript config, narrowing, type guards, unions, and type-test patterns |
TypeScript code or tsconfig.json |
references/eslint-prettier.md |
ESLint flat config, typed linting, and Prettier separation |
Linting or formatting changes |
Operator Contract
Active
- Apply this skill only when JS/TS files, Node tooling, or
package.json are the primary surface of the task.
- Read
references/redirection-boundaries.md when JS/TS appears alongside Python, shell, CI, or framework-specific work.
- Enforce the hard requirements in
references/tooling-contract.md for package management, package-root selection, command execution, lockfiles, workspaces, and CI installs.
- Check
references/edge-cases.md before recommending npm, yarn, global package managers, Corepack assumptions, or lockfile migrations.
- Read
references/typescript-patterns.md for TypeScript config or type-safety changes.
- Read
references/eslint-prettier.md for linting, typed linting, or formatting changes.
- Use guided preferences only when starting new work or when the repo does not already have a stronger local convention.
Empty / Help
- Summarize the hard requirements:
pnpm, packageManager, pnpm-lock.yaml, pnpm install --frozen-lockfile, pnpm exec, pnpm dlx, tsc --noEmit, eslint, and prettier.
- Show the difference between hard requirements and guided preferences.
- Point to the exact reference files for tooling, exceptions, TypeScript, lint/format, and mixed-language routing.
check
- Verify JS/TS tooling compliance only; do not widen into implementation advice unless the user asks.
- Report whether the project uses the expected package root,
pnpm, packageManager, pnpm-lock.yaml, workspace config, scripts, tsconfig.json, ESLint flat config, and Prettier.
- Flag npm/yarn/Corepack/legacy deviations and require the reason to match
references/edge-cases.md.
- Reject recommendations that replace repo-required tooling with
npm install, npx, or ad hoc global binaries unless an exception is documented.
Hard Requirements
- Package manager: use
pnpm for JS/TS package operations unless an exception is documented.
- Package manager pin: honor the nearest owning
package.json and its packageManager field.
- Lockfile: commit
pnpm-lock.yaml; never mix lockfiles in one package root without a migration plan.
- Install: use
pnpm install; use pnpm install --frozen-lockfile in CI.
- Dependencies: use
pnpm add <pkg> or pnpm add -D <pkg> from the owning package root.
- Local binaries: use
pnpm exec <cmd>; use pnpm dlx <pkg> only for one-off registry execution.
- Scripts: use
pnpm run <script> or pnpm --filter <pkg> run <script>.
- Type checking: use
pnpm exec tsc --noEmit or the repo's package script.
- Linting: use ESLint flat config for new ESLint setup.
- Formatting: use Prettier for formatting and ESLint for code-quality rules.
Guided Preferences
When starting new JS/TS work and no stronger local constraint exists, prefer
these tools. These are defaults, not absolute law; check
references/edge-cases.md before overriding an established project choice.
| Purpose |
Tool |
Notes |
| Package manager |
pnpm |
Pin through packageManager when the package root owns package.json |
| Bundler |
vite or esbuild |
Respect framework-owned builders first |
| Linting |
eslint |
Use flat config for new setup |
| Formatting |
prettier |
Keep formatting separate from linting |
| Testing |
vitest or framework-native runner |
Prefer existing repo scripts |
| Type checking |
tsc --noEmit |
Run through pnpm exec or package scripts |
TypeScript Type Safety
- Prefer
unknown over any; do not weaken established strictness to make code compile.
- Prefer
interface for object shapes and type for unions, intersections, and mapped types.
- Use discriminated unions for state machines and tagged variants.
- Use
as const and satisfies to preserve literal inference without unsafe assertions.
- Avoid type assertions (
as); prefer type guards, assertion functions, and schema validation at boundaries.
- Enable
strict in new TypeScript projects and add stricter options when the repo can absorb them.
- Test negative type behavior with
@ts-expect-error or a type-test tool when type contracts are public.
- See
references/typescript-patterns.md for TSConfig, module-resolution, and narrowing patterns.
Critical Rules
- Require
pnpm for JS/TS dependency changes unless references/edge-cases.md justifies npm, yarn, or another manager.
- Resolve the owning package root before running package commands; do not assume the repository root owns every JS/TS file.
- Never mix
pnpm-lock.yaml, package-lock.json, and yarn.lock in the same package root outside a dedicated migration.
- Run CI installs with
pnpm install --frozen-lockfile when a pnpm-lock.yaml is present.
- Use
pnpm exec for local binaries and pnpm dlx only for one-off packages fetched from the registry.
- Do not assume Corepack is bundled with the active Node.js runtime; check
references/edge-cases.md before recommending Corepack setup.
- Keep Prettier responsible for formatting and ESLint responsible for code-quality rules.
- Redirect mixed-language or non-JS-primary work through
references/redirection-boundaries.md instead of force-fitting this skill onto the whole task.
Scaling Strategy
- Incidental JS/TS file in a broader non-JS task: enforce only the hard requirements that touch the JS/TS-owned surface, then route mixed-workflow questions through
references/redirection-boundaries.md.
- JS/TS-primary feature or refactor work: apply the full operator contract, including tooling, TypeScript, linting, formatting, and test guidance where relevant.
- Repo-wide JS/TS tooling or migration work: use
check, references/tooling-contract.md, and references/edge-cases.md to separate hard violations from documented transition paths.
Progressive Disclosure
- Do not load every reference by default.
- Read
references/tooling-contract.md first for command, dependency, package-root, workspace, lockfile, or CI questions.
- Read
references/redirection-boundaries.md when Python, shell, CI, infra, or framework-specific work is mixed into the request.
- Read
references/edge-cases.md only when the task appears to require npm, yarn, Corepack setup, generated app scaffolding, or lockfile migration exceptions.
- Read
references/typescript-patterns.md only when TypeScript code, tsconfig.json, public types, or type tests are active.
- Read
references/eslint-prettier.md only when the task touches linting, typed linting, or formatting.
Scope Boundaries
IS for: JS/TS tooling conventions, Node package commands, dependency-management rules, TypeScript type-safety defaults, lint/format/test command guidance, and exception-aware repo guidance.
NOT for: Python conventions, shell conventions, CI pipeline design, framework architecture, backend-only implementation strategy, or broad frontend UX/design guidance.
Canonical terms (use these exactly):
pnpm -- the required package manager for JS/TS package operations
package root -- the nearest directory whose package.json owns the command or dependency
packageManager -- the package.json field that pins the package manager and version
pnpm-lock.yaml -- the canonical JS/TS lockfile for pnpm package roots
workspace -- pnpm workspace declared by pnpm-workspace.yaml
frozen-lockfile -- CI install mode that prevents lockfile mutation
pnpm exec -- local project binary execution
pnpm dlx -- one-off package execution from the registry
Validation Contract
Run from this skill directory before declaring changes complete:
python scripts/check.py
git diff --check
Completion criteria:
scripts/check.py exits 0.
git diff --check exits 0.
- No portable-CLI violations remain under this skill directory.
After changing skill definitions, public descriptions, reference files, or eval behavior, invoke docs-steward if available.
1---2name: javascript-conventions3description: Configure and validate JS/TS tooling conventions. Enforce pnpm, TypeScript, ESLint, and Prettier defaults. Use when working on JS/TS files or package.json. NOT for Python, backend-only, or shell scripts.4license: MIT5---67# JavaScript/TypeScript Conventions89Apply these conventions when JavaScript, TypeScript, Node.js tooling, or10`package.json` is the primary workstream.1112## Dispatch1314| $ARGUMENTS | Action |15|------------|--------|16| Active (auto-invoked when JS/TS work is primary) | Apply the operator contract below |17| Empty | Display the convention summary and routing guidance |18| `check` | Verify tooling compliance only |1920## Reference File Index2122| File | Purpose | When to Read |23|------|---------|--------------|24| `references/tooling-contract.md` | Required package-manager, command, CI, workspace, and package-root rules | Package commands, scripts, dependencies, lockfiles, or CI |25| `references/redirection-boundaries.md` | When JS/TS conventions should yield to Python, shell, CI, or framework-specific skills | Mixed-language or ambiguous work |26| `references/edge-cases.md` | Exception gates for npm/yarn, Corepack, generated apps, and migrations | Deviations from pnpm defaults |27| `references/typescript-patterns.md` | TypeScript config, narrowing, type guards, unions, and type-test patterns | TypeScript code or `tsconfig.json` |28| `references/eslint-prettier.md` | ESLint flat config, typed linting, and Prettier separation | Linting or formatting changes |2930## Operator Contract3132### Active33341. Apply this skill only when JS/TS files, Node tooling, or `package.json` are the primary surface of the task.352. Read `references/redirection-boundaries.md` when JS/TS appears alongside Python, shell, CI, or framework-specific work.363. Enforce the hard requirements in `references/tooling-contract.md` for package management, package-root selection, command execution, lockfiles, workspaces, and CI installs.374. Check `references/edge-cases.md` before recommending npm, yarn, global package managers, Corepack assumptions, or lockfile migrations.385. Read `references/typescript-patterns.md` for TypeScript config or type-safety changes.396. Read `references/eslint-prettier.md` for linting, typed linting, or formatting changes.407. Use guided preferences only when starting new work or when the repo does not already have a stronger local convention.4142### Empty / Help43441. Summarize the hard requirements: `pnpm`, `packageManager`, `pnpm-lock.yaml`, `pnpm install --frozen-lockfile`, `pnpm exec`, `pnpm dlx`, `tsc --noEmit`, `eslint`, and `prettier`.452. Show the difference between hard requirements and guided preferences.463. Point to the exact reference files for tooling, exceptions, TypeScript, lint/format, and mixed-language routing.4748### `check`49501. Verify JS/TS tooling compliance only; do not widen into implementation advice unless the user asks.512. Report whether the project uses the expected package root, `pnpm`, `packageManager`, `pnpm-lock.yaml`, workspace config, scripts, `tsconfig.json`, ESLint flat config, and Prettier.523. Flag npm/yarn/Corepack/legacy deviations and require the reason to match `references/edge-cases.md`.534. Reject recommendations that replace repo-required tooling with `npm install`, `npx`, or ad hoc global binaries unless an exception is documented.5455## Hard Requirements5657- **Package manager**: use `pnpm` for JS/TS package operations unless an exception is documented.58- **Package manager pin**: honor the nearest owning `package.json` and its `packageManager` field.59- **Lockfile**: commit `pnpm-lock.yaml`; never mix lockfiles in one package root without a migration plan.60- **Install**: use `pnpm install`; use `pnpm install --frozen-lockfile` in CI.61- **Dependencies**: use `pnpm add <pkg>` or `pnpm add -D <pkg>` from the owning package root.62- **Local binaries**: use `pnpm exec <cmd>`; use `pnpm dlx <pkg>` only for one-off registry execution.63- **Scripts**: use `pnpm run <script>` or `pnpm --filter <pkg> run <script>`.64- **Type checking**: use `pnpm exec tsc --noEmit` or the repo's package script.65- **Linting**: use ESLint flat config for new ESLint setup.66- **Formatting**: use Prettier for formatting and ESLint for code-quality rules.6768## Guided Preferences6970When starting new JS/TS work and no stronger local constraint exists, prefer71these tools. These are defaults, not absolute law; check72`references/edge-cases.md` before overriding an established project choice.7374| Purpose | Tool | Notes |75|---------|------|-------|76| Package manager | `pnpm` | Pin through `packageManager` when the package root owns `package.json` |77| Bundler | `vite` or `esbuild` | Respect framework-owned builders first |78| Linting | `eslint` | Use flat config for new setup |79| Formatting | `prettier` | Keep formatting separate from linting |80| Testing | `vitest` or framework-native runner | Prefer existing repo scripts |81| Type checking | `tsc --noEmit` | Run through `pnpm exec` or package scripts |8283## TypeScript Type Safety84851. Prefer `unknown` over `any`; do not weaken established strictness to make code compile.862. Prefer `interface` for object shapes and `type` for unions, intersections, and mapped types.873. Use discriminated unions for state machines and tagged variants.884. Use `as const` and `satisfies` to preserve literal inference without unsafe assertions.895. Avoid type assertions (`as`); prefer type guards, assertion functions, and schema validation at boundaries.906. Enable `strict` in new TypeScript projects and add stricter options when the repo can absorb them.917. Test negative type behavior with `@ts-expect-error` or a type-test tool when type contracts are public.928. See `references/typescript-patterns.md` for TSConfig, module-resolution, and narrowing patterns.9394## Critical Rules95961. Require `pnpm` for JS/TS dependency changes unless `references/edge-cases.md` justifies npm, yarn, or another manager.972. Resolve the owning package root before running package commands; do not assume the repository root owns every JS/TS file.983. Never mix `pnpm-lock.yaml`, `package-lock.json`, and `yarn.lock` in the same package root outside a dedicated migration.994. Run CI installs with `pnpm install --frozen-lockfile` when a `pnpm-lock.yaml` is present.1005. Use `pnpm exec` for local binaries and `pnpm dlx` only for one-off packages fetched from the registry.1016. Do not assume Corepack is bundled with the active Node.js runtime; check `references/edge-cases.md` before recommending Corepack setup.1027. Keep Prettier responsible for formatting and ESLint responsible for code-quality rules.1038. Redirect mixed-language or non-JS-primary work through `references/redirection-boundaries.md` instead of force-fitting this skill onto the whole task.104105## Scaling Strategy106107- Incidental JS/TS file in a broader non-JS task: enforce only the hard requirements that touch the JS/TS-owned surface, then route mixed-workflow questions through `references/redirection-boundaries.md`.108- JS/TS-primary feature or refactor work: apply the full operator contract, including tooling, TypeScript, linting, formatting, and test guidance where relevant.109- Repo-wide JS/TS tooling or migration work: use `check`, `references/tooling-contract.md`, and `references/edge-cases.md` to separate hard violations from documented transition paths.110111## Progressive Disclosure112113- Do not load every reference by default.114- Read `references/tooling-contract.md` first for command, dependency, package-root, workspace, lockfile, or CI questions.115- Read `references/redirection-boundaries.md` when Python, shell, CI, infra, or framework-specific work is mixed into the request.116- Read `references/edge-cases.md` only when the task appears to require npm, yarn, Corepack setup, generated app scaffolding, or lockfile migration exceptions.117- Read `references/typescript-patterns.md` only when TypeScript code, `tsconfig.json`, public types, or type tests are active.118- Read `references/eslint-prettier.md` only when the task touches linting, typed linting, or formatting.119120## Scope Boundaries121122**IS for:** JS/TS tooling conventions, Node package commands, dependency-management rules, TypeScript type-safety defaults, lint/format/test command guidance, and exception-aware repo guidance.123124**NOT for:** Python conventions, shell conventions, CI pipeline design, framework architecture, backend-only implementation strategy, or broad frontend UX/design guidance.125126**Canonical terms** (use these exactly):127- `pnpm` -- the required package manager for JS/TS package operations128- `package root` -- the nearest directory whose `package.json` owns the command or dependency129- `packageManager` -- the `package.json` field that pins the package manager and version130- `pnpm-lock.yaml` -- the canonical JS/TS lockfile for pnpm package roots131- `workspace` -- pnpm workspace declared by `pnpm-workspace.yaml`132- `frozen-lockfile` -- CI install mode that prevents lockfile mutation133- `pnpm exec` -- local project binary execution134- `pnpm dlx` -- one-off package execution from the registry135136## Validation Contract137138Run from this skill directory before declaring changes complete:139140```bash141python scripts/check.py142git diff --check143```144145Completion criteria:1461471. `scripts/check.py` exits 0.1482. `git diff --check` exits 0.1493. No portable-CLI violations remain under this skill directory.150151After changing skill definitions, public descriptions, reference files, or eval behavior, invoke `docs-steward` if available.