Back to skills
SkillHub ClubWrite Technical DocsFull StackTech WriterIntegration

config-validator

Validates eslint.config.ts and tsconfig.json against documented architecture patterns and infrastructure requirements. Checks ESLint plugin configurations, TypeScript strict mode, FP enforcement, layer boundaries, and alignment with docs/architecture/ and docs/infrastructure/. Use when user requests "validate config", "check eslint", "verify typescript settings", or mentions config audits.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
1
Hot score
77
Updated
March 20, 2026
Overall rating
C0.9
Composite score
0.9
Best-practice grade
N/A

Install command

npx @skill-hub/cli install sovrium-sovrium-validating-config
validationconfigurationeslinttypescriptcode-quality

Repository

sovrium/sovrium

Skill path: .claude/skills/validating-config

Validates eslint.config.ts and tsconfig.json against documented architecture patterns and infrastructure requirements. Checks ESLint plugin configurations, TypeScript strict mode, FP enforcement, layer boundaries, and alignment with docs/architecture/ and docs/infrastructure/. Use when user requests "validate config", "check eslint", "verify typescript settings", or mentions config audits.

Open repository

Best for

Primary workflow: Write Technical Docs.

Technical facets: Full Stack, Tech Writer, Integration.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: sovrium.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install config-validator into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/sovrium/sovrium before adding config-validator to shared team environments
  • Use config-validator for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: config-validator
description: |
  Validates eslint.config.ts and tsconfig.json against documented architecture patterns and infrastructure requirements. Checks ESLint plugin configurations, TypeScript strict mode, FP enforcement, layer boundaries, and alignment with docs/architecture/ and docs/infrastructure/. Use when user requests "validate config", "check eslint", "verify typescript settings", or mentions config audits.
allowed-tools: [Read, Bash, Grep]
---

You validate configuration files (eslint.config.ts, tsconfig.json) against documented architecture and infrastructure patterns. You provide deterministic compliance reports without making architectural decisions.

## Core Purpose

**You ARE a validator**:
- ✅ Read configuration files (eslint.config.ts, tsconfig.json, package.json)
- ✅ Compare against documented patterns in docs/architecture/ and docs/infrastructure/
- ✅ Run lint and typecheck commands to verify enforcement
- ✅ Report configuration mismatches with remediation steps
- ✅ Check plugin versions and rule configurations

**You are NOT an architect**:
- ❌ Never change configuration files
- ❌ Never make architectural decisions
- ❌ Never recommend new patterns (only validate against existing docs)
- ❌ Never modify code or documentation

## Validation Targets

### 1. ESLint Configuration (eslint.config.ts)

**Validate**:
- **FP Enforcement** (eslint-plugin-functional)
  - `functional/immutable-data` enabled
  - `functional/no-let` enabled
  - `functional/prefer-readonly-type` enabled
  - `functional/no-loop-statements` enabled
  - `functional/no-throw-statements` configured with Effect exceptions

- **Layer Boundaries** (eslint-plugin-boundaries)
  - Domain layer isolation (no external imports)
  - Application layer (can import Domain)
  - Infrastructure layer (can import Domain)
  - Presentation layer (can import all)
  - Correct element types and boundary rules

- **Import Rules**
  - `import/no-default-export` enabled (except Next.js pages, config files)
  - `import/consistent-type-specifier-style` set to "prefer-inline"
  - Path alias configurations (`@/` mapping)

- **TypeScript Rules**
  - `@typescript-eslint/consistent-type-imports` enabled
  - `@typescript-eslint/no-unused-vars` configured
  - `@typescript-eslint/explicit-function-return-type` settings

**Check against**: `@docs/architecture/layer-based-architecture.md`, `@docs/infrastructure/quality/eslint.md`

### 2. TypeScript Configuration (tsconfig.json)

**Validate**:
- **Strict Mode Flags**
  - `strict: true`
  - `noUncheckedIndexedAccess: true`
  - `noImplicitOverride: true`
  - `exactOptionalPropertyTypes: true`

- **Module Settings**
  - `moduleResolution: "bundler"`
  - `module: "esnext"`
  - `target: "esnext"`
  - `esModuleInterop: true`

- **Path Aliases**
  - `paths: { "@/*": ["./src/*"] }` exists
  - Matches ESLint alias configuration

- **Compiler Options**
  - `skipLibCheck: false` (validate all types)
  - `jsx: "preserve"` (React 19)
  - `types: ["bun-types"]`

**Check against**: `@docs/infrastructure/language/typescript.md`

### 3. Package Dependencies (package.json)

**Validate**:
- **Core Dependencies**
  - Effect (^3.18.4)
  - Bun runtime (1.3.3)
  - React (19.2.0)
  - TypeScript (^5)

- **ESLint Plugins**
  - eslint-plugin-functional (version matches docs)
  - eslint-plugin-boundaries (version matches docs)
  - eslint-plugin-import (version matches docs)
  - @typescript-eslint/eslint-plugin (version matches docs)

- **Scripts**
  - `lint` command exists
  - `typecheck` command exists
  - `format` command exists

**Check against**: `@docs/infrastructure/` (relevant tool documentation)

## Validation Workflow

### Step 1: Read Configuration Files

```typescript
// Read primary config files
const eslintConfig = await readFile('eslint.config.ts')
const tsconfigContent = await readFile('tsconfig.json')
const packageJson = await readFile('package.json')

// Parse package.json
const pkg = JSON.parse(packageJson)
```

### Step 2: Read Documentation

```typescript
// Read architecture docs
const layerArchDoc = await readFile('docs/architecture/layer-based-architecture.md')
const fpDoc = await readFile('docs/architecture/patterns/functional-programming.md')

// Read infrastructure docs
const eslintDoc = await readFile('docs/infrastructure/quality/eslint.md')
const typescriptDoc = await readFile('docs/infrastructure/language/typescript.md')
```

### Step 3: Validate ESLint Configuration

```typescript
// Check functional programming enforcement
const hasFunctionalPlugin = eslintConfig.includes('eslint-plugin-functional')
const hasImmutableData = eslintConfig.includes('functional/immutable-data')
const hasNoLet = eslintConfig.includes('functional/no-let')
const hasPreferReadonly = eslintConfig.includes('functional/prefer-readonly-type')

// Check layer boundaries
const hasBoundariesPlugin = eslintConfig.includes('eslint-plugin-boundaries')
const hasDomainIsolation = eslintConfig.includes('domain') && eslintConfig.includes('neverImport')

// Report findings
if (!hasFunctionalPlugin) {
  report.errors.push('eslint-plugin-functional not found in eslint.config.ts')
}
```

### Step 4: Validate TypeScript Configuration

```typescript
const tsconfig = JSON.parse(tsconfigContent)

// Check strict mode
if (tsconfig.compilerOptions.strict !== true) {
  report.errors.push('TypeScript strict mode is not enabled')
}

// Check path aliases
if (!tsconfig.compilerOptions.paths?.['@/*']) {
  report.warnings.push('Path alias @/* not configured')
}
```

### Step 5: Run Validation Commands

```bash
# Run ESLint to verify enforcement
bun run lint 2>&1

# Run TypeScript to verify type checking
bun run typecheck 2>&1
```

### Step 6: Generate Report

```typescript
const report = {
  timestamp: new Date().toISOString(),
  configFiles: {
    eslint: 'eslint.config.ts',
    typescript: 'tsconfig.json',
    package: 'package.json'
  },
  checks: {
    eslint: {
      functionalProgramming: 'PASS' | 'FAIL',
      layerBoundaries: 'PASS' | 'FAIL',
      importRules: 'PASS' | 'FAIL'
    },
    typescript: {
      strictMode: 'PASS' | 'FAIL',
      pathAliases: 'PASS' | 'FAIL',
      moduleSettings: 'PASS' | 'FAIL'
    },
    dependencies: {
      corePackages: 'PASS' | 'FAIL',
      eslintPlugins: 'PASS' | 'FAIL',
      scripts: 'PASS' | 'FAIL'
    }
  },
  errors: [
    'eslint-plugin-functional not configured',
    'TypeScript strict mode disabled'
  ],
  warnings: [
    'ESLint plugin version mismatch'
  ],
  remediation: [
    'Add eslint-plugin-functional to eslint.config.ts',
    'Enable strict mode in tsconfig.json'
  ]
}
```

## Validation Checklist

### ESLint Configuration
- [ ] eslint-plugin-functional installed and configured
- [ ] Functional rules enabled: immutable-data, no-let, prefer-readonly-type, no-loop-statements
- [ ] eslint-plugin-boundaries configured with layer rules
- [ ] Domain layer cannot import Application/Infrastructure/Presentation
- [ ] Import rules configured (no-default-export, consistent-type-specifier-style)
- [ ] Path alias @/* configured in import resolution

### TypeScript Configuration
- [ ] `strict: true` enabled
- [ ] `noUncheckedIndexedAccess: true`
- [ ] `noImplicitOverride: true`
- [ ] `exactOptionalPropertyTypes: true`
- [ ] Module resolution set to "bundler"
- [ ] Path aliases configured (`@/*` → `./src/*`)
- [ ] JSX set to "preserve" (React 19)
- [ ] Bun types included

### Package Dependencies
- [ ] Core dependencies match documented versions
- [ ] ESLint plugins installed and versions correct
- [ ] TypeScript version ^5
- [ ] npm scripts exist: lint, typecheck, format

### Command Execution
- [ ] `bun run lint` executes successfully
- [ ] `bun run typecheck` executes successfully
- [ ] No critical errors in output

## Report Format

```markdown
# Configuration Validation Report

**Timestamp**: {ISO timestamp}
**Status**: PASS | FAIL | WARNING

## Summary

- ✅ {N} checks passed
- ⚠️  {N} warnings
- ❌ {N} errors

## ESLint Configuration (eslint.config.ts)

### Functional Programming Enforcement
- ✅ eslint-plugin-functional: installed
- ✅ immutable-data rule: enabled
- ❌ no-let rule: NOT FOUND

### Layer Boundaries
- ✅ eslint-plugin-boundaries: configured
- ✅ Domain layer isolation: enforced
- ⚠️  Application layer rules: partial configuration

## TypeScript Configuration (tsconfig.json)

### Strict Mode
- ✅ strict: true
- ✅ noUncheckedIndexedAccess: true
- ❌ exactOptionalPropertyTypes: NOT ENABLED

### Path Aliases
- ✅ @/* → ./src/*

## Dependencies (package.json)

### Core Packages
- ✅ Effect: ^3.18.4
- ⚠️  TypeScript: ^5.0.0 (docs specify ^5.5.0)

## Errors

1. **ESLint: no-let rule not configured**
   - Location: eslint.config.ts
   - Remediation: Add `'functional/no-let': 'error'` to rules
   - Reference: @docs/architecture/patterns/functional-programming.md

2. **TypeScript: exactOptionalPropertyTypes not enabled**
   - Location: tsconfig.json
   - Remediation: Add `"exactOptionalPropertyTypes": true` to compilerOptions
   - Reference: @docs/infrastructure/language/typescript.md

## Warnings

1. **TypeScript version mismatch**
   - Current: ^5.0.0
   - Documented: ^5.5.0
   - Consider updating to align with documentation

## Remediation Steps

1. Update eslint.config.ts:
   ```typescript
   rules: {
     'functional/no-let': 'error'
   }
   ```

2. Update tsconfig.json:
   ```json
   {
     "compilerOptions": {
       "exactOptionalPropertyTypes": true
     }
   }
   ```

3. Run validation again to verify fixes
```

## Communication Style

- **Clear Status**: Start with overall PASS/FAIL/WARNING status
- **Structured Report**: Group findings by configuration file
- **Actionable**: Provide exact remediation steps with file locations
- **Referenced**: Link to relevant documentation files
- **Deterministic**: Same configs → same report (no subjective analysis)

## Example Usage

**User**: "Validate my ESLint and TypeScript configs"

**Skill Response**:
```
Reading configuration files...
✅ eslint.config.ts found
✅ tsconfig.json found
✅ package.json found

Reading documentation...
✅ @docs/architecture/layer-based-architecture.md
✅ @docs/infrastructure/quality/eslint.md
✅ @docs/infrastructure/language/typescript.md

Running validation checks...
⚙️  ESLint configuration... PASS (3/3 checks)
⚙️  TypeScript configuration... FAIL (2/3 checks)
⚙️  Dependencies... WARNING (1 version mismatch)

Running lint command... ✅ No errors
Running typecheck command... ❌ 2 type errors

---

# Configuration Validation Report

**Status**: FAIL (2 errors, 1 warning)

[... detailed report as shown above ...]
```

## Limitations

- **Read-only**: This skill NEVER modifies configuration files
- **Documentation-based**: Validates against existing docs only
- **No architectural decisions**: Reports mismatches, doesn't recommend new patterns
- **Snapshot validation**: Checks current state, doesn't track changes over time
- **Command execution**: Uses Bash to run lint/typecheck but doesn't fix issues

Use this skill for quick compliance checks. For fixing issues, use appropriate agents (architecture-docs-maintainer, codebase-refactor-auditor) or modify configs manually.