Claude-skill-registry config-generate
Generate configuration files for development tools
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/config-generate" ~/.claude/skills/majiayu000-claude-skill-registry-config-generate && rm -rf "$T"
skills/data/config-generate/SKILL.mdConfiguration 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
suffix.backup
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:
- Generates configs as part of CI setup/ci-setup
- Includes config generation in project scaffolding/scaffold
- Adds framework-specific configs/boilerplate
Downstream Usage:
- Uses generated Prettier config/format
- Uses generated ESLint config/review
- Uses generated Jest/Vitest config/test
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:
- Add to CI pipeline/ci-setup
- Use for code formatting/format
- Check code quality/review
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.