vibes-plug 2.5.0 → 2.14.1

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 (187) 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 +37 -7
  5. package/BLUEPRINT.md +319 -217
  6. package/CHANGELOG.md +170 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +611 -415
  10. package/index.js +19 -0
  11. package/package.json +44 -8
  12. package/plugin.json +24 -7
  13. package/scripts/check-anti-slop.js +53 -0
  14. package/scripts/generate_swarm_gif.py +295 -0
  15. package/scripts/install.js +201 -0
  16. package/skills/accessibility-testing-expert/SKILL.md +116 -0
  17. package/skills/ai-llm-integration-expert/SKILL.md +192 -178
  18. package/skills/ai-media-generation-expert/SKILL.md +172 -0
  19. package/skills/ai-prompt-engineering-expert/SKILL.md +134 -0
  20. package/skills/angular-expert/SKILL.md +148 -0
  21. package/skills/anti-slop/SKILL.md +133 -0
  22. package/skills/api-design-expert/SKILL.md +6 -3
  23. package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
  24. package/skills/app-analyzer-optimizer/SKILL.md +6 -3
  25. package/skills/apple-ecosystem-expert/SKILL.md +144 -141
  26. package/skills/astro-framework-expert/SKILL.md +200 -0
  27. package/skills/async-queue-temporal-expert/SKILL.md +189 -26
  28. package/skills/authentication-identity-expert/SKILL.md +78 -181
  29. package/skills/autonomous-red-teamer/SKILL.md +172 -28
  30. package/skills/autonomous-tdd-debugger/SKILL.md +70 -64
  31. package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
  32. package/skills/blockchain-web3-expert/SKILL.md +115 -0
  33. package/skills/bootstrap-to-modern/SKILL.md +9 -6
  34. package/skills/brainstorming/SKILL.md +60 -52
  35. package/skills/browser-automation-expert/SKILL.md +197 -21
  36. package/skills/bun-runtime-expert/SKILL.md +7 -1
  37. package/skills/chatbot-messaging-expert/SKILL.md +114 -0
  38. package/skills/ci-cd-devops-architect/SKILL.md +45 -36
  39. package/skills/cloud-hosting-expert/SKILL.md +7 -1
  40. package/skills/coderabbit/SKILL.md +7 -1
  41. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  42. package/skills/cron-scheduler-expert/SKILL.md +303 -297
  43. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  44. package/skills/data-telemetry-expert/SKILL.md +7 -1
  45. package/skills/data-visualization-expert/SKILL.md +154 -0
  46. package/skills/database-orm-expert/SKILL.md +165 -294
  47. package/skills/deep-research-analyst/SKILL.md +136 -0
  48. package/skills/dependency-upgrade-migrator/SKILL.md +300 -294
  49. package/skills/design-system-architect/SKILL.md +309 -260
  50. package/skills/desktop-electron-expert/SKILL.md +128 -0
  51. package/skills/documentation-site-expert/SKILL.md +59 -0
  52. package/skills/doku-mcp-server/SKILL.md +7 -1
  53. package/skills/doku-payment-gateway/SKILL.md +7 -1
  54. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  55. package/skills/e2e-testing-expert/SKILL.md +7 -1
  56. package/skills/ecommerce-expert/SKILL.md +87 -0
  57. package/skills/email-notification-expert/SKILL.md +393 -360
  58. package/skills/error-resilience-expert/SKILL.md +506 -479
  59. package/skills/event-driven-architect/SKILL.md +7 -1
  60. package/skills/feature-flag-analytics-expert/SKILL.md +65 -45
  61. package/skills/file-upload-media-expert/SKILL.md +436 -430
  62. package/skills/firebase-security-expert/SKILL.md +7 -1
  63. package/skills/form-validation-expert/SKILL.md +406 -400
  64. package/skills/fullstack-expert/SKILL.md +184 -202
  65. package/skills/gemini-agent-booster/SKILL.md +173 -135
  66. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  67. package/skills/global-a11y-i18n-expert/SKILL.md +7 -1
  68. package/skills/glsl-shader-expert/SKILL.md +158 -69
  69. package/skills/go-programming-expert/SKILL.md +21 -15
  70. package/skills/graph-rag-knowledge-expert/SKILL.md +200 -0
  71. package/skills/graphql-apollo-expert/SKILL.md +113 -107
  72. package/skills/headless-cms-expert/SKILL.md +181 -0
  73. package/skills/hig/SKILL.md +7 -1
  74. package/skills/js-backend-expert/SKILL.md +218 -216
  75. package/skills/legacy-code-translator/SKILL.md +70 -64
  76. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  77. package/skills/logging-error-tracking-expert/SKILL.md +343 -337
  78. package/skills/mcp-server-architect/SKILL.md +308 -194
  79. package/skills/micro-frontend-architect/SKILL.md +111 -105
  80. package/skills/mobile-expo-expert/SKILL.md +8 -2
  81. package/skills/modern-css-native-expert/SKILL.md +189 -0
  82. package/skills/monorepo-architect/SKILL.md +7 -1
  83. package/skills/mpa-orchestrator/SKILL.md +20 -1
  84. package/skills/multi-agent-orchestration/SKILL.md +254 -234
  85. package/skills/multiple-entry-points/SKILL.md +37 -1
  86. package/skills/mvc-expert/SKILL.md +7 -1
  87. package/skills/n8n-automation-expert/SKILL.md +89 -0
  88. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  89. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  90. package/skills/payment-gateway-expert/SKILL.md +85 -1
  91. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  92. package/skills/performance-web-vitals/SKILL.md +7 -1
  93. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -57
  94. package/skills/prd-architect/SKILL.md +182 -201
  95. package/skills/proactive-background-watcher/SKILL.md +67 -61
  96. package/skills/production-ready-hardener/SKILL.md +459 -456
  97. package/skills/pwa-offline-first-expert/SKILL.md +226 -0
  98. package/skills/pydantic-ai-expert/SKILL.md +161 -0
  99. package/skills/python-programming-expert/SKILL.md +407 -401
  100. package/skills/rate-limit-abuse-prevention/SKILL.md +376 -370
  101. package/skills/realtime-collaboration-expert/SKILL.md +55 -1
  102. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  103. package/skills/rust-programming-expert/SKILL.md +7 -1
  104. package/skills/saas-architect/SKILL.md +154 -0
  105. package/skills/saas-billing/SKILL.md +7 -1
  106. package/skills/saas-multi-tenant/SKILL.md +7 -1
  107. package/skills/scalability-clean-code/SKILL.md +7 -1
  108. package/skills/search-engine-expert/SKILL.md +89 -0
  109. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  110. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -57
  111. package/skills/senior-frontend/SKILL.md +139 -161
  112. package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
  113. package/skills/seo/SKILL.md +41 -17
  114. package/skills/session-memory-manager/SKILL.md +128 -0
  115. package/skills/solidjs-expert/SKILL.md +80 -0
  116. package/skills/spa-orchestrator/SKILL.md +20 -1
  117. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  118. package/skills/state-management-expert/SKILL.md +7 -1
  119. package/skills/supabase-security-expert/SKILL.md +7 -1
  120. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  121. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  122. package/skills/synthetic-data-finetuning-expert/SKILL.md +155 -0
  123. package/skills/tailwind-expert/SKILL.md +88 -136
  124. package/skills/tanstack-query-expert/SKILL.md +7 -1
  125. package/skills/tauri-expert/SKILL.md +7 -1
  126. package/skills/typescript-expert/SKILL.md +12 -6
  127. package/skills/ui-ux-pro-max/SKILL.md +25 -3
  128. package/skills/vector-db-rag-expert/SKILL.md +175 -19
  129. package/skills/vercel-ai-sdk-expert/SKILL.md +181 -0
  130. package/skills/visual-qa-vision-agent/SKILL.md +70 -64
  131. package/skills/voice-ai-realtime-agent/SKILL.md +242 -0
  132. package/skills/vue-frontend-expert/SKILL.md +131 -125
  133. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  134. package/skills/web-3d-graphics-expert/SKILL.md +262 -80
  135. package/skills/web-game-engine-expert/SKILL.md +281 -48
  136. package/skills/web-scraper/SKILL.md +157 -207
  137. package/skills/website-design-cloner/SKILL.md +179 -173
  138. package/skills/webxr-ar-vr-expert/SKILL.md +108 -63
  139. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  140. package/skills/zero-to-prod-orchestrator/SKILL.md +65 -38
  141. package/skills/zero-trust-secret-vault/SKILL.md +87 -39
  142. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  143. package/.github/workflows/publish.yml +0 -20
  144. package/CONTRIBUTING.md +0 -199
  145. package/SECURITY.md +0 -21
  146. package/banner.png +0 -0
  147. package/skills/ai-cost-token-optimizer/SKILL.md +0 -52
  148. package/skills/asisten_ramah/SKILL.md +0 -41
  149. package/skills/auto-doc-updater/SKILL.md +0 -214
  150. package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
  151. package/skills/autonomous-swarm-director/SKILL.md +0 -69
  152. package/skills/edge-serverless-db-expert/SKILL.md +0 -43
  153. package/skills/hyper-context-synthesizer/SKILL.md +0 -55
  154. package/skills/llm-cost-arbitrage-router/SKILL.md +0 -59
  155. package/skills/mcp-client-orchestrator/SKILL.md +0 -70
  156. package/skills/mobile-push-notification-expert/SKILL.md +0 -51
  157. package/skills/monday-design-aesthetic/SKILL.md +0 -67
  158. package/skills/project-context-mapper/SKILL.md +0 -79
  159. package/skills/saas-mvp-launcher/SKILL.md +0 -241
  160. package/skills/saas-transformer/SKILL.md +0 -489
  161. package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
  162. package/skills/self-evolving-memory-graph/SKILL.md +0 -75
  163. package/skills/senior-fullstack/SKILL.md +0 -167
  164. package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
  165. package/skills/senior-fullstack/references/development_workflows.md +0 -222
  166. package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
  167. package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
  168. package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
  169. package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
  170. package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
  171. package/skills/seo-geo/SKILL.md +0 -188
  172. package/skills/session-context-loader/SKILL.md +0 -77
  173. package/skills/session-handoff-resume/SKILL.md +0 -158
  174. package/skills/skill_baru/SKILL.md +0 -172
  175. package/skills/supabase-migration/SKILL.md +0 -45
  176. package/skills/token-saver/SKILL.md +0 -119
  177. package/skills/ui-components-expert/SKILL.md +0 -280
  178. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  179. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  180. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  181. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  182. package/skills/ui_ux_expert/SKILL.md +0 -125
  183. package/skills/vibe-code-gardener/SKILL.md +0 -181
  184. package/vibes-swarm-demo.gif +0 -0
  185. /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
  186. /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
  187. /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
@@ -1,401 +0,0 @@
1
- # Billing & Payment Gateway Integration Guide
2
-
3
- A comprehensive guide to setting up subscription billing, payment gateways, and Merchant of Record (MoR) systems. This guide covers Stripe, Midtrans, PayPal, Paddle, and FastSpring, detailing database structures and webhook verification in a multi-tenant SaaS application.
4
-
5
- ---
6
-
7
- ## 1. Gateway Type: Payment Gateway vs. Merchant of Record (MoR)
8
-
9
- Before choosing a billing system, it is vital to understand the two main categories of billing platforms:
10
-
11
- | Feature | Payment Gateway (Stripe, Midtrans, PayPal) | Merchant of Record (Paddle, FastSpring) |
12
- |---|---|---|
13
- | **Definition** | Processes payments but places legal/financial responsibilities on you. | Acts as the reseller of your software; handles transactions and compliance. |
14
- | **Sales Tax / VAT** | You must calculate, collect, and file taxes globally (using tools like Stripe Tax). | Automatically handles global taxes, compliance, and invoicing. |
15
- | **Chargeback Liability**| You manage chargeback disputes directly. | The MoR platform handles chargeback disputes. |
16
- | **Integration Complexity**| Highly customizable APIs, but requires more backend logic for compliance. | Simple to configure; checkout UI is managed by the MoR. |
17
-
18
- ---
19
-
20
- ## 2. Generic Multi-Gateway Database Schema
21
-
22
- To support multiple payment gateways, use a generic subscription schema.
23
-
24
- ### Prisma Schema (`prisma/schema.prisma`)
25
- ```prisma
26
- model Subscription {
27
- id String @id @default(cuid())
28
- workspaceId String @unique
29
- workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
30
- gateway String // "stripe", "midtrans", "paypal", "paddle", "fastspring"
31
- gatewayCustomerId String? @unique
32
- gatewaySubscriptionId String? @unique
33
- gatewayPriceId String?
34
- status String // "active", "trialing", "past_due", "canceled", "unpaid"
35
- currentPeriodEnd DateTime
36
- cancelAtPeriodEnd Boolean @default(false)
37
- createdAt DateTime @default(now())
38
- updatedAt DateTime @updatedAt
39
- }
40
- ```
41
-
42
- ### Drizzle ORM Schema (`lib/db/schema.ts`)
43
- ```typescript
44
- import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';
45
-
46
- export const subscriptions = pgTable('subscriptions', {
47
- id: text('id').primaryKey(),
48
- workspaceId: text('workspace_id').notNull().unique(),
49
- gateway: text('gateway').notNull(), // "stripe", "midtrans", "paypal", "paddle", "fastspring"
50
- gatewayCustomerId: text('gateway_customer_id').unique(),
51
- gatewaySubscriptionId: text('gateway_subscription_id').unique(),
52
- gatewayPriceId: text('gateway_price_id'),
53
- status: text('status').notNull(),
54
- currentPeriodEnd: timestamp('current_period_end').notNull(),
55
- cancelAtPeriodEnd: boolean('cancel_at_period_end').default(false).notNull(),
56
- createdAt: timestamp('created_at').defaultNow().notNull(),
57
- updatedAt: timestamp('updated_at').defaultNow().notNull(),
58
- });
59
- ```
60
-
61
- ---
62
-
63
- ## 3. Webhook Implementations
64
-
65
- Webhooks are crucial to keep your SaaS database in sync with payment updates. Below are the implementation templates for Next.js 15 (App Router).
66
-
67
- ### A. Stripe Integration
68
- Processes subscriptions and invoices. Verified via the Stripe SDK.
69
-
70
- ```typescript
71
- import { NextResponse } from 'next/server';
72
- import Stripe from 'stripe';
73
- import { db } from '@/lib/db';
74
- import { subscriptions } from '@/lib/db/schema';
75
- import { eq } from 'drizzle-orm';
76
-
77
- const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2025-01-01' as any });
78
-
79
- export async function POST(req: Request) {
80
- const body = await req.text();
81
- const signature = req.headers.get('Stripe-Signature')!;
82
-
83
- let event: Stripe.Event;
84
- try {
85
- event = stripe.webhooks.constructEvent(body, signature, process.env.STRIPE_WEBHOOK_SECRET!);
86
- } catch (err: any) {
87
- return NextResponse.json({ error: `Signature verification failed: ${err.message}` }, { status: 400 });
88
- }
89
-
90
- switch (event.type) {
91
- case 'checkout.session.completed': {
92
- const session = event.data.object as Stripe.Checkout.Session;
93
- const workspaceId = session.metadata?.workspaceId;
94
- if (!workspaceId) break;
95
-
96
- const subscription = await stripe.subscriptions.retrieve(session.subscription as string);
97
- await db.insert(subscriptions).values({
98
- id: subscription.id,
99
- workspaceId,
100
- gateway: 'stripe',
101
- gatewayCustomerId: session.customer as string,
102
- gatewaySubscriptionId: subscription.id,
103
- gatewayPriceId: subscription.items.data[0].price.id,
104
- status: subscription.status,
105
- currentPeriodEnd: new Date(subscription.current_period_end * 1000),
106
- });
107
- break;
108
- }
109
- case 'invoice.payment_succeeded': {
110
- const invoice = event.data.object as Stripe.Invoice;
111
- if (!invoice.subscription) break;
112
- const subscription = await stripe.subscriptions.retrieve(invoice.subscription as string);
113
- await db.update(subscriptions)
114
- .set({
115
- status: subscription.status,
116
- currentPeriodEnd: new Date(subscription.current_period_end * 1000),
117
- })
118
- .where(eq(subscriptions.gatewaySubscriptionId, subscription.id));
119
- break;
120
- }
121
- case 'customer.subscription.deleted': {
122
- const subscription = event.data.object as Stripe.Subscription;
123
- await db.update(subscriptions)
124
- .set({ status: 'canceled' })
125
- .where(eq(subscriptions.gatewaySubscriptionId, subscription.id));
126
- break;
127
- }
128
- }
129
- return NextResponse.json({ received: true });
130
- }
131
- ```
132
-
133
- ### B. Midtrans Integration
134
- Southeast Asia's popular payment gateway. Verified via SHA512 signature key matching.
135
-
136
- ```typescript
137
- import { NextResponse } from 'next/server';
138
- import crypto from 'crypto';
139
- import { db } from '@/lib/db';
140
- import { subscriptions } from '@/lib/db/schema';
141
- import { eq } from 'drizzle-orm';
142
-
143
- export async function POST(req: Request) {
144
- const body = await req.json();
145
- const { order_id, status_code, gross_amount, signature_key, transaction_status, fraud_status } = body;
146
-
147
- // Verify signature key: sha512(order_id + status_code + gross_amount + server_key)
148
- const serverKey = process.env.MIDTRANS_SERVER_KEY!;
149
- const hashed = crypto
150
- .createHash('sha512')
151
- .update(order_id + status_code + gross_amount + serverKey)
152
- .digest('hex');
153
-
154
- if (hashed !== signature_key) {
155
- return NextResponse.json({ error: 'Invalid Midtrans signature' }, { status: 400 });
156
- }
157
-
158
- // Update subscription/payment state based on transaction_status
159
- if (transaction_status === 'capture' || transaction_status === 'settlement') {
160
- if (fraud_status === 'challenge') {
161
- await db.update(subscriptions).set({ status: 'unpaid' }).where(eq(subscriptions.id, order_id));
162
- } else {
163
- await db.update(subscriptions)
164
- .set({ status: 'active', currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) })
165
- .where(eq(subscriptions.id, order_id));
166
- }
167
- } else if (['cancel', 'deny', 'expire'].includes(transaction_status)) {
168
- await db.update(subscriptions).set({ status: 'canceled' }).where(eq(subscriptions.id, order_id));
169
- } else if (transaction_status === 'pending') {
170
- await db.update(subscriptions).set({ status: 'unpaid' }).where(eq(subscriptions.id, order_id));
171
- }
172
-
173
- return NextResponse.json({ success: true });
174
- }
175
- ```
176
-
177
- ### C. PayPal Integration
178
- Global subscription billing. Verified via PayPal API request validation.
179
-
180
- ```typescript
181
- import { NextResponse } from 'next/server';
182
- import { db } from '@/lib/db';
183
- import { subscriptions } from '@/lib/db/schema';
184
- import { eq } from 'drizzle-orm';
185
-
186
- async function verifyPayPalSignature(headers: Headers, rawBody: string, webhookId: string) {
187
- // Call PayPal API to verify signature authenticity
188
- const endpoint = process.env.PAYPAL_MODE === 'live'
189
- ? 'https://api-m.paypal.com'
190
- : 'https://api-m.sandbox.paypal.com';
191
-
192
- const authHeader = headers.get('authorization');
193
- if (!authHeader) return false;
194
-
195
- const response = await fetch(`${endpoint}/v1/notifications/verify-webhook-signature`, {
196
- method: 'POST',
197
- headers: {
198
- 'Content-Type': 'application/json',
199
- 'Authorization': authHeader,
200
- },
201
- body: JSON.stringify({
202
- auth_algo: headers.get('paypal-auth-algo'),
203
- cert_url: headers.get('paypal-cert-url'),
204
- transmission_id: headers.get('paypal-transmission-id'),
205
- transmission_sig: headers.get('paypal-transmission-sig'),
206
- transmission_time: headers.get('paypal-transmission-time'),
207
- webhook_id: webhookId,
208
- webhook_event: JSON.parse(rawBody),
209
- }),
210
- });
211
-
212
- const verification = await response.json();
213
- return verification.verification_status === 'SUCCESS';
214
- }
215
-
216
- export async function POST(req: Request) {
217
- const rawBody = await req.text();
218
- const webhookId = process.env.PAYPAL_WEBHOOK_ID!;
219
-
220
- const isValid = await verifyPayPalSignature(req.headers, rawBody, webhookId);
221
- if (!isValid) {
222
- return NextResponse.json({ error: 'PayPal signature invalid' }, { status: 400 });
223
- }
224
-
225
- const event = JSON.parse(rawBody);
226
-
227
- switch (event.event_type) {
228
- case 'BILLING.SUBSCRIPTION.CREATED': {
229
- const sub = event.resource;
230
- const workspaceId = sub.custom_id; // Pass workspace ID in custom_id
231
- if (!workspaceId) break;
232
-
233
- await db.insert(subscriptions).values({
234
- id: sub.id,
235
- workspaceId,
236
- gateway: 'paypal',
237
- gatewayCustomerId: sub.subscriber.payer_id,
238
- gatewaySubscriptionId: sub.id,
239
- gatewayPriceId: sub.plan_id,
240
- status: 'active',
241
- currentPeriodEnd: new Date(sub.billing_info.next_billing_time),
242
- });
243
- break;
244
- }
245
- case 'BILLING.SUBSCRIPTION.CANCELLED': {
246
- const sub = event.resource;
247
- await db.update(subscriptions)
248
- .set({ status: 'canceled' })
249
- .where(eq(subscriptions.gatewaySubscriptionId, sub.id));
250
- break;
251
- }
252
- }
253
-
254
- return NextResponse.json({ received: true });
255
- }
256
- ```
257
-
258
- ### D. Paddle Integration (Paddle Billing v2)
259
- Merchant of Record. Verified locally using an HMAC-SHA256 signature key verification.
260
-
261
- ```typescript
262
- import { NextResponse } from 'next/server';
263
- import crypto from 'crypto';
264
- import { db } from '@/lib/db';
265
- import { subscriptions } from '@/lib/db/schema';
266
- import { eq } from 'drizzle-orm';
267
-
268
- function verifyPaddleSignature(body: string, signatureHeader: string, secret: string): boolean {
269
- const parts = signatureHeader.split(';');
270
- const tsPart = parts.find(p => p.startsWith('ts='));
271
- const h1Part = parts.find(p => p.startsWith('h1='));
272
- if (!tsPart || !h1Part) return false;
273
-
274
- const ts = tsPart.split('=')[1];
275
- const h1 = h1Part.split('=')[1];
276
-
277
- const payload = `${ts}:${body}`;
278
- const computedHash = crypto.createHmac('sha256', secret).update(payload).digest('hex');
279
- return computedHash === h1;
280
- }
281
-
282
- export async function POST(req: Request) {
283
- const rawBody = await req.text();
284
- const signature = req.headers.get('Paddle-Signature')!;
285
- const secret = process.env.PADDLE_WEBHOOK_SECRET!;
286
-
287
- if (!verifyPaddleSignature(rawBody, signature, secret)) {
288
- return NextResponse.json({ error: 'Invalid Paddle signature' }, { status: 400 });
289
- }
290
-
291
- const event = JSON.parse(rawBody);
292
- const eventType = event.event_type;
293
- const data = event.data;
294
-
295
- switch (eventType) {
296
- case 'subscription.created':
297
- case 'subscription.updated': {
298
- const workspaceId = data.custom_data?.workspaceId;
299
- if (!workspaceId) break;
300
-
301
- await db.insert(subscriptions).values({
302
- id: data.id,
303
- workspaceId,
304
- gateway: 'paddle',
305
- gatewayCustomerId: data.customer_id,
306
- gatewaySubscriptionId: data.id,
307
- gatewayPriceId: data.items[0].price.id,
308
- status: data.status, // active, trialing, paused
309
- currentPeriodEnd: new Date(data.current_billing_period.ends_at),
310
- }).onConflictDoUpdate({
311
- target: subscriptions.workspaceId,
312
- set: {
313
- status: data.status,
314
- currentPeriodEnd: new Date(data.current_billing_period.ends_at),
315
- gatewayPriceId: data.items[0].price.id,
316
- }
317
- });
318
- break;
319
- }
320
- case 'subscription.canceled': {
321
- await db.update(subscriptions)
322
- .set({ status: 'canceled' })
323
- .where(eq(subscriptions.gatewaySubscriptionId, data.id));
324
- break;
325
- }
326
- }
327
-
328
- return NextResponse.json({ received: true });
329
- }
330
- ```
331
-
332
- ### E. FastSpring Integration
333
- Merchant of Record. Verified via an HMAC-SHA256 signature key verification.
334
-
335
- ```typescript
336
- import { NextResponse } from 'next/server';
337
- import crypto from 'crypto';
338
- import { db } from '@/lib/db';
339
- import { subscriptions } from '@/lib/db/schema';
340
- import { eq } from 'drizzle-orm';
341
-
342
- function verifyFastSpringSignature(body: string, signature: string, secretKey: string): boolean {
343
- const hash = crypto.createHmac('sha256', secretKey).update(body).digest('base64');
344
- return hash === signature;
345
- }
346
-
347
- export async function POST(req: Request) {
348
- const rawBody = await req.text();
349
- const signature = req.headers.get('X-FS-Signature')!;
350
- const secretKey = process.env.FASTSPRING_SHARED_SECRET!;
351
-
352
- if (!verifyFastSpringSignature(rawBody, signature, secretKey)) {
353
- return NextResponse.json({ error: 'Invalid FastSpring signature' }, { status: 400 });
354
- }
355
-
356
- const payload = JSON.parse(rawBody);
357
-
358
- for (const event of payload.events) {
359
- switch (event.type) {
360
- case 'subscription.activated': {
361
- const sub = event.data;
362
- const workspaceId = sub.tags?.workspaceId;
363
- if (!workspaceId) break;
364
-
365
- await db.insert(subscriptions).values({
366
- id: sub.id,
367
- workspaceId,
368
- gateway: 'fastspring',
369
- gatewayCustomerId: sub.account,
370
- gatewaySubscriptionId: sub.id,
371
- gatewayPriceId: sub.product,
372
- status: 'active',
373
- currentPeriodEnd: new Date(sub.nextSession),
374
- });
375
- break;
376
- }
377
- case 'subscription.canceled': {
378
- const sub = event.data;
379
- await db.update(subscriptions)
380
- .set({ status: 'canceled' })
381
- .where(eq(subscriptions.gatewaySubscriptionId, sub.id));
382
- break;
383
- }
384
- }
385
- }
386
-
387
- return NextResponse.json({ received: true });
388
- }
389
- ```
390
-
391
- ---
392
-
393
- ## 4. Best Practices for Webhook Handlers
394
-
395
- 1. **Webhook Idempotency**: Payment gateways can redeliver webhooks. Always store a list of processed event IDs in your database to prevent duplicate actions:
396
- ```typescript
397
- const processed = await db.query.processedEvents.findFirst({ where: eq(processedEvents.id, eventId) });
398
- if (processed) return NextResponse.json({ received: true });
399
- ```
400
- 2. **Handle Async Work Gracefully**: Send a fast response (`200 OK`) back to the gateway first, then process any heavy logic asynchronously (or via queue systems like BullMQ) if necessary, to avoid gateway timeouts.
401
- 3. **Database Locks**: Run your update queries inside clean transactions to avoid concurrency anomalies.
@@ -1,75 +0,0 @@
1
- ---
2
- name: self-evolving-memory-graph
3
- description: "Grants the AI long-term episodic memory. The agent autonomously documents the user's coding preferences, past mistakes to avoid, and architectural decisions into a persistent learning graph."
4
- author: "Roedy Rustam"
5
- ---
6
-
7
- # Self-Evolving Memory Graph (Episodic Memory)
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Claude forgets everything once a chat is cleared, and its "Project Knowledge" requires manual human updating. This skill gives Antigravity the "superpower" of continuous, autonomous self-improvement. The agent actively listens for user corrections, stylistic preferences, and hard-learned debugging lessons, writing them into a persistent `LEARNING_GRAPH.md` (or `.agents/LEARNING.md`) file. The agent gets smarter and more aligned with the user over time.
18
-
19
- ### Trigger Conditions
20
- Activate this skill when:
21
- - The user corrects your code (e.g., "Don't use `any`, use `unknown`", or "Always use Arrow functions").
22
- - You just spent a long time fixing a very complex bug.
23
- - The user says "Remember this for the future."
24
-
25
- ### Core Concepts
26
-
27
- #### 1. Memory Encoding
28
- Whenever a hard lesson is learned or a strong user preference is stated, do not just say "I will remember that." You must physically write it down.
29
- Use the `multi_replace_file_content` or `write_to_file` tool to append the lesson to the memory file.
30
-
31
- #### 2. Memory Format (`LEARNING_GRAPH.md`)
32
- ```markdown
33
- # 🧠 Self-Evolving Memory Graph
34
-
35
- ## User Stylistic Preferences
36
- - [2026-08-12] Always use `Tailwind v4 @theme` variables instead of arbitrary values like `text-[#ff0000]`.
37
- - [2026-08-12] Prefer functional components with `const` over `function` declarations.
38
-
39
- ## Hard-Learned Lessons (Avoid these mistakes)
40
- - [2026-08-11] Supabase RLS policies: Never use `auth.uid()` in a `FOR ALL` policy without checking role claims. It caused an infinite recursion bug in `users` table.
41
-
42
- ## Architectural Decisions
43
- - [2026-08-10] State Management: We exclusively use `Zustand` for global state. Do not suggest Redux.
44
- ```
45
-
46
- #### 3. Memory Retrieval
47
- Ensure `session-context-loader` is configured to read this memory file at the start of every new chat session.
48
-
49
- ---
50
-
51
- ### Integration with Other Skills (MANDATORY)
52
- - `session-context-loader` — Essential for loading the `LEARNING_GRAPH.md` when a new session starts.
53
- - `project-context-mapper` — The context map tracks *where* things are; the memory graph tracks *how* and *why* things are built.
54
-
55
- ### Referenced By Orchestrators (MANDATORY)
56
- - `brainstorming` — Add to "Discovery & Audit".
57
- - `zero-to-prod-orchestrator` — Phase 1 (Discovery & Architecture).
58
-
59
- ---
60
-
61
- <a name="bahasa-indonesia"></a>
62
- ## Bahasa Indonesia
63
-
64
- ### Deskripsi
65
- Claude melupakan segalanya saat sesi chat baru dimulai. Skill ini memberi Anda "kekuatan super" berupa *Ingatan Jangka Panjang* yang berevolusi sendiri. Agen secara aktif mencatat preferensi koding pengguna, pelajaran dari *bug* yang sulit dipecahkan, dan keputusan arsitektur ke dalam file persisten `LEARNING_GRAPH.md`.
66
-
67
- ### Kondisi Pemicu
68
- - Saat pengguna mengoreksi gaya koding Anda (misal: "Gunakan bahasa Indonesia baku", "Jangan pakai `var`").
69
- - Setelah Anda berhasil memecahkan *bug* yang menghabiskan waktu lama.
70
- - Saat pengguna berkata "Ingat ini untuk proyek ke depannya."
71
-
72
- ### Panduan Singkat
73
- - **Jangan Hanya Berjanji:** Jika pengguna mengoreksi Anda, jangan sekadar menjawab "Baik, saya akan ingat." LLM tidak punya ingatan bawaan antar-sesi. Anda **wajib** menulis koreksi tersebut ke dalam file `LEARNING_GRAPH.md` di folder `.agents/` atau direktori *root*.
74
- - **Kategorisasi Ingatan:** Pisahkan ingatan menjadi: Preferensi Gaya (*Style*), Pelajaran Berharga (*Lessons Learned*), dan Keputusan Arsitektur (*Decisions*).
75
- - **Semakin Lama Semakin Pintar:** Dengan membaca file ini di awal setiap percakapan, Anda tidak akan pernah mengulangi kesalahan yang sama dua kali.
@@ -1,167 +0,0 @@
1
- ---
2
- name: senior-fullstack
3
- description: "Complete toolkit for senior fullstack with modern tools and best practices / Perangkat instruksi lengkap untuk pengembang fullstack tingkat senior dengan alat-alat dan best practices termutakhir."
4
- author: "Roedy Rustam"
5
- ---
6
-
7
- # Senior Fullstack Developer (2026 Edition)
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Complete guidelines for senior fullstack developers building production-grade applications in 2026. Covers the modern AI-native stack, architecture decision-making, API design, frontend/backend integration, and team-level best practices.
18
-
19
- ### Trigger Conditions
20
- - Making fullstack architecture decisions across frontend and backend.
21
- - Designing API contracts between React 19/Next.js 15 frontend and Node.js/Go/Python backend.
22
- - Integrating AI features (LLM, agents, RAG) into a fullstack application.
23
- - Setting up a monorepo with shared types between frontend and backend.
24
- - Reviewing and improving overall application architecture and code quality.
25
-
26
- ### Modern 2026 Fullstack Stack
27
-
28
- #### Recommended Stacks by Use Case
29
-
30
- | Use Case | Frontend | Backend | Database | AI Layer |
31
- |---|---|---|---|---|
32
- | **SaaS App (default)** | Next.js 15 (App Router) | Hono / Fastify 5 | Postgres + Drizzle | Vercel AI SDK 5.x |
33
- | **AI-First App** | Next.js 15 + RSC streaming | Mastra.ai / LangGraph | pgvector + Supabase | Anthropic / OpenAI |
34
- | **Decoupled SPA** | TanStack Start + React 19 | Hono RPC | Postgres + Drizzle | Vercel AI SDK |
35
- | **Content Site** | Astro 5 + MDX | N/A (static) | Sanity / Contentful | — |
36
- | **Mobile** | Expo SDK 53 + React Native 0.79 | Hono / Fastify | SQLite (Expo) + Postgres | Vercel AI SDK |
37
-
38
- #### AI-Native Fullstack Patterns
39
- In 2026, AI is a first-class citizen in fullstack applications:
40
- - **Streaming AI Responses**: Use Next.js RSC + Vercel AI SDK `streamUI` to stream LLM responses as React components from the server.
41
- - **Server Actions as AI Triggers**: Use React 19 `useActionState` with Server Actions to invoke LLM calls without an API layer.
42
- - **Background AI Jobs**: Offload long LLM tasks to BullMQ + Redis workers; stream results via WebSockets or SSE.
43
- - **Structured AI Output**: Always use `zodResponseFormat` or Pydantic schemas for LLM responses — never parse free-form JSON.
44
-
45
- ### API Design Principles (2026)
46
-
47
- #### Type-Safe Communication
48
- Choose one approach and be consistent:
49
- - **Hono RPC**: If backend is Hono — zero codegen, end-to-end types.
50
- - **tRPC**: If using React Query with Next.js — excellent DX with RSC support.
51
- - **OpenAPI + codegen**: If you have multiple consumers (mobile, third parties).
52
-
53
- #### API Versioning
54
- - Use URL versioning: `/api/v1/users`.
55
- - Pin major version in URL, minor versions are backward-compatible.
56
- - Deprecate with `Deprecation` and `Sunset` headers.
57
-
58
- #### Error Response Standard (RFC 9457 Problem Details)
59
- ```typescript
60
- // Consistent error format across all endpoints
61
- interface ProblemDetail {
62
- type: string; // URI identifying the error type
63
- title: string; // Human-readable summary
64
- status: number; // HTTP status code
65
- detail: string; // Specific explanation
66
- instance?: string; // URI of the specific occurrence
67
- }
68
- ```
69
-
70
- ### SPA vs SSR vs Static — Decision Guide
71
- ```
72
- SEO-critical + mostly read? → Next.js SSR / Astro 5 (static)
73
- Highly interactive dashboard? → SPA (TanStack Start / Vite + TanStack Router)
74
- → see spa-orchestrator skill for architecture details
75
- Mixed (marketing + app)? → Next.js 15 with hybrid routing
76
- Real-time data? → SSR + WebSocket or SSE streaming
77
- ```
78
-
79
- ### Monorepo with Shared Types
80
- ```typescript
81
- // packages/types/src/index.ts — single source of truth
82
- export interface User {
83
- id: string;
84
- email: string;
85
- name: string;
86
- plan: 'free' | 'pro' | 'enterprise';
87
- isSuperAdmin: boolean;
88
- }
89
-
90
- export interface ApiResponse<T> {
91
- data: T;
92
- meta?: { page: number; total: number };
93
- }
94
-
95
- // apps/api — uses the type
96
- // apps/web — uses the same type
97
- // apps/admin — uses the same type
98
- import type { User } from '@myapp/types';
99
- ```
100
-
101
- ### Security Checklist (Fullstack)
102
- - [ ] All user inputs validated with Zod on the server (never trust the client).
103
- - [ ] JWT secrets rotated every 90 days; use short expiry + refresh tokens.
104
- - [ ] CSP headers configured (no `unsafe-inline` in production).
105
- - [ ] All DB queries use parameterized queries — no string concatenation.
106
- - [ ] File uploads validated for MIME type and scanned before storage.
107
- - [ ] Rate limiting on all public API endpoints.
108
- - [ ] Super Admin routes restricted to `admin.domain.com` with `isSuperAdmin` check.
109
-
110
- ### Code Review Standards
111
- - Functions < 30 lines; files < 300 lines.
112
- - No business logic in UI components.
113
- - Every PR includes relevant tests (unit or E2E).
114
- - No `any` types in TypeScript production code.
115
- - Dependencies audited with `pnpm audit` on every PR.
116
-
117
- ---
118
-
119
- <a name="bahasa-indonesia"></a>
120
- ## Bahasa Indonesia
121
-
122
- ### Deskripsi
123
- Panduan lengkap untuk pengembang fullstack senior yang membangun aplikasi tingkat produksi di 2026. Mencakup stack AI-native modern, pengambilan keputusan arsitektur, desain API, integrasi frontend/backend, dan best practices tingkat tim.
124
-
125
- ### Kondisi Pemicu
126
- - Membuat keputusan arsitektur fullstack di frontend dan backend.
127
- - Merancang kontrak API antara frontend React 19/Next.js 15 dan backend Node.js/Go/Python.
128
- - Mengintegrasikan fitur AI (LLM, agen, RAG) ke dalam aplikasi fullstack.
129
- - Menyiapkan monorepo dengan shared types antara frontend dan backend.
130
- - Meninjau dan meningkatkan arsitektur dan kualitas kode aplikasi secara keseluruhan.
131
-
132
- ### Stack Fullstack Modern 2026
133
-
134
- Rekomendasi stack berdasarkan use case:
135
- - **SaaS App**: Next.js 15 + Hono/Fastify + Postgres + Drizzle + Vercel AI SDK.
136
- - **AI-First App**: Next.js 15 RSC streaming + Mastra.ai/LangGraph + pgvector.
137
- - **SPA Terpisah**: TanStack Start + Hono RPC + Postgres — lihat `spa-orchestrator`.
138
- - **Situs Konten**: Astro 5 + MDX.
139
- - **Mobile**: Expo SDK 53 + Hono + SQLite.
140
-
141
- ### Pola Fullstack AI-Native (2026)
142
- AI adalah warga kelas satu di aplikasi fullstack 2026:
143
- - **Streaming RSC**: Alirkan respons LLM sebagai komponen React dari server menggunakan `streamUI` Vercel AI SDK 5.x.
144
- - **Server Actions sebagai Pemicu AI**: Panggil LLM dari Server Actions React 19 tanpa lapisan API terpisah.
145
- - **Background AI Jobs**: Offload tugas LLM panjang ke BullMQ + Redis; stream hasil via WebSocket atau SSE.
146
- - **Output AI Terstruktur**: Selalu gunakan `zodResponseFormat` atau skema Pydantic — jangan pernah parse JSON bebas dari LLM.
147
-
148
- ### Prinsip Desain API (2026)
149
- - **Hono RPC**: Zero codegen, end-to-end type-safe jika backend adalah Hono.
150
- - **tRPC**: Untuk React Query + Next.js dengan dukungan RSC.
151
- - **OpenAPI + codegen**: Jika memiliki banyak konsumen (mobile, pihak ketiga).
152
- - **Format Error RFC 9457**: Respons error yang konsisten dengan `type`, `title`, `status`, `detail`.
153
-
154
- ### SPA vs SSR vs Static
155
- Gunakan SSR/Astro untuk situs kritis SEO dan banyak baca. Gunakan SPA (TanStack Start) untuk dashboard yang sangat interaktif. Gunakan Next.js 15 dengan routing hybrid untuk aplikasi campuran (marketing + app).
156
-
157
- ### Monorepo dengan Shared Types
158
- Definisikan interface dan tipe bersama di `packages/types` — digunakan oleh semua app (web, admin, api, mobile) sebagai single source of truth.
159
-
160
- ### Checklist Keamanan
161
- - Input pengguna divalidasi Zod di server.
162
- - JWT rotasi 90 hari; expiry pendek + refresh token.
163
- - Header CSP dikonfigurasi.
164
- - Semua query DB menggunakan parameterized query.
165
- - Upload file divalidasi MIME type.
166
- - Rate limiting di semua endpoint publik.
167
- - Rute Super Admin dibatasi di `admin.domain.com` dengan cek `isSuperAdmin`.