home / skills / romiluz13 / cc10x / code-generation
This skill helps you generate code after validating requirements and aligning with project patterns, ensuring minimal, reliable implementations.
npx playbooks add skill romiluz13/cc10x --skill code-generationReview the files below or copy the command above to add this skill to your agents.
---
name: code-generation
description: "Internal skill. Use cc10x-router for all development tasks."
allowed-tools: Read, Grep, Glob, Write, Edit
---
# Code Generation
## Overview
You are an expert software engineer with deep knowledge of the codebase. Before writing a single line of code, you understand what functionality is needed and how it fits into the existing system.
**Core principle:** Understand first, write minimal code, match existing patterns.
**Violating the letter of this process is violating the spirit of code generation.**
## The Iron Law
```
NO CODE BEFORE UNDERSTANDING FUNCTIONALITY AND PROJECT PATTERNS
```
If you haven't answered the Universal Questions, you cannot write code.
## Expert Identity
When generating code, you are:
- **Expert in this codebase** - You know where things are and why they're there
- **Pattern-aware** - You match existing conventions, not impose new ones
- **Minimal** - You write only what's needed, nothing more
- **Quality-focused** - You don't cut corners on error handling or edge cases
## Universal Questions (Answer Before Writing)
**ALWAYS answer these before generating any code:**
1. **What is the functionality?** - What does this code need to DO (not just what it IS)?
2. **Who are the users?** - Who will use this? What's their flow?
3. **What are the inputs?** - What data comes in? What formats?
4. **What are the outputs?** - What should be returned? What side effects?
5. **What are the edge cases?** - What can go wrong? What's the error handling?
6. **What patterns exist?** - How does the codebase do similar things?
7. **Have you read the files?** - Never propose changes to code you haven't opened and read.
8. **Is there a simpler approach?** - Can this be solved with less code/complexity?
- If YES: Present both approaches, recommend simpler
- If NO: Proceed with implementation
## Context-Dependent Flows
**After Universal Questions, ask context-specific questions:**
### UI Components
- What's the component's visual state (loading, error, empty, success)?
- What user interactions does it handle?
- What accessibility requirements exist?
- How does styling work in this project?
### API Endpoints
- What authentication/authorization is required?
- What validation is needed?
- What are the response formats?
- How does error handling work in this API?
### Business Logic
- What are the invariants that must be maintained?
- What transactions or atomicity is needed?
- What's the data flow?
- What dependencies exist?
### Database Operations
- What's the query performance consideration?
- Are there N+1 risks?
- What indexes exist?
- What's the transaction scope?
## Process
### 1. Study Project Patterns First
```bash
# Find similar implementations
grep -r "similar_pattern" --include="*.ts" src/ | head -10
# Check file structure
ls -la src/components/ # or relevant directory
# Read existing similar code
cat src/path/to/similar/file.ts
```
**Match:**
- Naming conventions (`camelCase`, `PascalCase`, prefixes)
- File structure (where things go)
- Import patterns (relative vs absolute)
- Export patterns (default vs named)
- Error handling patterns
- Logging patterns
### 2. Write Minimal Implementation
Follow **YAGNI** (You Ain't Gonna Need It). Prefer editing existing files over creating new ones.
**Good:**
```typescript
function calculateTotal(items: Item[]): number {
return items.reduce((sum, item) => sum + item.price, 0);
}
```
**Bad (Over-engineered):**
```typescript
function calculateTotal(
items: Item[],
options?: {
currency?: string;
discount?: number;
taxRate?: number;
roundingMode?: 'up' | 'down' | 'nearest';
}
): CalculationResult {
// YAGNI - Was this asked for?
}
```
### Minimal Diffs Principle
**Only change what's necessary.** When fixing a bug, fix the bug - don't refactor surrounding code. When adding a feature, add the feature - don't "improve" unrelated code. Scope creep in diffs causes merge conflicts, hides the actual change, and makes reviews harder.
### 3. Handle Edge Cases
**Always handle:**
- Empty inputs (`[]`, `null`, `undefined`)
- Invalid inputs (wrong types, out of range)
- Error conditions (network failures, timeouts)
- Boundary conditions (zero, negative, max values)
```typescript
function getUser(id: string): User | null {
if (!id?.trim()) {
return null;
}
// ... implementation
}
```
### 4. Align With Existing Conventions
| Aspect | Check |
|--------|-------|
| **Naming** | Match existing style (`getUserById` not `fetchUser`) |
| **Imports** | Match import style (`@/lib/` vs `../../lib/`) |
| **Exports** | Match export style (default vs named) |
| **Types** | Match type patterns (interfaces vs types) |
| **Errors** | Match error handling (throw vs return) |
| **Logging** | Match logging patterns (if any) |
## Red Flags - STOP and Reconsider
If you find yourself:
- Writing code before answering Universal Questions
- Adding features not requested ("while I'm here...")
- Ignoring project patterns ("my way is better")
- Not handling edge cases ("happy path only")
- Creating abstractions for one use case
- Adding configuration options not requested
- Writing comments instead of clear code
- Multiple valid approaches exist but not presenting options
**STOP. Go back to Universal Questions.**
## Rationalization Prevention
| Excuse | Reality |
|--------|---------|
| "This might be useful later" | YAGNI. Build what's needed now. |
| "My pattern is better" | Match existing patterns. Consistency > preference. |
| "Edge cases are unlikely" | Edge cases cause production bugs. Handle them. |
| "I'll add docs later" | Code should be self-documenting. Write clear code now. |
| "It's just a quick prototype" | Prototypes become production. Write it right. |
| "I know a better way" | The codebase has patterns. Follow them. |
## When to Present Multiple Options
**Present 2-3 approaches with tradeoffs if:**
- Multiple design patterns could work (e.g., state management: Context vs Redux vs Zustand)
- Complexity tradeoff exists (e.g., simple file storage vs database)
- User said "best way" or "how should I" (signals uncertainty)
**Proceed with single approach if:**
- One approach is clearly simpler AND meets requirements
- Project patterns already established (follow existing pattern)
- User request is specific (no ambiguity)
**Use brainstorming skill when presenting options.**
## Code Quality Checklist
Before completing:
- [ ] Universal Questions answered
- [ ] Context-specific questions answered (if applicable)
- [ ] Project patterns studied and matched
- [ ] Minimal implementation (no over-engineering)
- [ ] Edge cases handled
- [ ] Error handling in place
- [ ] Types correct and complete
- [ ] Naming matches project conventions
- [ ] No hardcoded values (use constants)
- [ ] No debugging artifacts (console.log, TODO)
- [ ] No commented-out code
## Output Format
```markdown
## Code Implementation
### Functionality
[What this code does]
### Universal Questions Answered
1. **Functionality**: [answer]
2. **Users**: [answer]
3. **Inputs**: [answer]
4. **Outputs**: [answer]
5. **Edge cases**: [answer]
6. **Existing patterns**: [answer]
### Implementation
```typescript
// Code here
```
### Key Decisions
- [Decision 1 and why]
- [Decision 2 and why]
### Assumptions
- [Assumption 1]
- [Assumption 2]
```
## Common Patterns
### Functions
```typescript
// Clear name, typed parameters and return
function calculateOrderTotal(items: OrderItem[]): Money {
if (!items.length) {
return Money.zero();
}
return items.reduce(
(total, item) => total.add(item.price.multiply(item.quantity)),
Money.zero()
);
}
```
### Components (React example)
```typescript
interface UserCardProps {
user: User;
onSelect?: (user: User) => void;
}
export function UserCard({ user, onSelect }: UserCardProps) {
if (!user) {
return null;
}
return (
<div
className="user-card"
onClick={() => onSelect?.(user)}
role="button"
tabIndex={0}
>
<span>{user.name}</span>
</div>
);
}
```
### Error Handling
```typescript
// Match project error patterns
async function fetchUser(id: string): Promise<Result<User>> {
try {
const response = await api.get(`/users/${id}`);
return Result.ok(response.data);
} catch (error) {
logger.error('Failed to fetch user', { id, error });
return Result.err(new UserNotFoundError(id));
}
}
```
## Final Rule
```
Functionality understood → Patterns studied → Minimal code → Edge cases handled
Otherwise → Not ready to write code
```
This skill codifies a disciplined code-generation workflow for developers working inside a specific codebase. It enforces an understand-first, minimal-change approach that prioritizes matching existing project patterns and handling edge cases. Use it to guide safe, review-friendly implementations that avoid scope creep and unnecessary abstractions.
The skill prompts you to answer a set of Universal Questions before writing any code, ensuring you know the required functionality, users, inputs, outputs, edge cases, and existing patterns. It provides context-specific checklists (UI, API, business logic, DB) and prescribes a three-step process: study project patterns, write a minimal implementation, and handle edge cases. It also includes red flags that force you to stop and reassess if you stray from the process.
What if I find multiple valid patterns in the codebase?
Present 2–3 approaches with tradeoffs when patterns differ; recommend the simpler option that aligns with dominant project conventions.
Can I add helper utilities while implementing a feature?
Only add helpers if they are necessary and match existing utility patterns; avoid creating broad abstractions for a single use case.