Back to Skills

config-generate

majiayu000
Updated Yesterday
1 views
58
9
58
View on GitHub
Metageneral

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 CommandRecommended
/plugin add https://github.com/majiayu000/claude-skill-registry
Git CloneAlternative
git clone https://github.com/majiayu000/claude-skill-registry.git ~/.claude/skills/config-generate

Copy 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):

  1. Framework detection via file scanning: 500-800 tokens
  2. Read existing configs for reference: 800-1,200 tokens
  3. Generate new configs: 400-600 tokens
  4. Verify generated configs: 400-600 tokens
  5. Dependency version lookup: 400-600 tokens

Optimized (400-800 tokens):

  1. Framework detection via package.json: 50-100 tokens
  2. Template selection from cache: 50-100 tokens
  3. Batch write all configs: 200-400 tokens
  4. 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 .backup suffix

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

  1. Detect project - Framework and tools
  2. Generate configs - Optimized for project
  3. Add best practices - Strict but practical
  4. Framework-specific - Tailored settings
  5. 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

majiayu000/claude-skill-registry
Path: skills/config-generate

Related Skills

algorithmic-art

Meta

This 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.

View skill

subagent-driven-development

Development

This 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.

View skill

executing-plans

Design

Use 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.

View skill

cost-optimization

Other

This 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.

View skill