javascript-conventions
Configure and validate JS/TS tooling conventions. Enforce pnpm, TypeScript, ESLint, and Prettier defaults. Use when working on JS/TS files or package.json.
Configure and validate JS/TS tooling conventions. Enforce pnpm, TypeScript, ESLint, and Prettier defaults. Use when working on JS/TS files or package.json.
Quick Start
Install:
npx skills add github:wyattowalsh/agents --skill javascript-conventions -y -g --agent antigravity --agent claude-code --agent codex --agent crush --agent cursor --agent gemini-cli --agent github-copilot --agent grok --agent opencode Use: /javascript-conventions
Works with Claude Code, Gemini CLI, OpenCode, and other agentskills.io-compatible agents.
What It Does
Section titled “What It Does”Apply these conventions when JavaScript, TypeScript, Node.js tooling, or package.json is the primary workstream.
| $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 |
Critical Rules
Section titled “Critical Rules”- Require
pnpmfor JS/TS dependency changes unlessreferences/edge-cases.mdjustifies 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, andyarn.lockin the same package root outside a dedicated migration. - Run CI installs with
pnpm install --frozen-lockfilewhen apnpm-lock.yamlis present. - Use
pnpm execfor local binaries andpnpm dlxonly for one-off packages fetched from the registry. - Do not assume Corepack is bundled with the active Node.js runtime; check
references/edge-cases.mdbefore 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.mdinstead of force-fitting this skill onto the whole task.
Operator Contract
Section titled “Operator Contract”Active
Section titled “Active”- Apply this skill only when JS/TS files, Node tooling, or
package.jsonare the primary surface of the task. - Read
references/redirection-boundaries.mdwhen JS/TS appears alongside Python, shell, CI, or framework-specific work. - Enforce the hard requirements in
references/tooling-contract.mdfor package management, package-root selection, command execution, lockfiles, workspaces, and CI installs. - Check
references/edge-cases.mdbefore recommending npm, yarn, global package managers, Corepack assumptions, or lockfile migrations. - Read
references/typescript-patterns.mdfor TypeScript config or type-safety changes. - Read
references/eslint-prettier.mdfor 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
Section titled “Empty / Help”- Summarize the hard requirements:
pnpm,packageManager,pnpm-lock.yaml,pnpm install --frozen-lockfile,pnpm exec,pnpm dlx,tsc --noEmit,eslint, andprettier. - 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.
- 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
Section titled “Hard Requirements”- Package manager: use
pnpmfor JS/TS package operations unless an exception is documented. - Package manager pin: honor the nearest owning
package.jsonand itspackageManagerfield. - Lockfile: commit
pnpm-lock.yaml; never mix lockfiles in one package root without a migration plan. - Install: use
pnpm install; usepnpm install --frozen-lockfilein CI. - Dependencies: use
pnpm add <pkg>orpnpm add -D <pkg>from the owning package root. - Local binaries: use
pnpm exec <cmd>; usepnpm dlx <pkg>only for one-off registry execution. - Scripts: use
pnpm run <script>orpnpm --filter <pkg> run <script>. - Type checking: use
pnpm exec tsc --noEmitor 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
Section titled “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
Section titled “Typescript Type Safety”-
Step — Prefer
unknownoverany; do not weaken established strictness to make code compile. -
Step — Prefer
interfacefor object shapes andtypefor unions, intersections, and mapped types. -
Step — Use discriminated unions for state machines and tagged variants.
-
Step — Use
as constandsatisfiesto preserve literal inference without unsafe assertions. -
Step — Avoid type assertions (
as); prefer type guards, assertion functions, and schema validation at boundaries. -
Step — Enable
strictin new TypeScript projects and add stricter options when the repo can absorb them. -
Step — Test negative type behavior with
@ts-expect-erroror a type-test tool when type contracts are public. -
Step — See
references/typescript-patterns.mdfor TSConfig, module-resolution, and narrowing patterns.
Scaling Strategy
Section titled “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, andreferences/edge-cases.mdto separate hard violations from documented transition paths.
Progressive Disclosure
Section titled “Progressive Disclosure”- Do not load every reference by default.
- Read
references/tooling-contract.mdfirst for command, dependency, package-root, workspace, lockfile, or CI questions. - Read
references/redirection-boundaries.mdwhen Python, shell, CI, infra, or framework-specific work is mixed into the request. - Read
references/edge-cases.mdonly when the task appears to require npm, yarn, Corepack setup, generated app scaffolding, or lockfile migration exceptions. - Read
references/typescript-patterns.mdonly when TypeScript code,tsconfig.json, public types, or type tests are active. - Read
references/eslint-prettier.mdonly when the task touches linting, typed linting, or formatting.
Scope Boundaries
Section titled “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 operationspackage root— the nearest directory whosepackage.jsonowns the command or dependencypackageManager— thepackage.jsonfield that pins the package manager and versionpnpm-lock.yaml— the canonical JS/TS lockfile for pnpm package rootsworkspace— pnpm workspace declared bypnpm-workspace.yamlfrozen-lockfile— CI install mode that prevents lockfile mutationpnpm exec— local project binary executionpnpm dlx— one-off package execution from the registry
Validation Contract
Section titled “Validation Contract”Run from this skill directory before declaring changes complete:
python scripts/check.pygit diff --checkCompletion criteria:
scripts/check.pyexits 0.git diff --checkexits 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.
| Field | Value |
|---|---|
| Source Type | repo-owned |
| Display Source | github:wyattowalsh/agents |
| Source Kind | repo |
| Installability | portable command |
| Review State | reviewed |
| Target Agents | antigravity, claude-code, codex, crush, cursor, gemini-cli, github-copilot, grok, opencode |
| Field | Value |
|---|---|
| Name | javascript-conventions |
| License | MIT |
| Version | 1.0.0 |
| Author | wyattowalsh |
| Field | Value |
|---|---|
| User Invocable | No |
Related Skills
Section titled “Related Skills”View Full SKILL.md
---name: javascript-conventionsdescription: >- 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.user-invocable: falsedisable-model-invocation: falselicense: MITmetadata: author: wyattowalsh version: "1.0.0"---
# 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
1. Apply this skill only when JS/TS files, Node tooling, or `package.json` are the primary surface of the task.2. Read `references/redirection-boundaries.md` when JS/TS appears alongside Python, shell, CI, or framework-specific work.3. Enforce the hard requirements in `references/tooling-contract.md` for package management, package-root selection, command execution, lockfiles, workspaces, and CI installs.4. Check `references/edge-cases.md` before recommending npm, yarn, global package managers, Corepack assumptions, or lockfile migrations.5. Read `references/typescript-patterns.md` for TypeScript config or type-safety changes.6. Read `references/eslint-prettier.md` for linting, typed linting, or formatting changes.7. Use guided preferences only when starting new work or when the repo does not already have a stronger local convention.
### Empty / Help
1. Summarize the hard requirements: `pnpm`, `packageManager`, `pnpm-lock.yaml`, `pnpm install --frozen-lockfile`, `pnpm exec`, `pnpm dlx`, `tsc --noEmit`, `eslint`, and `prettier`.2. Show the difference between hard requirements and guided preferences.3. Point to the exact reference files for tooling, exceptions, TypeScript, lint/format, and mixed-language routing.
### `check`
1. Verify JS/TS tooling compliance only; do not widen into implementation advice unless the user asks.2. Report whether the project uses the expected package root, `pnpm`, `packageManager`, `pnpm-lock.yaml`, workspace config, scripts, `tsconfig.json`, ESLint flat config, and Prettier.3. Flag npm/yarn/Corepack/legacy deviations and require the reason to match `references/edge-cases.md`.4. 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, preferthese 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
1. Prefer `unknown` over `any`; do not weaken established strictness to make code compile.2. Prefer `interface` for object shapes and `type` for unions, intersections, and mapped types.3. Use discriminated unions for state machines and tagged variants.4. Use `as const` and `satisfies` to preserve literal inference without unsafe assertions.5. Avoid type assertions (`as`); prefer type guards, assertion functions, and schema validation at boundaries.6. Enable `strict` in new TypeScript projects and add stricter options when the repo can absorb them.7. Test negative type behavior with `@ts-expect-error` or a type-test tool when type contracts are public.8. See `references/typescript-patterns.md` for TSConfig, module-resolution, and narrowing patterns.
## Critical Rules
1. Require `pnpm` for JS/TS dependency changes unless `references/edge-cases.md` justifies npm, yarn, or another manager.2. Resolve the owning package root before running package commands; do not assume the repository root owns every JS/TS file.3. Never mix `pnpm-lock.yaml`, `package-lock.json`, and `yarn.lock` in the same package root outside a dedicated migration.4. Run CI installs with `pnpm install --frozen-lockfile` when a `pnpm-lock.yaml` is present.5. Use `pnpm exec` for local binaries and `pnpm dlx` only for one-off packages fetched from the registry.6. Do not assume Corepack is bundled with the active Node.js runtime; check `references/edge-cases.md` before recommending Corepack setup.7. Keep Prettier responsible for formatting and ESLint responsible for code-quality rules.8. 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:
```bashpython scripts/check.pygit diff --check```
Completion criteria:
1. `scripts/check.py` exits 0.2. `git diff --check` exits 0.3. 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.