backend-development
npx skills add https://github.com/carvalab/k-skills --skill backend-development
Agent 安装分布
Skill 文档
Backend Development
Node.js/TypeScript and Go. PostgreSQL, Redis. REST APIs.
Related Skills:
kavak-documentation– USE FIRST for Kavak-specific patterns, kbroker, STS, GitLab CI, Docker templatestest-driven-development– USE PROACTIVELY for new features and bug fixes (Red-Green-Refactor)- Check
.claude/CLAUDE.mdor.cursor/rules/*for project-specific conventionsMCP: Use
kavak-platform/plati_querytool to query Kavak internal documentation before implementing.
ð´ MANDATORY: Code Reuse Analysis (GATE)
This is a GATE. You cannot write new code until you complete this analysis.
Why This Matters
AI-generated code often duplicates existing logic because the model doesn’t “see” all relevant files. This creates:
- Bugs that need fixing in multiple places
- Inconsistent behavior across the codebase
- Maintenance nightmare for humans
Your job: Find existing code FIRST, reuse it, extend it, or extract shared logic.
Step 1: Search Comprehensively
STOP and think: Before searching, extract keywords from YOUR task:
- VERBS – What actions? (create, save, send, process, calculate, update, delete, etc.)
- NOUNS – What domain concepts? (the entities mentioned in your task)
- OUTPUT – What type of result? (Model, Response, Event, etc.)
Then search using YOUR task’s actual keywords:
# Search pattern - replace KEYWORD with your actual task keywords:
grep -rn "KEYWORD" --include="*.go" --include="*.ts" . | head -50
# Search for existing services/usecases with your domain term:
grep -rn "func.*KEYWORD\|KEYWORD.*Service\|KEYWORD.*Repository" --include="*.go" . | head -30
# Use codebase_search for semantic search:
codebase_search "how does existing code [your task action]"
codebase_search "where is [your domain concept] implemented"
The goal: Find ANY existing code that does something similar to what your task needs.
Step 2: Read and Evaluate Found Code
For EACH potentially relevant file, read it and answer:
| Question | If YES… |
|---|---|
| Does this do exactly what I need? | Call it directly – inject as dependency |
| Does this do 70%+ of what I need? | Extend it – add method/parameter |
| Does this share 50%+ logic with what I need? | Extract shared helper first |
| Is this only 30% similar? | OK to create new, but document why |
Step 3: Document Your Decision (MANDATORY – Must Output This)
Before writing ANY code, you MUST output this analysis in your response:
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â REUSE ANALYSIS â
â£ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ«
â Task: [brief description of what you need to implement] â
â â
â Keywords searched: â
â - Verbs: [actual verbs you searched] â
â - Nouns: [actual domain terms you searched] â
â â
â Existing code found: â
â 1. [file:line] - [function name] - [what it does] â
â 2. [file:line] - [function name] - [what it does] â
â â
â Similarity assessment: â
â - [file1]: [X]% similar because [reason] â
â â
â Decision: [REUSE | EXTEND | EXTRACT | NEW] â
â Rationale: [1-2 sentences why] â
â Action: [specific action - e.g., "inject existing service"] â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
If you skip this analysis or create code without it, the task FAILS.
Step 4: Apply Decision Matrix
| Similarity | Action | Example |
|---|---|---|
| >70% | REUSE directly | Inject existing service as dependency, call its method |
| 50-70% | EXTRACT shared helper | Create helper function, refactor existing + use in new |
| 30-50% | Consider interface | Create interface both can implement |
| <30% | OK to create new | Document why existing code doesn’t fit |
ð´ Failure Conditions
Your implementation FAILS the Code Reuse Analysis if:
- You create a new file >100 lines without documenting reuse analysis
- You duplicate >50% of logic from an existing file
- You copy-paste code instead of calling existing functions
- You create a new method that does the same thing as an existing one
Core Principles
Architecture: Clean Architecture (4-layer) for new projects â references/architecture.md
Design Principles:
- SOLID – Single Responsibility, Open/Closed, Liskov, Interface Segregation, Dependency Inversion
- DRY – Don’t Repeat Yourself (extract reusable code) â
references/dry-detection.md - YAGNI – You Aren’t Gonna Need It (don’t build unused features)
- KISS – Keep It Simple, Stupid (simplest solution that works)
Comments Rule: Code should be self-documenting. Only add comments when:
- Logic is complex/non-obvious (explain “why”, not “what”)
- Workarounds or edge cases need context
- Public API documentation (JSDoc/GoDoc)
// â BAD: Obvious comment
const age = user.age; // Get user age
// â
GOOD: Explains WHY
// Add 1 day buffer for timezone edge cases in billing cycle
const billingDate = addDays(cycleEnd, 1);
See references/code-quality.md for detailed examples.
â ï¸ Existing Projects Rule
ALWAYS respect existing project structure and patterns:
- Read first – Explore the codebase before making changes
- Follow existing patterns – If project uses a pattern, continue using it
- Don’t force architecture – Don’t refactor to Clean Architecture unless asked
- Incremental improvement – Apply good practices to NEW code you write
- Ask if unclear – When patterns conflict, ask the user
Existing project has flat structure? â Keep flat structure
Existing project has no interfaces? â Don't add interfaces everywhere
Existing project uses callbacks? â Use callbacks (unless migrating)
Only apply Clean Architecture patterns to:
- New greenfield projects
- New modules/features in existing projects (when it fits)
- When explicitly asked to refactor
Quick Start
| Language | Test | Lint |
|---|---|---|
| Node/TS | npm test |
npm run lint |
| Go | go test ./... |
golangci-lint run |
Technology Selection
| Need | Choose |
|---|---|
| TypeScript API | NestJS |
| High concurrency | Go + Chi |
| Go database | pgx/v5 + sqlc |
| Node database | Drizzle (new), keep existing |
| Go Redis | rueidis (new), keep existing |
| Go job queue | River (PostgreSQL-backed) |
| Node job queue | pg-boss (PostgreSQL-backed) |
| Events (Kavak) | kbroker (Kafka-by-REST) |
| Rate limiting | pg-boss throttle / River snooze |
| Testing | Vitest (new Node), Jest (existing) |
| Tracing | OpenTelemetry + dd-trace |
Note: Use kbroker for events between services. Use pg-boss (Node) or River (Go) for job queues.
Common Workflows
New API Endpoint (TDD Approach)
Use
test-driven-developmentskill for Red-Green-Refactor cycle
- Write failing test first â
test-driven-developmentskill - Design endpoint â
references/api-design.md - Set up handler â
references/go/http-handlers.mdorreferences/node/frameworks.md - Add database access â
references/go/database.mdorreferences/node/database.md - Implement auth â
references/authentication.md - Refactor with tests passing â
references/code-quality.md
Add Similar Feature (DRY-First Approach)
CRITICAL: When task says “do X like Y” or “add similar to existing”
- Find existing implementation first – search for the feature mentioned in the task
- Analyze similarity â Is >50% of logic the same?
- If similar, REUSE or EXTRACT:
- >70% similar: Inject existing service, call its method
- 50-70% similar: Extract shared helper, refactor existing to use it
- <50% similar: OK to create new, but keep it small
- New code should be <50 lines – if more, you probably missed reuse opportunity
- Test both old and new paths â Ensure refactoring didn’t break existing
WRONG vs RIGHT:
| Approach | Result |
|---|---|
| â WRONG | Create new file (50-100+ lines) that duplicates existing logic |
| â RIGHT | Inject existing service, call its method (5-10 lines) |
Fix Slow Query
- Profile query â
references/debugging.md(EXPLAIN ANALYZE) - Add indexes â
references/performance.md - Add caching â
references/go/redis-queues.mdorreferences/node/database.md
Deploy New Service
- Write Dockerfile â
references/devops/docker.md - Set up CI/CD â
references/devops/ci-cd.md
Debug Production Issue
- Check logs/traces â
references/debugging.md - Profile if slow â
references/debugging.md(pprof/clinic.js) - Check DB queries â
references/debugging.md(pg_stat_statements)
References
| Reference | When to Use |
|---|---|
| Go | |
references/go/http-handlers.md |
Set up Chi routes, handlers, middleware |
references/go/database.md |
Implement pgx/v5, sqlc queries |
references/go/patterns.md |
Apply error handling, validation, testing |
references/go/redis-queues.md |
Add rueidis caching, River job queue |
| Node.js | |
references/node/frameworks.md |
Set up NestJS, Express, Fastify |
references/node/database.md |
Implement Drizzle, Prisma, caching |
references/node/patterns.md |
Apply validation, errors, testing |
| DevOps | |
references/devops/docker.md |
Write Dockerfiles, compose, health checks, DataDog metrics |
references/devops/ci-cd.md |
Configure GitLab CI pipelines |
| Cross-Cutting | |
references/architecture.md |
Clean Architecture (4-layer), microservices, events |
references/code-quality.md |
SOLID, DRY, YAGNI, KISS, design patterns |
references/dry-detection.md |
MANDATORY – DRY detection, code reuse patterns |
references/api-design.md |
Design REST endpoints, versioning |
references/authentication.md |
Implement OAuth 2.1, JWT, RBAC |
references/security.md |
Apply OWASP Top 10, input validation |
references/performance.md |
Optimize caching, queries, pooling |
references/testing.md |
Write unit, integration, E2E tests |
references/debugging.md |
Debug with logs, profilers, tracing |
Kavak-Only References
Use when working on Kavak projects.
| Reference | When to Use |
|---|---|
references/kavak/kbroker.md |
Publish/subscribe events between services |
references/kavak/queues-ratelimit.md |
Job queues, rate limiting with River/pg-boss |
references/kavak/microservice-auth.md |
Authenticate between services (STS) |
references/kavak/gitlab-ci.md |
Set up kavak-it/ci-jobs v3 pipelines |
references/kavak/docker-images.md |
Build with docker-debian base |
references/kavak/workload-config.md |
Configure .kavak/ dir, cron jobs |
references/kavak/logging-metrics.md |
Use kvklog, kvkmetric SDKs |