plugins/frontend-toolkit/skills/developer-experience/SKILL.md
Set up DX baseline — ESLint + Prettier + husky + lint-staged + commitlint, strict TypeScript, path alias, t3-env for typed env vars, Node/package-manager pinning, .editorconfig, .vscode/extensions.json, CONTRIBUTING.md. Use at project start, during team onboarding, when ESLint warnings pile up, or local builds slow down. Coordinates with cicd-pipeline (local pre-commit gating complements CI) and security-audit (typed env validation hardens the secret-leak surface).
npx skillsauth add jaykim88/claude-ai-engineering developer-experienceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Make every developer faster on day one. Misconfiguration that lingers wastes hours per week; the right baseline removes a whole class of "works on my machine" problems.
Universal — pre-commit hooks, strict type-checker config, path aliases, typed env validation, IDE recommendations, and CONTRIBUTING.md are baseline DX for any frontend stack.
Linter + formatter baseline
.editorconfig for cross-editor consistency (indent, line endings) — not everyone uses the same editorPre-commit hooks that run lint + format on staged files only (fast)
commit-msg hook (commitlint) to enforce Conventional Commits — this is what later enables automated changelogs / semantic versioning--no-verify and don't run in CI. CI must re-run lint / type-check / test as the real gate (see cicd-pipeline). Keep hooks fast or they get bypassed2b. Pin the toolchain for reproducible installs
.nvmrc / engines.node) and the package manager (packageManager field + Corepack) so everyone runs identical versions — most "works on my machine" bugs are a version mismatchnpm ci (not npm install) in CI and onboarding for reproducible installs; never mix package managers (one lockfile)Enable the strict type-checker flags that catch a class of bugs at compile time
array[i] may be undefined) and undefined-vs-missing-key distinctiontsc --noEmit in lint-staged — type errors are cross-file, but lint-staged passes only staged files (so it misses errors, or you slow the hook by checking everything). Run tsc in CI (or a pre-push hook); keep per-file lint in pre-commitstrict / noUncheckedIndexedAccess / exactOptionalPropertyTypes — see Implementation)Path alias to eliminate ../../ chains
@/ → source root) so imports are stable regardless of file depth../../../ import chainsgrep -rE "from ['\"]\\.\\./\\.\\./" src/ → 0Validate env via a typed schema imported at build so misconfig fails the build, not production
process.env.X (which is string | undefined).env.example listing every required key (no values) so onboarding and the typed schema stay in syncFast dev server / HMR
Commit IDE recommended-extensions so contributors are auto-prompted
CONTRIBUTING.md
git commit and auto-lints (staged files only)commit-msg hook enforces Conventional Commits.nvmrc / engines / packageManager); lockfile committedtsc runs in CI / pre-push (not in per-file lint-staged)@/ works, no ../../ import chains.env.example lists required keys.editorconfig + .vscode/extensions.json present.eslintrc.{json,cjs} + .prettierrc + eslint-config-prettier + .editorconfig.husky/pre-commit + lint-staged config in package.json; .husky/commit-msg + commitlint.config.{js,ts}.nvmrc + engines.node + packageManager field; committed lockfile.env.example listing every required key (no values)tsconfig.json with strict: true, noUncheckedIndexedAccess: true, exactOptionalPropertyTypes: truesrc/env.ts (or src/env/{server,client}.ts if split needed); imported in next.config.ts so build fails on missing.vscode/extensions.jsonCONTRIBUTING.md with 30-minute setup guidechore(dx): verify pre-commit hook + strict TS + env build-failnext/core-web-vitals, @typescript-eslint, jsx-a11y, react-hooks, importeslint-config-prettier; format on save (editor.formatOnSave: true, editor.defaultFormatter: esbenp.prettier-vscode)husky + lint-staged; commit-msg via @commitlint/{cli,config-conventional}.nvmrc, engines.node, packageManager: 'pnpm@x' (or npm/yarn) + Corepack; commit lockfile, install via npm cistrict: true, noUncheckedIndexedAccess: true, exactOptionalPropertyTypes: true — run tsc --noEmit in CI, not lint-stagedtsconfig.json "paths": { "@/*": ["./src/*"] }@t3-oss/env-nextjs + Zod in src/env.ts (or src/env/{server,client}.ts when names are sensitive); import in next.config.ts so build fails on missing. Destructure all keys into runtimeEnv (or experimental__runtimeEnv for Next.js ≥ 13.4.4) — every key must be listed. Reference via env.DATABASE_URL, not process.env.DATABASE_URLnext dev --turbo for Next.js 15+.vscode/extensions.json listing ESLint, Prettier, Tailwind CSS IntelliSense, GitLens, Error Lenseslint-plugin-vue; Prettier; @t3-oss/env-nuxt for typed env; Nuxt dev server uses Vite by defaulteslint-plugin-svelte; Prettier with prettier-plugin-svelte; typed env via SvelteKit's $env/static/private and $env/dynamic/public (built-in)angular-eslint; Prettier; @angular/cli enforces strict mode; env via environment.ts files (no Zod by default — add manually)cicd-pipeline — husky + lint-staged complement CI gatingsecurity-audit — env validation hardens the secret-leak surfacenext.config.ts so misconfiguration fails the build, not production runtime. Pair with tsconfig strict + noUncheckedIndexedAccess for full type safety — these two together catch the majority of "but it worked locally" bugs at compile time. Pin the toolchain (Node + package manager) to kill the other half of those bugs. And know the boundary: hooks are a fast local convenience (skippable, no CI), so project-wide tsc and the real gates belong in CI — keep lint-staged to per-file lint only.development
Audit and optimize third-party scripts — analytics, tag managers, chat widgets, embeds — with the right loading strategy, performance budget, facades, and CSP/consent controls. Use when adding a script, when TBT/INP regress, when a GDPR/CCPA consent requirement arises, or before shipping. Not for first-party bundle size (use bundle-optimization) or broad Core Web Vitals diagnosis (use rendering-performance).
development
Apply the Testing Trophy (mostly integration tests with RTL + MSW, sparing E2E with Playwright) and set coverage thresholds. Use before new feature work, after bug fixes, when CI coverage falls below target, or when tests are flaky or break on every refactor. Not for wiring coverage gates + Playwright into the GitHub Actions matrix (use cicd-pipeline) or auditing WCAG a11y compliance (use accessibility-audit).
development
Inventory and prioritize technical debt — TODO/FIXME/HACK, any usage, deprecated APIs, untested logic — with impact × effort matrix. Use at quarter start, before a refactoring sprint, when a new teammate joins, or when feature velocity slows. Not for actually paying down debt (use code-refactoring) or recording a migration approach (use decision-records) — this only inventories and prioritizes.
development
Decision framework for choosing the right state location — URL, server cache, local component, or shared/global store. Use when state-sync bugs appear, prop drilling gets deep (3+ levels), filters/tabs lose state on reload, or quarterly review. Not for form state specifically (use form-ux) or when the state is actually server data (use api-caching-optimization).