Service Architecture Conventions
SkillAI & modelsService structure conventions for this codebase: routing, layering, and where code lives. Use whenever writing or modifying a service's server entry, route definitions, handlers, or adapters. Loads inline so it shapes structure as code is written.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Service Architecture Conventions skill
What this skill tells your AI
The instructions your AI receives, as published by thedecipherist/claude-code-mastery-project-starter-kit in .claude/skills/api-conventions/SKILL.md and read by ahel’s review.
Every service is three layers, one direction: server.ts → handlers/ → adapters/. Apply while writing, not after.
Versioning
- All routes live under
/api/v1/. New endpoints are versioned from the first line. No unversioned routes "for now."
server.ts is thin
server.tsdefines routes and delegates. Nothing else.- No business logic in
server.tsor in a route definition. A route wires the request to a handler and returns its result.
handlers/ hold the logic
- Business logic lives in
handlers/, one file per domain. - A handler owns its domain's rules and orchestration. It calls adapters for anything external. It does not reach outside the process itself.
adapters/ wrap everything external
- Database, external APIs, queues, anything outside the process goes through an adapter in
adapters/. Handlers never touch them directly. - The database adapter uses StrictDB when it's installed, otherwise the native driver. Never Mongoose. A handler that imports a driver or calls an external API inline is wrong, that belongs in an adapter. The data adapter is the one place driver code lives, which is also where the
mongodb-rulesapply.
Service (package) separation
- A service owns its domain and is reached through its interface. A package does not reach into another package's internals or its data. Call the owning service.
- Code two services both need is hoisted to a shared layer, never imported sideways from a sibling.
The test: routes in server.ts read request-in, handler-call, response-out. Logic sits in handlers/. Anything that leaves the process goes through adapters/, and the data adapter uses StrictDB if installed, the native driver otherwise.
Signals
- GitHub stars
- 338
- Forks
- 40
- Last commit
- Jun 2026
Advanced
- Catalog kind
- skill
- Gateway key
api-conventions-thedecipherist- Source
- github.com/thedecipherist/claude-code-mastery-project-starter-kit