vibes-plug 1.0.0 → 2.11.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.
Files changed (183) hide show
  1. package/.claude/rules/vibes-plug-core.md +32 -0
  2. package/.cursor/rules/vibes-plug-core.mdc +51 -0
  3. package/.cursorrules +42 -0
  4. package/AGENTS.md +96 -0
  5. package/BLUEPRINT.md +309 -125
  6. package/CHANGELOG.md +183 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +641 -263
  10. package/index.js +19 -0
  11. package/package.json +61 -25
  12. package/plugin.json +24 -7
  13. package/scripts/generate_swarm_gif.py +295 -0
  14. package/scripts/install.js +201 -0
  15. package/skills/accessibility-testing-expert/SKILL.md +116 -0
  16. package/skills/ai-cost-token-optimizer/SKILL.md +82 -0
  17. package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
  18. package/skills/ai-llm-integration-expert/SKILL.md +147 -122
  19. package/skills/ai-media-generation-expert/SKILL.md +172 -0
  20. package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
  21. package/skills/angular-expert/SKILL.md +148 -0
  22. package/skills/api-design-expert/SKILL.md +316 -309
  23. package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
  24. package/skills/app-analyzer-optimizer/SKILL.md +195 -188
  25. package/skills/apple-ecosystem-expert/SKILL.md +145 -0
  26. package/skills/{asisten_ramah → asisten-ramah}/SKILL.md +7 -1
  27. package/skills/astro-framework-expert/SKILL.md +200 -0
  28. package/skills/async-queue-temporal-expert/SKILL.md +240 -0
  29. package/skills/authentication-identity-expert/SKILL.md +279 -45
  30. package/skills/auto-doc-updater/SKILL.md +219 -203
  31. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  32. package/skills/autonomous-red-teamer/SKILL.md +203 -0
  33. package/skills/autonomous-tdd-debugger/SKILL.md +71 -0
  34. package/skills/background-jobs-queue-expert/SKILL.md +235 -0
  35. package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
  36. package/skills/blockchain-web3-expert/SKILL.md +115 -0
  37. package/skills/bootstrap-to-modern/SKILL.md +93 -86
  38. package/skills/brainstorming/SKILL.md +381 -353
  39. package/skills/browser-automation-expert/SKILL.md +222 -0
  40. package/skills/bun-runtime-expert/SKILL.md +7 -1
  41. package/skills/chatbot-messaging-expert/SKILL.md +114 -0
  42. package/skills/ci-cd-devops-architect/SKILL.md +81 -45
  43. package/skills/cloud-hosting-expert/SKILL.md +249 -243
  44. package/skills/coderabbit/SKILL.md +197 -191
  45. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  46. package/skills/cron-scheduler-expert/SKILL.md +304 -0
  47. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  48. package/skills/data-telemetry-expert/SKILL.md +218 -212
  49. package/skills/data-visualization-expert/SKILL.md +154 -0
  50. package/skills/database-migration-versioning-expert/SKILL.md +90 -0
  51. package/skills/database-orm-expert/SKILL.md +303 -293
  52. package/skills/dependency-upgrade-migrator/SKILL.md +301 -0
  53. package/skills/design-system-architect/SKILL.md +278 -242
  54. package/skills/desktop-electron-expert/SKILL.md +128 -0
  55. package/skills/documentation-site-expert/SKILL.md +59 -0
  56. package/skills/doku-mcp-server/SKILL.md +257 -0
  57. package/skills/doku-payment-gateway/SKILL.md +233 -0
  58. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  59. package/skills/e2e-testing-expert/SKILL.md +320 -314
  60. package/skills/ecommerce-expert/SKILL.md +87 -0
  61. package/skills/edge-serverless-db-expert/SKILL.md +99 -0
  62. package/skills/email-notification-expert/SKILL.md +368 -0
  63. package/skills/error-resilience-expert/SKILL.md +486 -0
  64. package/skills/event-driven-architect/SKILL.md +86 -80
  65. package/skills/feature-flag-analytics-expert/SKILL.md +66 -0
  66. package/skills/file-upload-media-expert/SKILL.md +437 -0
  67. package/skills/firebase-security-expert/SKILL.md +7 -1
  68. package/skills/form-validation-expert/SKILL.md +407 -0
  69. package/skills/fullstack-expert/SKILL.md +260 -201
  70. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  71. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  72. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  73. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  74. package/skills/gemini-agent-booster/SKILL.md +142 -104
  75. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  76. package/skills/global-a11y-i18n-expert/SKILL.md +86 -80
  77. package/skills/glsl-shader-expert/SKILL.md +107 -0
  78. package/skills/go-programming-expert/SKILL.md +300 -294
  79. package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
  80. package/skills/graphql-apollo-expert/SKILL.md +114 -0
  81. package/skills/headless-cms-expert/SKILL.md +181 -0
  82. package/skills/hig/SKILL.md +193 -187
  83. package/skills/js-backend-expert/SKILL.md +218 -191
  84. package/skills/legacy-code-translator/SKILL.md +71 -0
  85. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  86. package/skills/logging-error-tracking-expert/SKILL.md +344 -0
  87. package/skills/mcp-client-orchestrator/SKILL.md +76 -0
  88. package/skills/mcp-server-architect/SKILL.md +226 -126
  89. package/skills/micro-frontend-architect/SKILL.md +112 -0
  90. package/skills/mobile-expo-expert/SKILL.md +191 -185
  91. package/skills/mobile-push-notification-expert/SKILL.md +71 -0
  92. package/skills/modern-css-native-expert/SKILL.md +189 -0
  93. package/skills/monday-design-aesthetic/SKILL.md +72 -66
  94. package/skills/monorepo-architect/SKILL.md +232 -226
  95. package/skills/mpa-orchestrator/SKILL.md +120 -101
  96. package/skills/multi-agent-orchestration/SKILL.md +173 -153
  97. package/skills/multiple-entry-points/SKILL.md +91 -55
  98. package/skills/mvc-expert/SKILL.md +237 -231
  99. package/skills/n8n-automation-expert/SKILL.md +89 -0
  100. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  101. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  102. package/skills/payment-gateway-expert/SKILL.md +129 -45
  103. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  104. package/skills/performance-web-vitals/SKILL.md +337 -331
  105. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  106. package/skills/prd-architect/SKILL.md +206 -190
  107. package/skills/proactive-background-watcher/SKILL.md +68 -0
  108. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  109. package/skills/production-ready-hardener/SKILL.md +461 -468
  110. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  111. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  112. package/skills/project-context-mapper/SKILL.md +85 -0
  113. package/skills/pwa-offline-first-expert/SKILL.md +185 -0
  114. package/skills/python-programming-expert/SKILL.md +407 -270
  115. package/skills/rate-limit-abuse-prevention/SKILL.md +377 -0
  116. package/skills/realtime-collaboration-expert/SKILL.md +99 -45
  117. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  118. package/skills/rust-programming-expert/SKILL.md +240 -234
  119. package/skills/saas-billing/SKILL.md +382 -376
  120. package/skills/saas-multi-tenant/SKILL.md +256 -236
  121. package/skills/saas-mvp-launcher/SKILL.md +30 -1
  122. package/skills/saas-transformer/SKILL.md +499 -445
  123. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  124. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  125. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  126. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  127. package/skills/scalability-clean-code/SKILL.md +234 -228
  128. package/skills/search-engine-expert/SKILL.md +89 -0
  129. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  130. package/skills/self-evolving-memory-graph/SKILL.md +91 -0
  131. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  132. package/skills/senior-frontend/SKILL.md +85 -105
  133. package/skills/seo/SKILL.md +258 -224
  134. package/skills/session-context-loader/SKILL.md +83 -0
  135. package/skills/session-handoff-resume/SKILL.md +163 -157
  136. package/skills/{skill_baru → skill-baru}/SKILL.md +177 -146
  137. package/skills/solidjs-expert/SKILL.md +80 -0
  138. package/skills/spa-orchestrator/SKILL.md +306 -287
  139. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  140. package/skills/state-management-expert/SKILL.md +277 -271
  141. package/skills/supabase-migration/SKILL.md +47 -1
  142. package/skills/supabase-security-expert/SKILL.md +248 -242
  143. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  144. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  145. package/skills/tailwind-expert/SKILL.md +139 -187
  146. package/skills/tanstack-query-expert/SKILL.md +204 -198
  147. package/skills/tauri-expert/SKILL.md +7 -1
  148. package/skills/token-saver/SKILL.md +118 -110
  149. package/skills/typescript-expert/SKILL.md +329 -278
  150. package/skills/ui-components-expert/SKILL.md +166 -63
  151. package/skills/ui-ux-pro-max/SKILL.md +221 -200
  152. package/skills/vector-db-rag-expert/SKILL.md +208 -0
  153. package/skills/vibe-code-gardener/SKILL.md +180 -172
  154. package/skills/visual-qa-vision-agent/SKILL.md +71 -0
  155. package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
  156. package/skills/vue-frontend-expert/SKILL.md +132 -0
  157. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  158. package/skills/web-3d-graphics-expert/SKILL.md +137 -0
  159. package/skills/web-game-engine-expert/SKILL.md +102 -0
  160. package/skills/web-scraper/SKILL.md +98 -146
  161. package/skills/website-design-cloner/SKILL.md +180 -0
  162. package/skills/webxr-ar-vr-expert/SKILL.md +123 -0
  163. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  164. package/skills/zero-to-prod-orchestrator/SKILL.md +231 -180
  165. package/skills/zero-trust-secret-vault/SKILL.md +88 -0
  166. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  167. package/CONTRIBUTING.md +0 -199
  168. package/SECURITY.md +0 -21
  169. package/banner.png +0 -0
  170. package/skills/senior-fullstack/SKILL.md +0 -167
  171. package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
  172. package/skills/senior-fullstack/references/development_workflows.md +0 -222
  173. package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
  174. package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
  175. package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
  176. package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
  177. package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
  178. package/skills/seo-geo/SKILL.md +0 -188
  179. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  180. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  181. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  182. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  183. package/skills/ui_ux_expert/SKILL.md +0 -114
@@ -1,310 +1,317 @@
1
- ---
2
- name: api-design-expert
3
- description: "Expert guide for designing robust APIs: REST best practices, GraphQL, gRPC, tRPC, OpenAPI/Swagger, API versioning, rate limiting, and contract-first design / Panduan ahli untuk merancang API yang kuat: praktik terbaik REST, GraphQL, gRPC, tRPC, OpenAPI/Swagger, versioning API, rate limiting, dan desain contract-first."
1
+ ---
2
+ name: api-design-expert
3
+ description: "Expert guide for designing robust APIs: REST best practices, GraphQL, gRPC, tRPC, OpenAPI/Swagger, API versioning, rate limiting, and contract-first design / Panduan ahli untuk merancang API yang kuat: praktik terbaik REST, GraphQL, gRPC, tRPC, OpenAPI/Swagger, versioning API, rate limiting, dan desain contract-first."
4
4
  author: "Roedy Rustam"
5
- ---
6
-
7
- # API Design Expert
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Expert guide for designing, documenting, and evolving production-grade APIs. Covers **REST** resource modeling and HTTP semantics, **GraphQL** schema design, **gRPC** with protobuf, and **tRPC** for end-to-end type-safe APIs in TypeScript monorepos. Includes OpenAPI 3.1 documentation, API versioning strategies, rate limiting, idempotency, and contract-first development workflows.
18
-
19
- ### Trigger Conditions
20
- - Designing a new API from scratch (REST, GraphQL, gRPC, or tRPC).
21
- - Evolving an existing API without breaking clients.
22
- - Documenting APIs with OpenAPI/Swagger.
23
- - Implementing rate limiting, throttling, or idempotency.
24
- - Choosing between REST, GraphQL, gRPC, and tRPC.
25
- - Designing webhook systems.
26
- - Implementing API authentication (API keys, JWT, OAuth2).
27
-
28
- ---
29
-
30
- ### API Protocol Selection Guide
31
-
32
- | Criteria | REST | GraphQL | gRPC | tRPC |
33
- |---|---|---|---|---|
34
- | **Type Safety** | Manual (OpenAPI) | Schema-enforced | Protobuf | End-to-end TS |
35
- | **Performance** | Good | Good | Excellent (HTTP/2) | Good |
36
- | **Browser Support** | Native | Native | Needs proxy | TS/JS only |
37
- | **Streaming** | SSE / WebSocket | Subscriptions | Native bi-directional | SSE |
38
- | **Best For** | Public APIs, mobile | Complex data graphs | Microservice-to-service | Next.js full-stack |
39
- | **Tooling** | Universal | Rich ecosystem | Strong (Go, Java) | Next.js / Expo |
40
-
41
- ---
42
-
43
- ### REST API Design Principles
44
-
45
- #### Resource Naming Conventions
46
- ```
47
- Collection: GET /api/v1/posts
48
- Item: GET /api/v1/posts/{id}
49
- Sub-resource:GET /api/v1/posts/{id}/comments
50
- Action: POST /api/v1/posts/{id}/publish (use sparingly)
51
-
52
- AVOID: /api/v1/getPosts, /api/v1/createPost, /api/v1/deletePost/{id}
53
- ```
54
-
55
- #### HTTP Method Semantics
56
- | Method | Idempotent | Safe | Use Case |
57
- |---|---|---|---|
58
- | `GET` | Yes | Yes | Retrieve resources |
59
- | `POST` | No | No | Create resources, trigger actions |
60
- | `PUT` | Yes | No | Replace entire resource |
61
- | `PATCH` | No | No | Partial update |
62
- | `DELETE` | Yes | No | Remove resource |
63
-
64
- #### Consistent Response Structure
65
- ```typescript
66
- // Success response
67
- {
68
- "data": { "id": "usr_01", "email": "user@example.com" },
69
- "meta": { "requestId": "req_xyz", "timestamp": "2026-01-01T00:00:00Z" }
70
- }
71
-
72
- // Paginated list response
73
- {
74
- "data": [...],
75
- "meta": {
76
- "total": 1234,
77
- "page": 2,
78
- "pageSize": 20,
79
- "hasNextPage": true,
80
- "nextCursor": "eyJpZCI6"
81
- }
82
- }
83
-
84
- // Error response (RFC 9457 Problem Details)
85
- {
86
- "type": "https://api.example.com/errors/validation-failed",
87
- "title": "Validation Failed",
88
- "status": 422,
89
- "detail": "The 'email' field must be a valid email address.",
90
- "instance": "/api/v1/users",
91
- "errors": [
92
- { "field": "email", "message": "Invalid email format" }
93
- ]
94
- }
95
- ```
96
-
97
- #### HTTP Status Codes — Correct Usage
98
- ```
99
- 200 OK — Successful GET, PUT, PATCH
100
- 201 Created — Successful POST (include Location header)
101
- 204 No Content — Successful DELETE
102
- 400 Bad Request — Invalid request body or params
103
- 401 Unauthorized— Missing or invalid authentication
104
- 403 Forbidden — Authenticated but not authorized
105
- 404 Not Found — Resource not found
106
- 409 Conflict — Duplicate key, version conflict
107
- 422 Unprocessable Entity — Validation failure
108
- 429 Too Many Requests — Rate limit exceeded (include Retry-After)
109
- 500 Internal Server Error— Unexpected server error
110
- ```
111
-
112
- ---
113
-
114
- ### API Versioning Strategies
115
-
116
- ```
117
- Strategy 1 — URL Path (Recommended for public APIs):
118
- GET /api/v1/users
119
- GET /api/v2/users
120
-
121
- Strategy 2 — Header:
122
- GET /api/users
123
- Accept: application/vnd.example.v2+json
124
-
125
- Strategy 3 — Query Parameter (Avoid in production):
126
- GET /api/users?version=2
127
- ```
128
-
129
- **Rules for non-breaking changes** (no version bump needed):
130
- - Adding new optional fields to responses.
131
- - Adding new optional request parameters.
132
- - Adding new endpoints.
133
-
134
- **Breaking changes** (require new version):
135
- - Removing or renaming fields.
136
- - Changing field types.
137
- - Changing error response structure.
138
-
139
- ---
140
-
141
- ### tRPC — End-to-End Type Safety
142
-
143
- ```typescript
144
- // server/router.ts
145
- import { initTRPC, TRPCError } from '@trpc/server';
146
- import { z } from 'zod';
147
-
148
- const t = initTRPC.context<Context>().create();
149
- export const router = t.router;
150
- export const publicProcedure = t.procedure;
151
- export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
152
- if (!ctx.session?.user) throw new TRPCError({ code: 'UNAUTHORIZED' });
153
- return next({ ctx: { ...ctx, user: ctx.session.user } });
154
- });
155
-
156
- export const appRouter = router({
157
- users: router({
158
- list: publicProcedure
159
- .input(z.object({ page: z.number().int().min(1).default(1) }))
160
- .query(async ({ input, ctx }) => {
161
- return ctx.db.user.findMany({ skip: (input.page - 1) * 20, take: 20 });
162
- }),
163
- create: protectedProcedure
164
- .input(z.object({ email: z.string().email(), name: z.string().min(2) }))
165
- .mutation(async ({ input, ctx }) => {
166
- return ctx.db.user.create({ data: input });
167
- }),
168
- }),
169
- });
170
-
171
- export type AppRouter = typeof appRouter;
172
- // Client automatically infers all types — no code generation needed
173
- ```
174
-
175
- ---
176
-
177
- ### Rate Limiting Implementation
178
-
179
- ```typescript
180
- // Sliding window rate limit with Redis (using Upstash)
181
- import { Ratelimit } from '@upstash/ratelimit';
182
- import { Redis } from '@upstash/redis';
183
-
184
- const ratelimit = new Ratelimit({
185
- redis: Redis.fromEnv(),
186
- limiter: Ratelimit.slidingWindow(100, '1 m'), // 100 requests/minute
187
- analytics: true,
188
- prefix: 'api:ratelimit',
189
- });
190
-
191
- // Next.js middleware usage
192
- export async function rateLimitMiddleware(req: Request) {
193
- const ip = req.headers.get('x-forwarded-for') ?? '127.0.0.1';
194
- const { success, limit, remaining, reset } = await ratelimit.limit(ip);
195
-
196
- if (!success) {
197
- return new Response(JSON.stringify({ error: 'Too Many Requests' }), {
198
- status: 429,
199
- headers: {
200
- 'X-RateLimit-Limit': limit.toString(),
201
- 'X-RateLimit-Remaining': remaining.toString(),
202
- 'X-RateLimit-Reset': new Date(reset).toISOString(),
203
- 'Retry-After': Math.ceil((reset - Date.now()) / 1000).toString(),
204
- },
205
- });
206
- }
207
- }
208
- ```
209
-
210
- ---
211
-
212
- ### Idempotency for Mutations
213
-
214
- ```typescript
215
- // Client sends Idempotency-Key header for safe retries
216
- // POST /api/payments
217
- // Idempotency-Key: a0e4b2c1-unique-uuid-here
218
-
219
- async function handlePayment(req: Request) {
220
- const idempotencyKey = req.headers.get('idempotency-key');
221
- if (!idempotencyKey) return errorResponse(400, 'Idempotency-Key header required');
222
-
223
- // Check cache first
224
- const cached = await redis.get(`idempotency:${idempotencyKey}`);
225
- if (cached) return Response.json(JSON.parse(cached), { status: 200 });
226
-
227
- // Process payment
228
- const result = await processPayment(await req.json());
229
-
230
- // Cache result for 24 hours
231
- await redis.setex(`idempotency:${idempotencyKey}`, 86400, JSON.stringify(result));
232
- return Response.json(result, { status: 201 });
233
- }
234
- ```
235
-
236
- ---
237
-
238
- ### OpenAPI 3.1 Documentation
239
-
240
- ```yaml
241
- # openapi.yaml
242
- openapi: "3.1.0"
243
- info:
244
- title: Example API
245
- version: "1.0.0"
246
- description: "RESTful API for Example SaaS"
247
-
248
- paths:
249
- /api/v1/users:
250
- get:
251
- operationId: listUsers
252
- summary: List all users
253
- tags: [Users]
254
- security: [{ bearerAuth: [] }]
255
- parameters:
256
- - name: page
257
- in: query
258
- schema: { type: integer, minimum: 1, default: 1 }
259
- - name: pageSize
260
- in: query
261
- schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
262
- responses:
263
- "200":
264
- description: Users list
265
- content:
266
- application/json:
267
- schema:
268
- $ref: "#/components/schemas/UserListResponse"
269
- "401":
270
- $ref: "#/components/responses/Unauthorized"
271
-
272
- components:
273
- securitySchemes:
274
- bearerAuth:
275
- type: http
276
- scheme: bearer
277
- bearerFormat: JWT
278
- ```
279
-
280
- ---
281
-
282
- <a name="bahasa-indonesia"></a>
283
- ## Bahasa Indonesia
284
-
285
- ### Deskripsi
286
- Panduan ahli untuk merancang, mendokumentasikan, dan mengembangkan API berkualitas produksi. Mencakup pemodelan resource **REST** dan semantik HTTP, desain skema **GraphQL**, **gRPC** dengan protobuf, dan **tRPC** untuk API end-to-end type-safe di TypeScript. Termasuk dokumentasi OpenAPI 3.1, strategi versioning API, rate limiting, idempotency, dan alur kerja contract-first.
287
-
288
- ### Kondisi Pemicu
289
- - Merancang API baru dari nol (REST, GraphQL, gRPC, atau tRPC).
290
- - Mengembangkan API yang ada tanpa merusak klien.
291
- - Mendokumentasikan API dengan OpenAPI/Swagger.
292
- - Mengimplementasikan rate limiting, throttling, atau idempotency.
293
- - Memilih antara REST, GraphQL, gRPC, dan tRPC.
294
- - Merancang sistem webhook.
295
-
296
- ### Panduan Pemilihan Protokol API
297
-
298
- - **REST**: API publik, klien mobile, konsumsi universal.
299
- - **GraphQL**: Data graph kompleks, kebutuhan query fleksibel dari klien.
300
- - **gRPC**: Komunikasi layanan-ke-layanan dengan performa tinggi.
301
- - **tRPC**: Proyek full-stack TypeScript monorepo (Next.js + backend).
302
-
303
- ### Prinsip REST
304
-
305
- 1. **Penamaan resource**: Gunakan kata benda jamak (`/posts`, bukan `/getPost`).
306
- 2. **Status HTTP**: Gunakan kode yang tepat (201 untuk create, 204 untuk delete).
307
- 3. **Konsistensi respons**: Selalu kembalikan struktur `data` + `meta` yang konsisten.
308
- 4. **Versioning**: Gunakan URL path (`/api/v1/`) untuk API publik.
309
- 5. **Idempotency**: Implementasikan `Idempotency-Key` header untuk operasi mutasi yang kritis.
310
- 6. **Rate Limiting**: Selalu sertakan header `X-RateLimit-*` dan kode `429` yang benar.
5
+ ---
6
+
7
+ # API Design Expert
8
+
9
+ [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
+
11
+ ---
12
+
13
+ <a name="english"></a>
14
+ ## English
15
+
16
+ ### Description
17
+ Expert guide for designing, documenting, and evolving production-grade APIs. Covers **REST** resource modeling and HTTP semantics, **GraphQL** schema design, **gRPC** with protobuf, and **tRPC** for end-to-end type-safe APIs in TypeScript monorepos. Includes OpenAPI 3.1 documentation, API versioning strategies, rate limiting, idempotency, and contract-first development workflows.
18
+
19
+ ### Trigger Conditions
20
+ - Designing a new API from scratch (REST, GraphQL, gRPC, or tRPC).
21
+ - Evolving an existing API without breaking clients.
22
+ - Documenting APIs with OpenAPI/Swagger.
23
+ - Implementing rate limiting, throttling, or idempotency.
24
+ - Choosing between REST, GraphQL, gRPC, and tRPC.
25
+ - Designing webhook systems.
26
+ - Implementing API authentication (API keys, JWT, OAuth2).
27
+
28
+ ---
29
+
30
+ ### API Protocol Selection Guide
31
+
32
+ | Criteria | REST | GraphQL | gRPC | tRPC |
33
+ |---|---|---|---|---|
34
+ | **Type Safety** | Manual (OpenAPI) | Schema-enforced | Protobuf | End-to-end TS |
35
+ | **Performance** | Good | Good | Excellent (HTTP/2) | Good |
36
+ | **Browser Support** | Native | Native | Needs proxy | TS/JS only |
37
+ | **Streaming** | SSE / WebSocket | Subscriptions | Native bi-directional | SSE |
38
+ | **Best For** | Public APIs, mobile | Complex data graphs | Microservice-to-service | Next.js full-stack |
39
+ | **Tooling** | Universal | Rich ecosystem | Strong (Go, Java) | Next.js / Expo |
40
+
41
+ ---
42
+
43
+ ### REST API Design Principles
44
+
45
+ #### Resource Naming Conventions
46
+ ```
47
+ Collection: GET /api/v1/posts
48
+ Item: GET /api/v1/posts/{id}
49
+ Sub-resource:GET /api/v1/posts/{id}/comments
50
+ Action: POST /api/v1/posts/{id}/publish (use sparingly)
51
+
52
+ AVOID: /api/v1/getPosts, /api/v1/createPost, /api/v1/deletePost/{id}
53
+ ```
54
+
55
+ #### HTTP Method Semantics
56
+ | Method | Idempotent | Safe | Use Case |
57
+ |---|---|---|---|
58
+ | `GET` | Yes | Yes | Retrieve resources |
59
+ | `POST` | No | No | Create resources, trigger actions |
60
+ | `PUT` | Yes | No | Replace entire resource |
61
+ | `PATCH` | No | No | Partial update |
62
+ | `DELETE` | Yes | No | Remove resource |
63
+
64
+ #### Consistent Response Structure
65
+ ```typescript
66
+ // Success response
67
+ {
68
+ "data": { "id": "usr_01", "email": "user@example.com" },
69
+ "meta": { "requestId": "req_xyz", "timestamp": "2026-01-01T00:00:00Z" }
70
+ }
71
+
72
+ // Paginated list response
73
+ {
74
+ "data": [...],
75
+ "meta": {
76
+ "total": 1234,
77
+ "page": 2,
78
+ "pageSize": 20,
79
+ "hasNextPage": true,
80
+ "nextCursor": "eyJpZCI6"
81
+ }
82
+ }
83
+
84
+ // Error response (RFC 9457 Problem Details)
85
+ {
86
+ "type": "https://api.example.com/errors/validation-failed",
87
+ "title": "Validation Failed",
88
+ "status": 422,
89
+ "detail": "The 'email' field must be a valid email address.",
90
+ "instance": "/api/v1/users",
91
+ "errors": [
92
+ { "field": "email", "message": "Invalid email format" }
93
+ ]
94
+ }
95
+ ```
96
+
97
+ #### HTTP Status Codes — Correct Usage
98
+ ```
99
+ 200 OK — Successful GET, PUT, PATCH
100
+ 201 Created — Successful POST (include Location header)
101
+ 204 No Content — Successful DELETE
102
+ 400 Bad Request — Invalid request body or params
103
+ 401 Unauthorized— Missing or invalid authentication
104
+ 403 Forbidden — Authenticated but not authorized
105
+ 404 Not Found — Resource not found
106
+ 409 Conflict — Duplicate key, version conflict
107
+ 422 Unprocessable Entity — Validation failure
108
+ 429 Too Many Requests — Rate limit exceeded (include Retry-After)
109
+ 500 Internal Server Error— Unexpected server error
110
+ ```
111
+
112
+ ---
113
+
114
+ ### API Versioning Strategies
115
+
116
+ ```
117
+ Strategy 1 — URL Path (Recommended for public APIs):
118
+ GET /api/v1/users
119
+ GET /api/v2/users
120
+
121
+ Strategy 2 — Header:
122
+ GET /api/users
123
+ Accept: application/vnd.example.v2+json
124
+
125
+ Strategy 3 — Query Parameter (Avoid in production):
126
+ GET /api/users?version=2
127
+ ```
128
+
129
+ **Rules for non-breaking changes** (no version bump needed):
130
+ - Adding new optional fields to responses.
131
+ - Adding new optional request parameters.
132
+ - Adding new endpoints.
133
+
134
+ **Breaking changes** (require new version):
135
+ - Removing or renaming fields.
136
+ - Changing field types.
137
+ - Changing error response structure.
138
+
139
+ ---
140
+
141
+ ### tRPC — End-to-End Type Safety
142
+
143
+ ```typescript
144
+ // server/router.ts
145
+ import { initTRPC, TRPCError } from '@trpc/server';
146
+ import { z } from 'zod';
147
+
148
+ const t = initTRPC.context<Context>().create();
149
+ export const router = t.router;
150
+ export const publicProcedure = t.procedure;
151
+ export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
152
+ if (!ctx.session?.user) throw new TRPCError({ code: 'UNAUTHORIZED' });
153
+ return next({ ctx: { ...ctx, user: ctx.session.user } });
154
+ });
155
+
156
+ export const appRouter = router({
157
+ users: router({
158
+ list: publicProcedure
159
+ .input(z.object({ page: z.number().int().min(1).default(1) }))
160
+ .query(async ({ input, ctx }) => {
161
+ return ctx.db.user.findMany({ skip: (input.page - 1) * 20, take: 20 });
162
+ }),
163
+ create: protectedProcedure
164
+ .input(z.object({ email: z.string().email(), name: z.string().min(2) }))
165
+ .mutation(async ({ input, ctx }) => {
166
+ return ctx.db.user.create({ data: input });
167
+ }),
168
+ }),
169
+ });
170
+
171
+ export type AppRouter = typeof appRouter;
172
+ // Client automatically infers all types — no code generation needed
173
+ ```
174
+
175
+ ---
176
+
177
+ ### Rate Limiting Implementation
178
+
179
+ ```typescript
180
+ // Sliding window rate limit with Redis (using Upstash)
181
+ import { Ratelimit } from '@upstash/ratelimit';
182
+ import { Redis } from '@upstash/redis';
183
+
184
+ const ratelimit = new Ratelimit({
185
+ redis: Redis.fromEnv(),
186
+ limiter: Ratelimit.slidingWindow(100, '1 m'), // 100 requests/minute
187
+ analytics: true,
188
+ prefix: 'api:ratelimit',
189
+ });
190
+
191
+ // Next.js middleware usage
192
+ export async function rateLimitMiddleware(req: Request) {
193
+ const ip = req.headers.get('x-forwarded-for') ?? '127.0.0.1';
194
+ const { success, limit, remaining, reset } = await ratelimit.limit(ip);
195
+
196
+ if (!success) {
197
+ return new Response(JSON.stringify({ error: 'Too Many Requests' }), {
198
+ status: 429,
199
+ headers: {
200
+ 'X-RateLimit-Limit': limit.toString(),
201
+ 'X-RateLimit-Remaining': remaining.toString(),
202
+ 'X-RateLimit-Reset': new Date(reset).toISOString(),
203
+ 'Retry-After': Math.ceil((reset - Date.now()) / 1000).toString(),
204
+ },
205
+ });
206
+ }
207
+ }
208
+ ```
209
+
210
+ ---
211
+
212
+ ### Idempotency for Mutations
213
+
214
+ ```typescript
215
+ // Client sends Idempotency-Key header for safe retries
216
+ // POST /api/payments
217
+ // Idempotency-Key: a0e4b2c1-unique-uuid-here
218
+
219
+ async function handlePayment(req: Request) {
220
+ const idempotencyKey = req.headers.get('idempotency-key');
221
+ if (!idempotencyKey) return errorResponse(400, 'Idempotency-Key header required');
222
+
223
+ // Check cache first
224
+ const cached = await redis.get(`idempotency:${idempotencyKey}`);
225
+ if (cached) return Response.json(JSON.parse(cached), { status: 200 });
226
+
227
+ // Process payment
228
+ const result = await processPayment(await req.json());
229
+
230
+ // Cache result for 24 hours
231
+ await redis.setex(`idempotency:${idempotencyKey}`, 86400, JSON.stringify(result));
232
+ return Response.json(result, { status: 201 });
233
+ }
234
+ ```
235
+
236
+ ---
237
+
238
+ ### OpenAPI 3.1 Documentation
239
+
240
+ ```yaml
241
+ # openapi.yaml
242
+ openapi: "3.1.0"
243
+ info:
244
+ title: Example API
245
+ version: "1.0.0"
246
+ description: "RESTful API for Example SaaS"
247
+
248
+ paths:
249
+ /api/v1/users:
250
+ get:
251
+ operationId: listUsers
252
+ summary: List all users
253
+ tags: [Users]
254
+ security: [{ bearerAuth: [] }]
255
+ parameters:
256
+ - name: page
257
+ in: query
258
+ schema: { type: integer, minimum: 1, default: 1 }
259
+ - name: pageSize
260
+ in: query
261
+ schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
262
+ responses:
263
+ "200":
264
+ description: Users list
265
+ content:
266
+ application/json:
267
+ schema:
268
+ $ref: "#/components/schemas/UserListResponse"
269
+ "401":
270
+ $ref: "#/components/responses/Unauthorized"
271
+
272
+ components:
273
+ securitySchemes:
274
+ bearerAuth:
275
+ type: http
276
+ scheme: bearer
277
+ bearerFormat: JWT
278
+ ```
279
+
280
+ ---
281
+
282
+ <a name="bahasa-indonesia"></a>
283
+ ## Bahasa Indonesia
284
+
285
+ ### Integrasi Orkestrasi
286
+ Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
287
+
288
+ ### Deskripsi
289
+ Panduan ahli untuk merancang, mendokumentasikan, dan mengembangkan API berkualitas produksi. Mencakup pemodelan resource **REST** dan semantik HTTP, desain skema **GraphQL**, **gRPC** dengan protobuf, dan **tRPC** untuk API end-to-end type-safe di TypeScript. Termasuk dokumentasi OpenAPI 3.1, strategi versioning API, rate limiting, idempotency, dan alur kerja contract-first.
290
+
291
+ ### Kondisi Pemicu
292
+ - Merancang API baru dari nol (REST, GraphQL, gRPC, atau tRPC).
293
+ - Mengembangkan API yang ada tanpa merusak klien.
294
+ - Mendokumentasikan API dengan OpenAPI/Swagger.
295
+ - Mengimplementasikan rate limiting, throttling, atau idempotency.
296
+ - Memilih antara REST, GraphQL, gRPC, dan tRPC.
297
+ - Merancang sistem webhook.
298
+
299
+ ### Panduan Pemilihan Protokol API
300
+
301
+ - **REST**: API publik, klien mobile, konsumsi universal.
302
+ - **GraphQL**: Data graph kompleks, kebutuhan query fleksibel dari klien.
303
+ - **gRPC**: Komunikasi layanan-ke-layanan dengan performa tinggi.
304
+ - **tRPC**: Proyek full-stack TypeScript monorepo (Next.js + backend).
305
+
306
+ ### Prinsip REST
307
+
308
+ 1. **Penamaan resource**: Gunakan kata benda jamak (`/posts`, bukan `/getPost`).
309
+ 2. **Status HTTP**: Gunakan kode yang tepat (201 untuk create, 204 untuk delete).
310
+ 3. **Konsistensi respons**: Selalu kembalikan struktur `data` + `meta` yang konsisten.
311
+ 4. **Versioning**: Gunakan URL path (`/api/v1/`) untuk API publik.
312
+ 5. **Idempotency**: Implementasikan `Idempotency-Key` header untuk operasi mutasi yang kritis.
313
+ 6. **Rate Limiting**: Selalu sertakan header `X-RateLimit-*` dan kode `429` yang benar.
314
+
315
+
316
+ ## Orchestration & Integration
317
+ - Connects to other backend skills as part of the orchestration flow.