@tinkcarlos/skillora 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# API Contract Guide
|
|
2
|
+
|
|
3
|
+
> Define APIs before implementation. Swagger/OpenAPI is MANDATORY.
|
|
4
|
+
|
|
5
|
+
## API-First Development
|
|
6
|
+
|
|
7
|
+
### Workflow
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
1. Write OpenAPI spec
|
|
11
|
+
2. Review with frontend
|
|
12
|
+
3. Generate server stubs (optional)
|
|
13
|
+
4. Implement endpoints
|
|
14
|
+
5. Validate against spec
|
|
15
|
+
6. Deploy with Swagger UI
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## OpenAPI Specification Template
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
openapi: 3.0.3
|
|
24
|
+
info:
|
|
25
|
+
title: API Name
|
|
26
|
+
description: API description
|
|
27
|
+
version: 1.0.0
|
|
28
|
+
|
|
29
|
+
servers:
|
|
30
|
+
- url: http://localhost:8000/api
|
|
31
|
+
description: Development
|
|
32
|
+
- url: https://api.example.com
|
|
33
|
+
description: Production
|
|
34
|
+
|
|
35
|
+
paths:
|
|
36
|
+
/users:
|
|
37
|
+
get:
|
|
38
|
+
summary: List all users
|
|
39
|
+
tags: [Users]
|
|
40
|
+
parameters:
|
|
41
|
+
- name: page
|
|
42
|
+
in: query
|
|
43
|
+
schema:
|
|
44
|
+
type: integer
|
|
45
|
+
default: 1
|
|
46
|
+
- name: limit
|
|
47
|
+
in: query
|
|
48
|
+
schema:
|
|
49
|
+
type: integer
|
|
50
|
+
default: 20
|
|
51
|
+
responses:
|
|
52
|
+
200:
|
|
53
|
+
description: Success
|
|
54
|
+
content:
|
|
55
|
+
application/json:
|
|
56
|
+
schema:
|
|
57
|
+
type: object
|
|
58
|
+
properties:
|
|
59
|
+
data:
|
|
60
|
+
type: array
|
|
61
|
+
items:
|
|
62
|
+
$ref: '#/components/schemas/User'
|
|
63
|
+
total:
|
|
64
|
+
type: integer
|
|
65
|
+
401:
|
|
66
|
+
$ref: '#/components/responses/Unauthorized'
|
|
67
|
+
|
|
68
|
+
post:
|
|
69
|
+
summary: Create user
|
|
70
|
+
tags: [Users]
|
|
71
|
+
requestBody:
|
|
72
|
+
required: true
|
|
73
|
+
content:
|
|
74
|
+
application/json:
|
|
75
|
+
schema:
|
|
76
|
+
$ref: '#/components/schemas/UserCreate'
|
|
77
|
+
responses:
|
|
78
|
+
201:
|
|
79
|
+
description: Created
|
|
80
|
+
content:
|
|
81
|
+
application/json:
|
|
82
|
+
schema:
|
|
83
|
+
$ref: '#/components/schemas/User'
|
|
84
|
+
400:
|
|
85
|
+
$ref: '#/components/responses/BadRequest'
|
|
86
|
+
422:
|
|
87
|
+
$ref: '#/components/responses/ValidationError'
|
|
88
|
+
|
|
89
|
+
/users/{id}:
|
|
90
|
+
get:
|
|
91
|
+
summary: Get user by ID
|
|
92
|
+
tags: [Users]
|
|
93
|
+
parameters:
|
|
94
|
+
- name: id
|
|
95
|
+
in: path
|
|
96
|
+
required: true
|
|
97
|
+
schema:
|
|
98
|
+
type: integer
|
|
99
|
+
responses:
|
|
100
|
+
200:
|
|
101
|
+
description: Success
|
|
102
|
+
content:
|
|
103
|
+
application/json:
|
|
104
|
+
schema:
|
|
105
|
+
$ref: '#/components/schemas/User'
|
|
106
|
+
404:
|
|
107
|
+
$ref: '#/components/responses/NotFound'
|
|
108
|
+
|
|
109
|
+
components:
|
|
110
|
+
schemas:
|
|
111
|
+
User:
|
|
112
|
+
type: object
|
|
113
|
+
required: [id, email, name]
|
|
114
|
+
properties:
|
|
115
|
+
id:
|
|
116
|
+
type: integer
|
|
117
|
+
email:
|
|
118
|
+
type: string
|
|
119
|
+
format: email
|
|
120
|
+
name:
|
|
121
|
+
type: string
|
|
122
|
+
created_at:
|
|
123
|
+
type: string
|
|
124
|
+
format: date-time
|
|
125
|
+
|
|
126
|
+
UserCreate:
|
|
127
|
+
type: object
|
|
128
|
+
required: [email, name, password]
|
|
129
|
+
properties:
|
|
130
|
+
email:
|
|
131
|
+
type: string
|
|
132
|
+
format: email
|
|
133
|
+
name:
|
|
134
|
+
type: string
|
|
135
|
+
minLength: 2
|
|
136
|
+
password:
|
|
137
|
+
type: string
|
|
138
|
+
minLength: 8
|
|
139
|
+
|
|
140
|
+
Error:
|
|
141
|
+
type: object
|
|
142
|
+
properties:
|
|
143
|
+
code:
|
|
144
|
+
type: string
|
|
145
|
+
message:
|
|
146
|
+
type: string
|
|
147
|
+
details:
|
|
148
|
+
type: object
|
|
149
|
+
|
|
150
|
+
responses:
|
|
151
|
+
BadRequest:
|
|
152
|
+
description: Bad request
|
|
153
|
+
content:
|
|
154
|
+
application/json:
|
|
155
|
+
schema:
|
|
156
|
+
$ref: '#/components/schemas/Error'
|
|
157
|
+
|
|
158
|
+
Unauthorized:
|
|
159
|
+
description: Authentication required
|
|
160
|
+
content:
|
|
161
|
+
application/json:
|
|
162
|
+
schema:
|
|
163
|
+
$ref: '#/components/schemas/Error'
|
|
164
|
+
|
|
165
|
+
NotFound:
|
|
166
|
+
description: Resource not found
|
|
167
|
+
content:
|
|
168
|
+
application/json:
|
|
169
|
+
schema:
|
|
170
|
+
$ref: '#/components/schemas/Error'
|
|
171
|
+
|
|
172
|
+
ValidationError:
|
|
173
|
+
description: Validation failed
|
|
174
|
+
content:
|
|
175
|
+
application/json:
|
|
176
|
+
schema:
|
|
177
|
+
$ref: '#/components/schemas/Error'
|
|
178
|
+
|
|
179
|
+
securitySchemes:
|
|
180
|
+
bearerAuth:
|
|
181
|
+
type: http
|
|
182
|
+
scheme: bearer
|
|
183
|
+
bearerFormat: JWT
|
|
184
|
+
|
|
185
|
+
security:
|
|
186
|
+
- bearerAuth: []
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Framework Integration
|
|
192
|
+
|
|
193
|
+
### Python FastAPI
|
|
194
|
+
|
|
195
|
+
```python
|
|
196
|
+
from fastapi import FastAPI
|
|
197
|
+
from fastapi.openapi.utils import get_openapi
|
|
198
|
+
|
|
199
|
+
app = FastAPI(
|
|
200
|
+
title="My API",
|
|
201
|
+
description="API description",
|
|
202
|
+
version="1.0.0",
|
|
203
|
+
docs_url="/docs", # Swagger UI
|
|
204
|
+
redoc_url="/redoc", # ReDoc
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
# Custom OpenAPI schema
|
|
208
|
+
def custom_openapi():
|
|
209
|
+
if app.openapi_schema:
|
|
210
|
+
return app.openapi_schema
|
|
211
|
+
openapi_schema = get_openapi(
|
|
212
|
+
title="My API",
|
|
213
|
+
version="1.0.0",
|
|
214
|
+
routes=app.routes,
|
|
215
|
+
)
|
|
216
|
+
app.openapi_schema = openapi_schema
|
|
217
|
+
return app.openapi_schema
|
|
218
|
+
|
|
219
|
+
app.openapi = custom_openapi
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Node.js Express
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
const swaggerJsdoc = require('swagger-jsdoc');
|
|
226
|
+
const swaggerUi = require('swagger-ui-express');
|
|
227
|
+
|
|
228
|
+
const options = {
|
|
229
|
+
definition: {
|
|
230
|
+
openapi: '3.0.0',
|
|
231
|
+
info: {
|
|
232
|
+
title: 'My API',
|
|
233
|
+
version: '1.0.0',
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
apis: ['./routes/*.js'],
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const specs = swaggerJsdoc(options);
|
|
240
|
+
app.use('/docs', swaggerUi.serve, swaggerUi.setup(specs));
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Contract Verification Checklist
|
|
246
|
+
|
|
247
|
+
### Before Implementation
|
|
248
|
+
|
|
249
|
+
- [ ] OpenAPI spec written
|
|
250
|
+
- [ ] All endpoints documented
|
|
251
|
+
- [ ] Request/response schemas defined
|
|
252
|
+
- [ ] Error responses documented
|
|
253
|
+
- [ ] Auth requirements specified
|
|
254
|
+
- [ ] Frontend team reviewed and approved
|
|
255
|
+
|
|
256
|
+
### After Implementation
|
|
257
|
+
|
|
258
|
+
- [ ] Swagger UI accessible
|
|
259
|
+
- [ ] All endpoints match spec
|
|
260
|
+
- [ ] Response schemas validated
|
|
261
|
+
- [ ] Error codes match documentation
|
|
262
|
+
- [ ] Examples work in Swagger UI
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Frontend Mock Generation
|
|
267
|
+
|
|
268
|
+
From OpenAPI spec, generate mocks:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// Generated from OpenAPI spec
|
|
272
|
+
export interface User {
|
|
273
|
+
id: number;
|
|
274
|
+
email: string;
|
|
275
|
+
name: string;
|
|
276
|
+
created_at: string;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export interface UserCreate {
|
|
280
|
+
email: string;
|
|
281
|
+
name: string;
|
|
282
|
+
password: string;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Mock data matching schema
|
|
286
|
+
export const mockUsers: User[] = [
|
|
287
|
+
{
|
|
288
|
+
id: 1,
|
|
289
|
+
email: 'user@example.com',
|
|
290
|
+
name: 'Test User',
|
|
291
|
+
created_at: '2024-01-01T00:00:00Z'
|
|
292
|
+
}
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
// Mock API matching endpoints
|
|
296
|
+
export const mockApi = {
|
|
297
|
+
getUsers: async (): Promise<{ data: User[], total: number }> => {
|
|
298
|
+
return { data: mockUsers, total: mockUsers.length };
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
createUser: async (data: UserCreate): Promise<User> => {
|
|
302
|
+
return { ...mockUsers[0], ...data, id: Date.now() };
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
getUser: async (id: number): Promise<User> => {
|
|
306
|
+
const user = mockUsers.find(u => u.id === id);
|
|
307
|
+
if (!user) throw new Error('Not found');
|
|
308
|
+
return user;
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
```
|
|
312
|
+
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# API Response Patterns
|
|
2
|
+
|
|
3
|
+
Best practices for handling API responses, especially distinguishing HTTP status from business status.
|
|
4
|
+
|
|
5
|
+
## The HTTP vs Business Status Problem
|
|
6
|
+
|
|
7
|
+
**Common Bug**: Treating HTTP 200 as "success" when the response body contains a business error.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
HTTP 200 OK
|
|
11
|
+
{
|
|
12
|
+
"code": -1,
|
|
13
|
+
"message": "User not found",
|
|
14
|
+
"data": null
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This is HTTP success but **business failure**. Code that only checks HTTP status will miss this.
|
|
19
|
+
|
|
20
|
+
## Common Response Patterns
|
|
21
|
+
|
|
22
|
+
### Pattern A: Numeric Code
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"code": 0,
|
|
27
|
+
"message": "success",
|
|
28
|
+
"data": { ... }
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| Code | Meaning |
|
|
33
|
+
|------|---------|
|
|
34
|
+
| 0 | Success |
|
|
35
|
+
| 200 | Success (alternative) |
|
|
36
|
+
| -1, 400, 500, etc. | Error |
|
|
37
|
+
|
|
38
|
+
### Pattern B: Boolean Success
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"success": true,
|
|
43
|
+
"result": { ... }
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"success": false,
|
|
50
|
+
"error": "Invalid input"
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Pattern C: String Status
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"status": "success",
|
|
59
|
+
"payload": { ... }
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"status": "error",
|
|
66
|
+
"message": "Something went wrong"
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Pattern D: Error-First
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"error": null,
|
|
75
|
+
"data": { ... }
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"error": {
|
|
82
|
+
"code": "INVALID_INPUT",
|
|
83
|
+
"message": "Email is required"
|
|
84
|
+
},
|
|
85
|
+
"data": null
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Response Validation Checklist
|
|
90
|
+
|
|
91
|
+
### 1. Identify Response Structure
|
|
92
|
+
|
|
93
|
+
- [ ] What field indicates success/failure? (code, success, status, error)
|
|
94
|
+
- [ ] What are the success values? (0, 200, true, "success", null error)
|
|
95
|
+
- [ ] Where is the error message? (message, msg, error, error.message)
|
|
96
|
+
- [ ] Where is the payload? (data, result, payload, body)
|
|
97
|
+
|
|
98
|
+
### 2. Define Success Condition
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// Bad: Only check HTTP status
|
|
102
|
+
const isSuccess = response.status === 200;
|
|
103
|
+
|
|
104
|
+
// Good: Check HTTP status AND business status
|
|
105
|
+
const isSuccess = response.status === 200 &&
|
|
106
|
+
(data.code === 0 || data.code === 200 || data.success === true);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3. Extract Error Information
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
// Handle multiple error message locations
|
|
113
|
+
const errorMessage =
|
|
114
|
+
data.message ||
|
|
115
|
+
data.msg ||
|
|
116
|
+
data.error?.message ||
|
|
117
|
+
data.error ||
|
|
118
|
+
`HTTP ${response.status}`;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 4. Handle Edge Cases
|
|
122
|
+
|
|
123
|
+
| Case | Handling |
|
|
124
|
+
|------|----------|
|
|
125
|
+
| Non-JSON response | Fallback to HTTP status text |
|
|
126
|
+
| Empty body | Treat as success if HTTP 2xx |
|
|
127
|
+
| Network timeout | Explicit error with retry option |
|
|
128
|
+
| Partial response | Validate required fields before use |
|
|
129
|
+
|
|
130
|
+
## Implementation Pattern
|
|
131
|
+
|
|
132
|
+
### Backend (Python example)
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
def check_business_status(response_body: str) -> tuple[bool, str]:
|
|
136
|
+
"""
|
|
137
|
+
Check business status from response body.
|
|
138
|
+
Returns (is_success, error_message).
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
data = json.loads(response_body)
|
|
142
|
+
|
|
143
|
+
# Pattern A: Numeric code
|
|
144
|
+
if "code" in data:
|
|
145
|
+
success_codes = [0, 200, "0", "200"]
|
|
146
|
+
if data["code"] not in success_codes:
|
|
147
|
+
return False, data.get("message") or f"Error code: {data['code']}"
|
|
148
|
+
|
|
149
|
+
# Pattern B: Boolean success
|
|
150
|
+
if "success" in data:
|
|
151
|
+
if not data["success"]:
|
|
152
|
+
return False, data.get("message") or "Operation failed"
|
|
153
|
+
|
|
154
|
+
# Pattern C: String status
|
|
155
|
+
if "status" in data and isinstance(data["status"], str):
|
|
156
|
+
if data["status"].lower() in ["error", "fail", "failed"]:
|
|
157
|
+
return False, data.get("message") or f"Status: {data['status']}"
|
|
158
|
+
|
|
159
|
+
return True, ""
|
|
160
|
+
except (json.JSONDecodeError, TypeError):
|
|
161
|
+
return True, "" # Let HTTP status decide
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Frontend (TypeScript example)
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
interface ApiResponse<T> {
|
|
168
|
+
code?: number;
|
|
169
|
+
success?: boolean;
|
|
170
|
+
status?: string;
|
|
171
|
+
message?: string;
|
|
172
|
+
msg?: string;
|
|
173
|
+
error?: string | { message: string };
|
|
174
|
+
data?: T;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function isBusinessSuccess<T>(response: ApiResponse<T>): boolean {
|
|
178
|
+
// Check code field
|
|
179
|
+
if (response.code !== undefined) {
|
|
180
|
+
return [0, 200].includes(response.code);
|
|
181
|
+
}
|
|
182
|
+
// Check success field
|
|
183
|
+
if (response.success !== undefined) {
|
|
184
|
+
return response.success === true;
|
|
185
|
+
}
|
|
186
|
+
// Check status field
|
|
187
|
+
if (typeof response.status === 'string') {
|
|
188
|
+
return !['error', 'fail', 'failed'].includes(response.status.toLowerCase());
|
|
189
|
+
}
|
|
190
|
+
// No business status field, assume success
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function extractErrorMessage<T>(response: ApiResponse<T>): string {
|
|
195
|
+
return response.message
|
|
196
|
+
|| response.msg
|
|
197
|
+
|| (typeof response.error === 'string' ? response.error : response.error?.message)
|
|
198
|
+
|| 'Unknown error';
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Testing Checklist
|
|
203
|
+
|
|
204
|
+
| Test Case | Input | Expected Behavior |
|
|
205
|
+
|-----------|-------|-------------------|
|
|
206
|
+
| HTTP 200, code 0 | Success response | Treat as success |
|
|
207
|
+
| HTTP 200, code -1 | Business error | Treat as failure, show message |
|
|
208
|
+
| HTTP 200, success false | Business error | Treat as failure |
|
|
209
|
+
| HTTP 500 | Server error | Treat as error |
|
|
210
|
+
| HTTP 200, empty body | Edge case | Treat as success |
|
|
211
|
+
| HTTP 200, non-JSON | Edge case | Fallback to HTTP status |
|
|
212
|
+
| Network timeout | Edge case | Show timeout error |
|
|
213
|
+
|
|
214
|
+
## Common Mistakes
|
|
215
|
+
|
|
216
|
+
| Mistake | Problem | Fix |
|
|
217
|
+
|---------|---------|-----|
|
|
218
|
+
| Only check HTTP status | Miss business errors | Also check response body |
|
|
219
|
+
| Assume response shape | Crash on unexpected structure | Defensive parsing |
|
|
220
|
+
| Hardcode error field | Miss alternative locations | Check multiple fields |
|
|
221
|
+
| Ignore non-JSON | Crash on HTML error pages | Type check before parse |
|
|
222
|
+
| No timeout handling | Hung requests | Set timeout, show message |
|
|
223
|
+
|