Want to implement solutions? Check out the Tutorial Series
"Why do you have 24 ESLint configurations? Isn't one good configuration enough?"
This is the most common question about the AI Programming Toolkit. And it's the right question to ask.
The answer reveals the entire philosophy behind the toolkit.
The One-Size-Fits-All Fallacy
Many popular ESLint configurations take a one-size-fits-all approach:
npm install eslint-config-popular
One configuration, thousands of rules, works everywhere.
Except... it doesn't.
The Problems with One-Size-Fits-All
Problem 1: Context Blindness
A rule that makes sense for a library doesn't make sense for an app:
// In a library - console.log is usually a mistake
export function validateUser(user: User) {
console.log('Validating user:', user); // ❌ Should be removed
return user.email && user.name;
}
// In a backend app - console.log is often fine for logging
app.post('/api/orders', async (req, res) => {
console.log('Processing order:', req.body); // ✅ Useful logging
const order = await processOrder(req.body);
res.json(order);
});
Should console.log be an error? It depends on context.
Problem 2: Collaboration Blindness
Rules for AI-generated code differ from rules for human-written code:
// AI-generated - unused variables are common mistakes
async function fetchUser(userId: string) {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json(); // AI often creates this but forgets to use it
return response; // ❌ Should return data
}
// Human-written - unused variable might be intentional
function handleEvent(event: Event, _metadata: Metadata) {
// _metadata prefixed with _ - intentionally unused, kept for API consistency
return processEvent(event);
}
Should unused variables be errors? It depends on who's writing the code.
Problem 3: Strictness Blindness
The right strictness depends on your team and project:
// Startup prototype - move fast
const config = {
apiUrl: process.env.API_URL, // Could be undefined, we'll fix it later
};
// Financial system - maximum safety
const config: Config = {
apiUrl: requireEnv('API_URL'), // Must throw if missing
};
Should undefined be allowed? It depends on your risk tolerance.
The Context-Specific Philosophy
The AI Programming Toolkit takes a different approach: context-specific tooling.
Instead of one configuration, it provides:
- 3 collaboration patterns (AI-AI, AI-Human, Human-Human)
- 3 strictness levels (Maximum, Balanced, Relaxed)
- 8 specialized contexts (Monorepo, Backend, Frontend, CLI, Fullstack, Library, Legacy, Migration)
That's potentially 3 × 3 × 8 = 72 combinations.
But we don't need all 72. We need the 24 most common combinations.
The 24 Configurations
Here's how they break down:
Core Patterns (12 configurations):
ai-ai-maximum
ai-ai-balanced
ai-ai-relaxed
ai-human-maximum
ai-human-balanced
ai-human-relaxed
human-human-maximum
human-human-balanced
human-human-relaxed
library-maximum
library-balanced
library-relaxed
Legacy & Migration (2 configurations):
legacy-balanced
migration-balanced
Specialized Contexts (10 configurations):
monorepo-balanced
backend-balanced
frontend-balanced
cli-balanced
fullstack-balanced
ai-ai-monorepo
ai-human-monorepo
backend-strict
frontend-strict
library-strict
Each configuration is optimized for its specific context.
Why This Works Better
1. Precision Over Generality
Each configuration targets specific patterns and catches specific mistakes:
AI-AI Maximum:
- Every variable must be used
- Every async operation must be awaited
- No
anytypes allowed - Maximum type coverage
AI-Human Balanced:
- Most safety rules enabled
- Pragmatic exceptions (like
_unusedVar) - Good type coverage without being pedantic
- Focuses on common mistakes
Human-Human Relaxed:
- Core safety rules only
- Trusts developer judgment
- Minimal friction
- Maximum flexibility
2. Clear Intent
Configuration name tells you exactly what it's for:
{
"extends": ["optimize-ai/ai-human-balanced"]
}
Anyone reading your config knows:
- AI-Human: Team uses AI assistance
- Balanced: Pragmatic safety without excessive strictness
Compare to:
{
"extends": ["popular-config-v3"]
}
What does "v3" mean? What's it optimized for? Unclear.
3. Easy Evolution
As your project evolves, you can change configurations:
Starting out (prototype):
{
"extends": ["optimize-ai/ai-human-relaxed"]
}
Production-ready:
{
"extends": ["optimize-ai/ai-human-balanced"]
}
Critical system:
{
"extends": ["optimize-ai/ai-human-maximum"]
}
The path forward is clear.
The Gradual Adoption Philosophy
Adding strict linting to an existing project is painful. You run ESLint and see:
❌ 1,247 errors
⚠️ 834 warnings
Most teams give up at this point.
The AI Programming Toolkit embraces gradual adoption:
Step 1: Start with Legacy Config
{
"extends": ["optimize-ai/legacy-balanced"]
}
The legacy config is forgiving:
- Only errors for actual bugs (forgotten
await, unsafe operations) - Warnings for style issues
- Allows gradual cleanup
Step 2: Fix Critical Issues First
Focus on functional correctness:
# Fix only errors, ignore warnings
npx eslint . --fix --quiet
This catches real bugs without overwhelming you.
Step 3: Migrate Section by Section
Use the migration config for new code:
{
"extends": ["optimize-ai/legacy-balanced"],
"overrides": [
{
"files": ["src/features/new-feature/**/*"],
"extends": ["optimize-ai/ai-human-balanced"]
}
]
}
New code gets stricter rules. Old code migrates gradually.
Step 4: Full Migration
Once most code meets standards:
{
"extends": ["optimize-ai/ai-human-balanced"]
}
You've migrated without a "big bang" rewrite.
The Modular Philosophy
Each of the 9 modules in the toolkit is independent:
- ESLint Configurations - Can use alone
- Git Conventions - Can use alone
- Project Structure - Can use alone
- Documentation Standards - Can use alone
- Testing Strategies - Can use alone
- TypeScript Patterns - Can use alone
- CI/CD Automation - Can use alone
- Prompt Engineering - Can use alone
- Code Review - Can use alone
But they complement each other:
- ESLint + TypeScript = Strong type safety + linting
- Git + Documentation = Clear history + context
- Testing + CI/CD = Automated validation
- All together = Comprehensive guardrails
You can adopt them in any order:
Phase 1: Start with ESLint (immediate value) Phase 2: Add Git conventions (better history) Phase 3: Improve testing (more confidence) Phase 4: Add CI/CD (automated enforcement) Phase 5: Enhance documentation (better context for AI)
No forced "all or nothing" adoption.
Why Flexibility Matters
Different teams need different approaches:
Startup Building MVP
Needs:
- Move fast
- Prove product-market fit
- Technical debt is acceptable
Configuration:
{
"extends": ["optimize-ai/ai-human-relaxed"]
}
Modules: ESLint + Git conventions (quick wins)
Scale-up Building Production System
Needs:
- Balance speed and quality
- Maintainable codebase
- Growing team
Configuration:
{
"extends": ["optimize-ai/ai-human-balanced"]
}
Modules: ESLint + Git + Testing + CI/CD + Documentation
Enterprise Maintaining Critical System
Needs:
- Maximum reliability
- Consistency with existing patterns
- Compliance requirements
Configuration:
{
"extends": ["optimize-ai/human-human-maximum"]
}
Modules: All 9 modules, maximum strictness
Same toolkit, different configurations, appropriate for each context.
The Open Source Philosophy
The AI Programming Toolkit is:
- MIT Licensed - Use freely, modify as needed
- Actively maintained - Regular updates based on research
- Community-driven - Accepting contributions
- Evidence-based - Changes backed by research and experience
Why open source?
- Transparency - You can see exactly what rules are enabled and why
- Customization - Fork and modify for your specific needs
- Community - Benefit from collective experience
- Evolution - As AI tools evolve, the toolkit evolves
The Philosophy in One Sentence
Provide context-specific guardrails that help AI coding assistants work safely and effectively, while remaining flexible enough for any team to adopt gradually.
What You've Learned
Across this 3-part series, you've learned:
Part 1: The Problem
- AI-generated code has specific quality issues
- 4x code clones, forgotten
await, maintenance debt - Velocity gains get consumed by maintenance costs
Part 2: The Research
- Three collaboration patterns (AI-AI, AI-Human, Human-Human)
- Evidence-based approach to guardrails
- Different patterns need different rules
Part 3: The Philosophy
- Why 24 configurations instead of one
- Context-specific tooling beats one-size-fits-all
- Gradual adoption over big-bang migration
- Modular approach allows flexible adoption
Ready to Implement?
Now that you understand the philosophy, you're ready to start implementing these guardrails.
Jump to the Tutorial Series to:
- Set up your first ESLint configuration
- Implement Git conventions
- Add automated checks
- See before/after prompt engineering examples
The tutorial series is practical, hands-on, and designed to get you results in 30 minutes.
What's your team's collaboration pattern? Start with the right configuration for your context, then evolve as your needs change. The toolkit grows with you.
Questions or feedback? The toolkit is open source and actively seeking contributors. Share your experiences and help improve AI-assisted development for everyone.