add-provider
Checklist for adding a new AI provider (image, video, text, audio) that satisfies all 5 integration principles — ACL, bulkhead, idempotency, observability, and…
Safe procedure for decomposing a god file (400+ LOC) into a sub-package without breaking any imports. Load when a file exceeds 400 lines or mixes multiple concerns. Implements vibecodex Principles A1 and A8 — folder-instead-of-file with backward-compatible re-exports.
$ npx -y skills add yerdaulet-damir/vibe-coding-rules --skill split-monolith --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/split-monolithContext preview
The summary Claude sees to decide when to auto-load this skill.
Safe procedure for decomposing a god file (400+ LOC) into a sub-package without breaking any imports. Load when a file exceeds 400 lines or mixes multiple concerns. Implements vibecodex Principles A1 and A8 — folder-instead-of-file with backward-compatible re-exports.
name: split-monolith description: Safe procedure for decomposing a god file (400+ LOC) into a sub-package without breaking any imports. Load when a file exceeds 400 lines or mixes multiple concerns. Implements vibecodex Principles A1 and A8 — folder-instead-of-file with backward-compatible re-exports.
A file split done wrong breaks every caller. Follow this procedure exactly — it is reversible at every step.
---
wc -l app/services/<file>.py
| Lines | Action | |-------|--------| | < 400 | Do not split — you're solving a non-problem | | 400–600 | Plan the split now, execute when convenient | | > 600 | Split immediately (Principle A7 hard cap) |
Also ask: does this file mix multiple concerns? A file that is long but cohesive is better than a premature split.
---
Do NOT split by size. Split by **type of responsibility**.
Good splits (by domain):
wallet_service.py (1200 LOC) → wallet/user.py ← user-facing operations (charge, refund) wallet/admin.py ← admin operations (top-up, override) wallet/history.py ← read-only queries
Good splits (by layer):
generation_service.py (1000 LOC) → generation/orchestrator.py ← coordinates the flow generation/cost.py ← cost calculation logic generation/storage.py ← result persistence
Bad splits (by size only — don't do this):
big_service.py → big_service_part1.py ← meaningless big_service_part2.py ← meaningless
Write the target structure before touching any file.
---
mkdir app/services/<domain>/
Do NOT move any code yet.
---
For each sub-file, copy (not move) the relevant functions:
# Create the new file with the relevant subset touch app/services/<domain>/user.py # Copy relevant classes/functions from the original
Each sub-file must:
---
This is the most important step. Every name that existed in the original file must still be importable from the same path.
# app/services/<domain>/__init__.py
# Principle A8: re-export everything so callers don't change.
from app.services.<domain>.user import CreditsUserService
from app.services.<domain>.admin import CreditsAdminService
from app.services.<domain>.user import get_credits_user_service
# Backward-compat alias if the old class had a different name
CreditsService = CreditsUserService # old name → new class
__all__ = [
"CreditsUserService",
"CreditsAdminService",
"CreditsService", # backward compat
"get_credits_user_service",
]---
# Check every file that imported from the old module still works python3 -c "from app.services.<domain> import <OldClassName>" python3 -c "from app.services.<domain> import <AnotherClass>" # Run the full test suite pytest tests/ -x -q
All tests must be GREEN before deleting the original file.
---
Only after Step 5 passes:
rm app/services/<original_file>.py
Run tests again:
pytest tests/ -x -q bash scripts/lint-architecture.sh
Both must pass.
---
| Mistake | Consequence | Prevention | |---------|------------|------------| | Split before writing `__init__.py` | Import errors everywhere | Always create `__init__.py` first | | Split by size, not responsibility | Sub-files still coupled | Ask: "what is the single job of this file?" | | Forget to re-export old names | Callers break silently | List every public name before splitting | | Move code instead of copy+verify | Can't roll back | Copy first, delete only after tests pass | | Split and refactor at same time | Impossible to debug | One PR = one split. No logic changes. |
---
The split was done correctly when:
54 production architecture principles your AI coding agent (Claude Code, Cursor) follows automatically. Drop-in CLAUDE.md, .cursor/rules/, and .claude/skills/ for FastAPI, Next.js 15, and Go 1.22+. MIT.
Repo: yerdaulet-damir/vibe-coding-rules
Checklist for adding a new AI provider (image, video, text, audio) that satisfies all 5 integration principles — ACL, bulkhead, idempotency, observability, and…
Systematic 5-step backend debugging flow for AI-coded FastAPI apps. Load this skill when a bug is reported, a test fails, or unexpected behavior appears in any…
Systematic 5-step debugging flow for Next.js 15 + React 19 + TypeScript apps. Load when a UI bug is reported, hydration error appears, Server Action returns…
Systematic 5-step debugging flow for Go 1.22+ services. Load when a test fails, a goroutine leaks, a downstream provider hangs, errors lose context, or…
Pre-flight checklist for adding a new feature to a Go 1.22+ service. Load when creating a new endpoint, internal package, external integration, or background…
Pre-flight checklist for adding a new feature to a Next.js 15 + TypeScript app. Load when creating a new page, route, server action, or feature module. Forces…