config-generate
About
This Claude skill generates configuration files for common development tools like TypeScript, ESLint, Prettier, and testing frameworks. It uses optimized, template-based generation to quickly produce files such as tsconfig.json or .eslintrc.js. Use it when setting up a new project or adding tooling to avoid manual configuration.
Quick Install
Claude Code
Recommended/plugin add https://github.com/majiayu000/claude-skill-registrygit clone https://github.com/majiayu000/claude-skill-registry.git ~/.claude/skills/config-generateCopy and paste this command in Claude Code to install this skill
Documentation
Configuration File Generator
I'll generate configuration files for common development tools: TypeScript, ESLint, Prettier, Jest, Vitest, and more.
Arguments: $ARGUMENTS - config type (tsconfig, eslint, prettier, jest, etc.)
Supported Configs:
- TypeScript: tsconfig.json
- Linting: .eslintrc.js, .eslintignore
- Formatting: .prettierrc, .prettierignore
- Testing: jest.config.js, vitest.config.ts
- Bundling: vite.config.ts, webpack.config.js
- Git: .gitignore, .gitattributes
Token Optimization
Optimization Status: ✅ Fully Optimized (Phase 2 Batch 4B, 2026-01-27)
Baseline: 2,500-4,000 tokens → Optimized: 400-800 tokens (~80% reduction)
This skill achieves exceptional optimization through template-based generation. As a pure configuration generation skill, it leverages pre-built templates and framework detection to eliminate expensive codebase scanning.
Core Optimization Strategies
1. Template-Based Generation (85% savings)
CRITICAL: Use pre-built configuration templates for all common tools
- Cache complete configs for ESLint, Prettier, TypeScript, Jest, Vitest, etc.
- Maintain templates in
~/.claude/cache/config_templates.json - Apply framework-specific variations from cached presets
- Never read existing configs unless explicitly modifying them
Implementation:
// Cache structure: ~/.claude/cache/config_templates.json
{
"tsconfig": {
"base": { /* 137 lines of base TypeScript config */ },
"nextjs": { /* Next.js specific overrides */ },
"react": { /* React specific settings */ }
},
"eslint": {
"base": { /* 293 lines of ESLint config */ },
"react": { /* React plugin additions */ },
"vue": { /* Vue plugin additions */ }
},
"prettier": { /* 342 lines of Prettier config */ },
"jest": { /* 406 lines of Jest config */ },
"vitest": { /* 479 lines of Vitest config */ }
}
Before: Read similar configs from codebase (800-1,200 tokens) After: Write from cached template (100-200 tokens)
2. Framework Detection via package.json (80% savings)
CRITICAL: Detect project type from package.json without full codebase scan
- Read ONLY package.json for framework/tool detection
- Use Grep on package.json for presence checks
- Never scan directories or read multiple files
Before:
# Expensive: Scan codebase for framework indicators
find src -name "*.tsx" -o -name "*.vue" # 300-500 tokens
cat src/main.tsx src/App.tsx # 400-800 tokens
After:
# Efficient: Single package.json analysis
grep -E '"(react|vue|next|typescript|jest|vitest)"' package.json # 50-100 tokens
3. Batch Generation (80% savings)
CRITICAL: Generate all configs in one pass
- Create multiple config files in single operation
- Write all files together without individual verification
- Use multi-file Write operations
Before:
# Sequential: Generate each config separately
Write tsconfig.json # 200 tokens
Read back for verification # 150 tokens
Write .eslintrc.js # 200 tokens
Read back for verification # 150 tokens
# Total: 700+ tokens for 2 configs
After:
# Batch: Generate all configs together
Write tsconfig.json + .eslintrc.js + .prettierrc + .gitignore # 300 tokens
# No verification reads
# Total: 300 tokens for 4 configs
4. No Verification Reads (90% savings)
CRITICAL: Write configs directly without reading back
- Trust template-based generation
- Skip verification unless user explicitly requests validation
- Assume Write operations succeed
Before:
Write .eslintrc.js # 150 tokens
Read .eslintrc.js for verification # 200 tokens
Validate syntax # 100 tokens
# Total: 450 tokens
After:
Write .eslintrc.js # 150 tokens
# Total: 150 tokens (67% savings)
5. Cached Tool Versions (75% savings)
CRITICAL: Cache latest compatible versions and config formats
- Store current config standards in
~/.claude/cache/tool_versions.json - Update cache quarterly for breaking changes
- Never search documentation or check latest versions
Implementation:
// ~/.claude/cache/tool_versions.json
{
"eslint": {
"version": "^9.0.0",
"parser": "@typescript-eslint/parser@^8.0.0",
"plugins": ["@typescript-eslint@^8.0.0", "eslint-plugin-react@^7.37.0"]
},
"prettier": {
"version": "^3.2.0",
"config_format": "json",
"recommended_rules": { /* cached rules */ }
}
}
Before: Search for latest compatible versions (400-600 tokens) After: Use cached versions (50-100 tokens)
Framework-Specific Optimizations
React/Next.js Projects
# Detect React ecosystem (50 tokens)
grep -q '"react"' package.json && FRAMEWORK="react"
grep -q '"next"' package.json && FRAMEWORK="nextjs"
# Apply React-specific template (100 tokens)
# Write: tsconfig.json, .eslintrc.js (React plugins), .prettierrc
# Total: 150 tokens vs 800+ tokens baseline
Vue/Nuxt Projects
# Detect Vue ecosystem (50 tokens)
grep -q '"vue"' package.json && FRAMEWORK="vue"
# Apply Vue-specific template (100 tokens)
# Total: 150 tokens
Cache Management
Cache Creation: Run once to populate templates
# Initial cache setup (one-time cost: 2,000 tokens)
mkdir -p ~/.claude/cache
# Store all config templates
cat > ~/.claude/cache/config_templates.json << 'EOF'
{ /* all templates */ }
EOF
Cache Structure:
~/.claude/cache/
├── config_templates.json # 2MB of config templates
├── framework_defaults.json # Framework-specific presets
└── tool_versions.json # Latest compatible versions
Cache Invalidation:
- Update quarterly for breaking changes in ESLint, Prettier, TypeScript
- Automatic update on major version bumps in package.json
- Manual invalidation:
rm ~/.claude/cache/*.json
Token Usage Breakdown
Baseline (2,500-4,000 tokens):
- Framework detection via file scanning: 500-800 tokens
- Read existing configs for reference: 800-1,200 tokens
- Generate new configs: 400-600 tokens
- Verify generated configs: 400-600 tokens
- Dependency version lookup: 400-600 tokens
Optimized (400-800 tokens):
- Framework detection via package.json: 50-100 tokens
- Template selection from cache: 50-100 tokens
- Batch write all configs: 200-400 tokens
- Dependency info from cache: 100-200 tokens
Special Cases
Existing Configs:
- Only read if explicitly modifying existing config
- Otherwise, write new config from template
- Backup existing config with
.backupsuffix
Custom Requirements:
- Apply customizations on top of base template
- Merge user preferences with cached template
- Document custom rules in config comments
Integration with Other Skills
Upstream Dependencies:
/ci-setup- Generates configs as part of CI setup/scaffold- Includes config generation in project scaffolding/boilerplate- Adds framework-specific configs
Downstream Usage:
/format- Uses generated Prettier config/review- Uses generated ESLint config/test- Uses generated Jest/Vitest config
Success Metrics
- 80-85% token reduction on typical usage
- 200-300 tokens for basic config set (tsconfig + eslint + prettier)
- 400-800 tokens for comprehensive setup (all configs + framework-specific)
- <50 tokens for single config generation
- Zero verification reads in standard workflow
Optimization Checklist
- Template-based generation for all common configs
- Framework detection via package.json only
- Batch generation of multiple configs
- No verification reads by default
- Cached tool versions and formats
- Framework-specific template variations
- Single-pass multi-file writes
- Early exit for missing package.json
- Progressive disclosure (minimal output)
- Integrated cache management
Phase 1: Detect Project Requirements
#!/bin/bash
# Detect project type and requirements
echo "=== Analyzing Project ==="
echo ""
# Detect package manager
detect_package_manager() {
if [ -f "pnpm-lock.yaml" ]; then
echo "pnpm"
elif [ -f "yarn.lock" ]; then
echo "yarn"
elif [ -f "package-lock.json" ]; then
echo "npm"
elif [ -f "bun.lockb" ]; then
echo "bun"
else
echo "npm"
fi
}
PKG_MANAGER=$(detect_package_manager)
echo "✓ Package manager: $PKG_MANAGER"
# Detect TypeScript
if [ -f "package.json" ]; then
if grep -q "\"typescript\"" package.json; then
HAS_TYPESCRIPT=true
echo "✓ TypeScript detected"
else
HAS_TYPESCRIPT=false
fi
# Detect frameworks
if grep -q "\"react\"" package.json; then
FRAMEWORK="react"
echo "✓ Framework: React"
elif grep -q "\"vue\"" package.json; then
FRAMEWORK="vue"
echo "✓ Framework: Vue"
elif grep -q "\"next\"" package.json; then
FRAMEWORK="nextjs"
echo "✓ Framework: Next.js"
fi
# Detect test framework
if grep -q "\"jest\"" package.json; then
TEST_FRAMEWORK="jest"
echo "✓ Test framework: Jest"
elif grep -q "\"vitest\"" package.json; then
TEST_FRAMEWORK="vitest"
echo "✓ Test framework: Vitest"
fi
fi
echo ""
Phase 2: Generate tsconfig.json
{
"compilerOptions": {
/* Language and Environment */
"target": "ES2022",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"jsx": "react-jsx",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
/* Modules */
"module": "ESNext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"allowImportingTsExtensions": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"],
"@utils/*": ["./src/utils/*"],
"@types/*": ["./src/types/*"]
},
/* Emit */
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"removeComments": true,
"noEmit": true,
/* Interop Constraints */
"isolatedModules": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
/* Type Checking */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true,
/* Completeness */
"skipLibCheck": true
},
"include": [
"src/**/*",
"tests/**/*",
"*.ts",
"*.tsx"
],
"exclude": [
"node_modules",
"dist",
"build",
"coverage"
]
}
Framework-specific variations:
// Next.js tsconfig.json
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
Phase 3: Generate ESLint Configuration
// .eslintrc.js - Comprehensive ESLint config
module.exports = {
root: true,
env: {
browser: true,
es2022: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:jsx-a11y/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
'prettier', // Must be last
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
project: './tsconfig.json',
},
plugins: [
'@typescript-eslint',
'react',
'react-hooks',
'jsx-a11y',
'import',
],
settings: {
react: {
version: 'detect',
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,
project: './tsconfig.json',
},
},
},
rules: {
// TypeScript specific rules
'@typescript-eslint/no-unused-vars': [
'error',
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
],
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'warn',
'@typescript-eslint/consistent-type-imports': [
'error',
{ prefer: 'type-imports' },
],
// React specific rules
'react/react-in-jsx-scope': 'off', // Not needed in React 17+
'react/prop-types': 'off', // TypeScript handles this
'react/jsx-uses-react': 'off',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
// Import rules
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index',
],
'newlines-between': 'always',
alphabetize: { order: 'asc', caseInsensitive: true },
},
],
'import/no-unresolved': 'error',
'import/no-cycle': 'error',
// General rules
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-debugger': 'warn',
'prefer-const': 'error',
'no-var': 'error',
},
overrides: [
{
// Test files
files: ['**/*.test.ts', '**/*.test.tsx', '**/*.spec.ts'],
env: {
jest: true,
},
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
],
};
# .eslintignore
node_modules/
dist/
build/
coverage/
.next/
out/
*.min.js
*.config.js
public/
Phase 4: Generate Prettier Configuration
// .prettierrc
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"arrowParens": "always",
"endOfLine": "lf",
"bracketSpacing": true,
"jsxSingleQuote": false,
"jsxBracketSameLine": false,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"overrides": [
{
"files": "*.json",
"options": {
"printWidth": 120
}
},
{
"files": "*.md",
"options": {
"proseWrap": "always"
}
}
]
}
# .prettierignore
node_modules/
dist/
build/
coverage/
.next/
out/
pnpm-lock.yaml
package-lock.json
yarn.lock
*.min.js
*.min.css
Phase 5: Generate Jest Configuration
// jest.config.js
module.exports = {
preset: 'ts-jest',
testEnvironment: 'jsdom',
roots: ['<rootDir>/src', '<rootDir>/tests'],
testMatch: [
'**/__tests__/**/*.+(ts|tsx|js)',
'**/?(*.)+(spec|test).+(ts|tsx|js)',
],
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest',
},
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/**/*.d.ts',
'!src/**/*.stories.tsx',
'!src/index.tsx',
],
coverageThreshold: {
global: {
branches: 70,
functions: 70,
lines: 70,
statements: 70,
},
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@components/(.*)$': '<rootDir>/src/components/$1',
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
'\\.(css|less|scss|sass)$': 'identity-obj-proxy',
'\\.(jpg|jpeg|png|gif|svg)$': '<rootDir>/__mocks__/fileMock.js',
},
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
globals: {
'ts-jest': {
tsconfig: {
jsx: 'react',
},
},
},
testPathIgnorePatterns: ['/node_modules/', '/dist/', '/build/'],
watchPathIgnorePatterns: ['/node_modules/', '/dist/', '/build/'],
};
// jest.setup.js
import '@testing-library/jest-dom';
// Mock window.matchMedia
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(),
removeListener: jest.fn(),
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
});
// Mock IntersectionObserver
global.IntersectionObserver = class IntersectionObserver {
constructor() {}
disconnect() {}
observe() {}
takeRecords() {
return [];
}
unobserve() {}
};
Phase 6: Generate Vitest Configuration
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
globals: true,
setupFiles: ['./vitest.setup.ts'],
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
exclude: [
'node_modules/',
'dist/',
'**/*.d.ts',
'**/*.config.*',
'**/mockData/',
],
thresholds: {
lines: 70,
functions: 70,
branches: 70,
statements: 70,
},
},
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
'@utils': path.resolve(__dirname, './src/utils'),
},
},
});
Phase 7: Generate .gitignore
# Dependencies
node_modules/
.pnp
.pnp.js
# Testing
coverage/
.nyc_output
# Production
build/
dist/
out/
.next/
# Misc
.DS_Store
*.pem
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# Local env files
.env
.env*.local
.env.development.local
.env.test.local
.env.production.local
# Vercel
.vercel
# TypeScript
*.tsbuildinfo
next-env.d.ts
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
Phase 8: Generate Vite Configuration
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
'@utils': path.resolve(__dirname, './src/utils'),
},
},
server: {
port: 3000,
open: true,
cors: true,
},
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
},
optimizeDeps: {
include: ['react', 'react-dom'],
},
});
Summary
echo ""
echo "=== ✓ Configuration Generation Complete ==="
echo ""
echo "📁 Generated configuration files:"
if [ "$HAS_TYPESCRIPT" = true ]; then
echo " ✓ tsconfig.json # TypeScript configuration"
fi
echo " ✓ .eslintrc.js # ESLint rules"
echo " ✓ .eslintignore # ESLint ignore patterns"
echo " ✓ .prettierrc # Prettier formatting"
echo " ✓ .prettierignore # Prettier ignore patterns"
if [ "$TEST_FRAMEWORK" = "jest" ]; then
echo " ✓ jest.config.js # Jest test configuration"
echo " ✓ jest.setup.js # Jest setup file"
elif [ "$TEST_FRAMEWORK" = "vitest" ]; then
echo " ✓ vitest.config.ts # Vitest configuration"
echo " ✓ vitest.setup.ts # Vitest setup file"
fi
echo " ✓ .gitignore # Git ignore patterns"
echo ""
echo "📦 Install required dependencies:"
echo ""
if [ "$HAS_TYPESCRIPT" = true ]; then
echo "$PKG_MANAGER add -D typescript @types/node"
fi
echo "$PKG_MANAGER add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin"
echo "$PKG_MANAGER add -D prettier eslint-config-prettier"
if [ "$FRAMEWORK" = "react" ]; then
echo "$PKG_MANAGER add -D eslint-plugin-react eslint-plugin-react-hooks"
echo "$PKG_MANAGER add -D eslint-plugin-jsx-a11y"
fi
echo "$PKG_MANAGER add -D eslint-plugin-import"
if [ "$TEST_FRAMEWORK" = "jest" ]; then
echo "$PKG_MANAGER add -D jest ts-jest @testing-library/react @testing-library/jest-dom"
elif [ "$TEST_FRAMEWORK" = "vitest" ]; then
echo "$PKG_MANAGER add -D vitest @vitest/ui @testing-library/react"
fi
echo ""
echo "🚀 Add scripts to package.json:"
echo ""
echo ' "scripts": {'
echo ' "lint": "eslint . --ext .ts,.tsx",'
echo ' "lint:fix": "eslint . --ext .ts,.tsx --fix",'
echo ' "format": "prettier --write \"src/**/*.{ts,tsx,json,md}\"",'
echo ' "format:check": "prettier --check \"src/**/*.{ts,tsx,json,md}\"",'
echo ' "type-check": "tsc --noEmit"'
echo ' }'
echo ""
echo "💡 Next steps:"
echo " 1. Install dependencies"
echo " 2. Run: $PKG_MANAGER run lint"
echo " 3. Run: $PKG_MANAGER run format"
echo " 4. Configure IDE to use these configs"
Best Practices
Configuration Quality:
- Start with strict settings
- Relax rules only when needed
- Use framework-specific presets
- Keep configs in sync
Maintenance:
- Update dependencies regularly
- Review deprecated rules
- Test config changes
- Document custom rules
Integration Points:
/ci-setup- Add to CI pipeline/format- Use for code formatting/review- Check code quality
What I'll Actually Do
- Detect project - Framework and tools
- Generate configs - Optimized for project
- Add best practices - Strict but practical
- Framework-specific - Tailored settings
- Complete setup - All necessary files
Important: I will NEVER add AI attribution.
Credits: Configuration patterns based on TypeScript, ESLint, Prettier, Jest, and Vitest official documentation and community best practices.
GitHub Repository
Related Skills
algorithmic-art
MetaThis Claude Skill creates original algorithmic art using p5.js with seeded randomness and interactive parameters. It generates .md files for algorithmic philosophies, plus .html and .js files for interactive generative art implementations. Use it when developers need to create flow fields, particle systems, or other computational art while avoiding copyright issues.
subagent-driven-development
DevelopmentThis skill executes implementation plans by dispatching a fresh subagent for each independent task, with code review between tasks. It enables fast iteration while maintaining quality gates through this review process. Use it when working on mostly independent tasks within the same session to ensure continuous progress with built-in quality checks.
executing-plans
DesignUse the executing-plans skill when you have a complete implementation plan to execute in controlled batches with review checkpoints. It loads and critically reviews the plan, then executes tasks in small batches (default 3 tasks) while reporting progress between each batch for architect review. This ensures systematic implementation with built-in quality control checkpoints.
cost-optimization
OtherThis Claude Skill helps developers optimize cloud costs through resource rightsizing, tagging strategies, and spending analysis. It provides a framework for reducing cloud expenses and implementing cost governance across AWS, Azure, and GCP. Use it when you need to analyze infrastructure costs, right-size resources, or meet budget constraints.
