Translates project coding standards into concrete linting and formatting tool configurations. Given human-readable conventions (from AGENTS.md, code review guidelines, or team standards), this skill produces ESLint, Prettier, Biome, TypeScript, and other tool configs that enforce them automatically. Covers discovery, mapping, implementation, verification, and CI integration.
65
77%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/software-engineering/standards-to-tooling/SKILL.mdMaps project-specific coding conventions to linting/formatting tool configuration. For the Stars project: JS/TS/Vue codebase with ESLint 10 + Prettier, migrating to full TypeScript.
A convention that cannot be auto-enforced will drift. Before implementing any standard, always ask: Can a tool catch this? If yes, configure it. If no, document it as a code review checklist item.
Prefer tools that provide fix-on-save or --fix support — adoption is higher
when enforcement is automatic rather than manual.
Source the project's conventions from:
| Source | What to look for |
|---|---|
AGENTS.md | Naming, import style, component conventions, file structure |
.github/CONTRIBUTING.md | PR requirements, commit style |
| Existing configs | Patterns already configured (eslint.config.js, .prettierrc, tsconfig.json) |
| Code review history | Repeated comments about the same issue |
| Project language docs | Best practices for the language/framework (Vue 3 style guide, etc.) |
For each convention, classify it:
| Category | Example | Tool |
|---|---|---|
| Naming | kebab-case files, PascalCase components | ESLint, lint-staged |
| Imports | type imports, .js extensions, ordering | ESLint, Prettier plugins |
| Formatting | single quotes, trailing commas, print width | Prettier |
| Types | no implicit any, strict null checks | TypeScript tsconfig.json |
| Unused code | no unused vars, params, imports | ESLint |
| Style | no-var, prefer-const, no console.log | ESLint |
| Vue | <script setup> only, component name casing | eslint-plugin-vue |
Use this reference for the Stars project's tech stack:
| Convention | ESLint rule / plugin |
|---|---|
| Consistent type imports | @typescript-eslint/consistent-type-imports: ["error", { prefer: "type-imports" }] |
| No unused variables | @typescript-eslint/no-unused-vars: ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }] |
No var | no-var: "error" |
Prefer const | prefer-const: "error" |
| Named exports only | import/no-default-export: "error" (eslint-plugin-import) |
| No console.log (except warn/error) | no-console: ["warn", { allow: ["warn", "error"] }] |
| Max params | max-params: ["warn", 3] |
| Complexity gate | complexity: ["warn", 10] |
Explicit .js extensions in imports | Custom or import/extensions rule |
| JSDoc required on public functions | jsdoc/require-jsdoc (eslint-plugin-jsdoc) |
| Convention | Rule |
|---|---|
| PascalCase component names in templates | vue/component-name-in-template-casing: ["error", "PascalCase"] |
| No unused components | vue/no-unused-components: "warn" |
<script setup> only (no Options API) | vue/component-api-style: ["error", ["script-setup"]] |
| Multi-word component names (per Vue 3 style guide) | vue/multi-word-component-names: "error" |
No v-html (XSS risk) | vue/no-v-html: "warn" |
| Attribute ordering convention | vue/attributes-order |
Require :key in v-for | vue/require-v-for-key |
| Convention | Prettier option |
|---|---|
| Single quotes | singleQuote: true |
| Trailing commas | trailingComma: "all" |
| 100 char print width | printWidth: 100 |
| Import ordering | @ianvs/prettier-plugin-sort-imports with importOrder config |
| No semicolons (if desired) | semi: false |
| 2-space indent | tabWidth: 2 (default) |
| Convention | Compiler option |
|---|---|
| Strict null checks | strictNullChecks: true |
| No implicit any | noImplicitAny: true |
| Strict mode (all) | strict: true |
| No unchecked indexed access | noUncheckedIndexedAccess: true |
| Force consistent casing in imports | forceConsistentCasingInFileNames: true |
When creating or updating config files, follow these principles:
ESLint flat config (eslint.config.js):
export default), not .eslintrcfiles array to scope rules correctlyvue-eslint-parser as outer parser with TS parser insidePrettier config (.prettierrc):
prettier-plugin-sort-imports for import order when ESLint import plugin is not usedformat and format:check npm scriptsTypeScript config (tsconfig.json):
tsconfig.json (IDE/typecheck) from Vite config"noEmit": true when using Vite for bundlingstrict: true as a baseline, relax specific checks only with documented justificationAfter implementing, verify with:
# Lint all source files
npx eslint 'web/src/**/*.{ts,js,vue}'
# Check formatting (without writing)
npx prettier --check 'web/src/**/*.{ts,vue,css}'
# TypeScript type check
npx vue-tsc --noEmit
# Fix all auto-fixable issues
npx eslint --fix 'web/src/**/*.{ts,js,vue}'
npx prettier --write 'web/src/**/*.{ts,vue,css}'Ensure lint/format/typecheck runs in CI:
name: Lint & Typecheck
steps:
- run: npm run format:check # Prettier
- run: npm run lint # ESLint
- run: npm run typecheck # vue-tscAdd to package.json scripts:
{
"lint": "eslint 'web/src/**/*.{ts,js,vue}'",
"lint:fix": "eslint --fix 'web/src/**/*.{ts,js,vue}'",
"format": "prettier --write 'web/src/**/*.{ts,vue,css}'",
"format:check": "prettier --check 'web/src/**/*.{ts,vue,css}'",
"typecheck": "vue-tsc --noEmit -p web/tsconfig.json"
}Consider adding pre-commit hooks (lefthook, husky + lint-staged) to catch issues before they reach CI.
When the project's language differs from Stars (JS/TS/Vue), use these mappings:
| Language | Linter | Formatter | Type System |
|---|---|---|---|
| JavaScript/TypeScript | ESLint | Prettier / Biome | TypeScript |
| Python | Ruff | Ruff | mypy / pyright |
| Rust | Clippy | rustfmt | — |
| Go | golangci-lint | gofmt / gofumpt | — |
| Java | Checkstyle / PMD | Spotless | — |
| Ruby | RuboCop | RuboCop | Sorbet / RBS |
| Kotlin | detekt | ktlint | — |
| Swift | SwiftLint | swift-format | — |
prettier formatting options without verifying the change across the full codebase (formatting wars are expensive)eslint-config-prettier to disable style rules ESLint handles)vault-capture (persist tooling decisions as semantic memories)a1083f4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.