codehava-agent-kit 1.0.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/README.md +56 -0
- package/bin/cli.js +56 -0
- package/package.json +26 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/templates/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/templates/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/templates/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/templates/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/templates/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/templates/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/templates/.agent/agents/backend-specialist.md +263 -0
- package/templates/.agent/agents/code-archaeologist.md +106 -0
- package/templates/.agent/agents/database-architect.md +226 -0
- package/templates/.agent/agents/debugger.md +225 -0
- package/templates/.agent/agents/devops-engineer.md +242 -0
- package/templates/.agent/agents/documentation-writer.md +104 -0
- package/templates/.agent/agents/explorer-agent.md +73 -0
- package/templates/.agent/agents/frontend-specialist.md +593 -0
- package/templates/.agent/agents/game-developer.md +162 -0
- package/templates/.agent/agents/mobile-developer.md +377 -0
- package/templates/.agent/agents/orchestrator.md +416 -0
- package/templates/.agent/agents/penetration-tester.md +188 -0
- package/templates/.agent/agents/performance-optimizer.md +187 -0
- package/templates/.agent/agents/product-manager.md +112 -0
- package/templates/.agent/agents/product-owner.md +95 -0
- package/templates/.agent/agents/project-planner.md +406 -0
- package/templates/.agent/agents/qa-automation-engineer.md +103 -0
- package/templates/.agent/agents/security-auditor.md +170 -0
- package/templates/.agent/agents/seo-specialist.md +111 -0
- package/templates/.agent/agents/test-engineer.md +158 -0
- package/templates/.agent/mcp_config.json +129 -0
- package/templates/.agent/rules/GEMINI.md +273 -0
- package/templates/.agent/scripts/auto_preview.py +148 -0
- package/templates/.agent/scripts/checklist.py +217 -0
- package/templates/.agent/scripts/session_manager.py +120 -0
- package/templates/.agent/scripts/verify_all.py +327 -0
- package/templates/.agent/skills/api-patterns/SKILL.md +81 -0
- package/templates/.agent/skills/api-patterns/api-style.md +42 -0
- package/templates/.agent/skills/api-patterns/auth.md +24 -0
- package/templates/.agent/skills/api-patterns/documentation.md +26 -0
- package/templates/.agent/skills/api-patterns/graphql.md +41 -0
- package/templates/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/templates/.agent/skills/api-patterns/response.md +37 -0
- package/templates/.agent/skills/api-patterns/rest.md +40 -0
- package/templates/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/templates/.agent/skills/api-patterns/security-testing.md +122 -0
- package/templates/.agent/skills/api-patterns/trpc.md +41 -0
- package/templates/.agent/skills/api-patterns/versioning.md +22 -0
- package/templates/.agent/skills/app-builder/SKILL.md +75 -0
- package/templates/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/templates/.agent/skills/app-builder/feature-building.md +53 -0
- package/templates/.agent/skills/app-builder/project-detection.md +34 -0
- package/templates/.agent/skills/app-builder/scaffolding.md +118 -0
- package/templates/.agent/skills/app-builder/tech-stack.md +41 -0
- package/templates/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/templates/.agent/skills/architecture/SKILL.md +55 -0
- package/templates/.agent/skills/architecture/context-discovery.md +43 -0
- package/templates/.agent/skills/architecture/examples.md +94 -0
- package/templates/.agent/skills/architecture/pattern-selection.md +68 -0
- package/templates/.agent/skills/architecture/patterns-reference.md +50 -0
- package/templates/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/templates/.agent/skills/bash-linux/SKILL.md +199 -0
- package/templates/.agent/skills/behavioral-modes/SKILL.md +242 -0
- package/templates/.agent/skills/better-auth-patterns/SKILL.md +121 -0
- package/templates/.agent/skills/brainstorming/SKILL.md +163 -0
- package/templates/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
- package/templates/.agent/skills/bullmq-worker/SKILL.md +124 -0
- package/templates/.agent/skills/clean-code/SKILL.md +201 -0
- package/templates/.agent/skills/code-review-checklist/SKILL.md +109 -0
- package/templates/.agent/skills/database-design/SKILL.md +52 -0
- package/templates/.agent/skills/database-design/database-selection.md +43 -0
- package/templates/.agent/skills/database-design/indexing.md +39 -0
- package/templates/.agent/skills/database-design/migrations.md +48 -0
- package/templates/.agent/skills/database-design/optimization.md +36 -0
- package/templates/.agent/skills/database-design/orm-selection.md +30 -0
- package/templates/.agent/skills/database-design/schema-design.md +56 -0
- package/templates/.agent/skills/database-design/scripts/schema_validator.py +172 -0
- package/templates/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/templates/.agent/skills/doc.md +177 -0
- package/templates/.agent/skills/documentation-templates/SKILL.md +194 -0
- package/templates/.agent/skills/feature-spec-writer/SKILL.md +76 -0
- package/templates/.agent/skills/frontend-design/SKILL.md +452 -0
- package/templates/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/templates/.agent/skills/frontend-design/color-system.md +311 -0
- package/templates/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/templates/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/templates/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/.agent/skills/frontend-design/typography-system.md +345 -0
- package/templates/.agent/skills/frontend-design/ux-psychology.md +1116 -0
- package/templates/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/templates/.agent/skills/game-development/2d-games/SKILL.md +119 -0
- package/templates/.agent/skills/game-development/3d-games/SKILL.md +135 -0
- package/templates/.agent/skills/game-development/SKILL.md +167 -0
- package/templates/.agent/skills/game-development/game-art/SKILL.md +185 -0
- package/templates/.agent/skills/game-development/game-audio/SKILL.md +190 -0
- package/templates/.agent/skills/game-development/game-design/SKILL.md +129 -0
- package/templates/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
- package/templates/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
- package/templates/.agent/skills/game-development/pc-games/SKILL.md +144 -0
- package/templates/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
- package/templates/.agent/skills/game-development/web-games/SKILL.md +150 -0
- package/templates/.agent/skills/geo-fundamentals/SKILL.md +156 -0
- package/templates/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/templates/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/.agent/skills/intelligent-routing/SKILL.md +335 -0
- package/templates/.agent/skills/lint-and-validate/SKILL.md +45 -0
- package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/templates/.agent/skills/mobile-design/SKILL.md +394 -0
- package/templates/.agent/skills/mobile-design/decision-trees.md +516 -0
- package/templates/.agent/skills/mobile-design/mobile-backend.md +491 -0
- package/templates/.agent/skills/mobile-design/mobile-color-system.md +420 -0
- package/templates/.agent/skills/mobile-design/mobile-debugging.md +122 -0
- package/templates/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/templates/.agent/skills/mobile-design/mobile-navigation.md +458 -0
- package/templates/.agent/skills/mobile-design/mobile-performance.md +767 -0
- package/templates/.agent/skills/mobile-design/mobile-testing.md +356 -0
- package/templates/.agent/skills/mobile-design/mobile-typography.md +433 -0
- package/templates/.agent/skills/mobile-design/platform-android.md +666 -0
- package/templates/.agent/skills/mobile-design/platform-ios.md +561 -0
- package/templates/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/.agent/skills/mobile-design/touch-psychology.md +537 -0
- package/templates/.agent/skills/neo-storage/SKILL.md +115 -0
- package/templates/.agent/skills/nextjs-api-route/SKILL.md +134 -0
- package/templates/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +351 -0
- package/templates/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/templates/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/templates/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/templates/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/templates/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/templates/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/templates/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/templates/.agent/skills/nextjs-react-expert/9-cache-components.md +103 -0
- package/templates/.agent/skills/nextjs-react-expert/SKILL.md +293 -0
- package/templates/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/templates/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/templates/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
- package/templates/.agent/skills/parallel-agents/SKILL.md +175 -0
- package/templates/.agent/skills/performance-profiling/SKILL.md +143 -0
- package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/.agent/skills/plan-writing/SKILL.md +152 -0
- package/templates/.agent/skills/powershell-windows/SKILL.md +167 -0
- package/templates/.agent/skills/prisma-7-patterns/SKILL.md +91 -0
- package/templates/.agent/skills/python-patterns/SKILL.md +441 -0
- package/templates/.agent/skills/red-team-tactics/SKILL.md +199 -0
- package/templates/.agent/skills/rust-pro/SKILL.md +176 -0
- package/templates/.agent/skills/seo-fundamentals/SKILL.md +129 -0
- package/templates/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/.agent/skills/server-management/SKILL.md +161 -0
- package/templates/.agent/skills/systematic-debugging/SKILL.md +109 -0
- package/templates/.agent/skills/tailwind-patterns/SKILL.md +269 -0
- package/templates/.agent/skills/tdd-workflow/SKILL.md +149 -0
- package/templates/.agent/skills/testing-patterns/SKILL.md +178 -0
- package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/.agent/skills/uu-pdp-feature-check/SKILL.md +116 -0
- package/templates/.agent/skills/vibe-buildplan/SKILL.md +232 -0
- package/templates/.agent/skills/vibe-prd/SKILL.md +226 -0
- package/templates/.agent/skills/vibe-research/SKILL.md +162 -0
- package/templates/.agent/skills/vibe-techdesign/SKILL.md +195 -0
- package/templates/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
- package/templates/.agent/skills/vulnerability-scanner/checklists.md +121 -0
- package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/.agent/skills/web-design-guidelines/SKILL.md +57 -0
- package/templates/.agent/skills/webapp-testing/SKILL.md +187 -0
- package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/templates/.agent/skills/xendit-integration/SKILL.md +100 -0
- package/templates/.agent/snippets/@react-component-template.tsx +29 -0
- package/templates/.agent/workflows/brainstorm.md +113 -0
- package/templates/.agent/workflows/create.md +59 -0
- package/templates/.agent/workflows/db-migrate.md +26 -0
- package/templates/.agent/workflows/debug.md +103 -0
- package/templates/.agent/workflows/deploy.md +35 -0
- package/templates/.agent/workflows/dev-reset.md +40 -0
- package/templates/.agent/workflows/enhance.md +63 -0
- package/templates/.agent/workflows/git-commit.md +24 -0
- package/templates/.agent/workflows/health-check.md +34 -0
- package/templates/.agent/workflows/new-feature.md +32 -0
- package/templates/.agent/workflows/orchestrate.md +237 -0
- package/templates/.agent/workflows/plan.md +89 -0
- package/templates/.agent/workflows/preview.md +81 -0
- package/templates/.agent/workflows/status.md +86 -0
- package/templates/.agent/workflows/test.md +144 -0
- package/templates/.agent/workflows/ui-ux-pro-max.md +296 -0
- package/templates/.agent/workflows/vibe-plan.md +133 -0
- package/templates/.agent/workflows/vibe-recap.md +17 -0
- package/templates/.antigravity/rules.md +64 -0
- package/templates/AGENTS.md +268 -0
- package/templates/docs/00A-PROJECT-CHARTER.md +33 -0
- package/templates/docs/00B-BRD.md +25 -0
- package/templates/docs/01-PRD.md +122 -0
- package/templates/docs/01B-SRS-LENGKAP.md +60 -0
- package/templates/docs/02-TECH-DESIGN.md +491 -0
- package/templates/docs/03-UI-GUIDELINES.md +301 -0
- package/templates/docs/04-BACKLOG.md +127 -0
- package/templates/docs/05-DEPLOYMENT.md +363 -0
- package/templates/docs/06-DEVELOPMENT-LOG.md +78 -0
- package/templates/specs/README.md +54 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# 05 — Deployment Guide
|
|
2
|
+
> Panduan lengkap setup VPS Biznet Gio + Coolify + CI/CD.
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 1. Arsitektur Deployment
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
GitHub (push to main)
|
|
10
|
+
│
|
|
11
|
+
▼ GitHub Actions (lint + build check)
|
|
12
|
+
│
|
|
13
|
+
▼ Coolify Webhook (auto-deploy)
|
|
14
|
+
│
|
|
15
|
+
▼ Docker Build
|
|
16
|
+
│
|
|
17
|
+
▼ Traefik (reverse proxy + SSL)
|
|
18
|
+
│
|
|
19
|
+
▼ https://[domain].com
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Setup Awal VPS Biznet Gio
|
|
25
|
+
|
|
26
|
+
### Spesifikasi Minimum
|
|
27
|
+
|
|
28
|
+
| Resource | MVP | Scaling |
|
|
29
|
+
|----------|-----|---------|
|
|
30
|
+
| CPU | 2 vCPU | 4–8 vCPU |
|
|
31
|
+
| RAM | 4 GB | 8–16 GB |
|
|
32
|
+
| Storage | 60 GB SSD | 100 GB SSD |
|
|
33
|
+
| OS | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS |
|
|
34
|
+
|
|
35
|
+
> ⚠️ **Production:** Pisahkan VPS database dari VPS app. PostgreSQL dan Next.js di server yang sama akan menyebabkan resource contention saat traffic tinggi.
|
|
36
|
+
|
|
37
|
+
### Initial Server Setup
|
|
38
|
+
```bash
|
|
39
|
+
# Update system
|
|
40
|
+
sudo apt update && sudo apt upgrade -y
|
|
41
|
+
sudo apt install -y curl git ufw
|
|
42
|
+
|
|
43
|
+
# Firewall
|
|
44
|
+
sudo ufw allow 22 # SSH
|
|
45
|
+
sudo ufw allow 80 # HTTP
|
|
46
|
+
sudo ufw allow 443 # HTTPS
|
|
47
|
+
sudo ufw allow 8000 # Coolify (setup awal)
|
|
48
|
+
sudo ufw enable
|
|
49
|
+
|
|
50
|
+
# Install Docker
|
|
51
|
+
curl -fsSL https://get.docker.com | sh
|
|
52
|
+
sudo usermod -aG docker $USER
|
|
53
|
+
newgrp docker
|
|
54
|
+
|
|
55
|
+
# Install Coolify
|
|
56
|
+
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Setelah install: buka `http://[IP-VPS]:8000`, buat akun admin.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. Coolify Configuration
|
|
64
|
+
|
|
65
|
+
### Services yang Di-deploy via Coolify
|
|
66
|
+
|
|
67
|
+
| Service | Port | Type |
|
|
68
|
+
|---------|------|------|
|
|
69
|
+
| Next.js Web | 3000 | Dockerfile |
|
|
70
|
+
| Socket.io + Worker | 3001 | Dockerfile |
|
|
71
|
+
| PostgreSQL | 5432 | Database |
|
|
72
|
+
| Redis | 6379 | Database |
|
|
73
|
+
|
|
74
|
+
### Setup Aplikasi di Coolify
|
|
75
|
+
1. New Resource → Application
|
|
76
|
+
2. Source: GitHub → pilih repo
|
|
77
|
+
3. Branch: `main`
|
|
78
|
+
4. Build Pack: `Dockerfile`
|
|
79
|
+
5. Port: sesuai service
|
|
80
|
+
6. Domain: `[domain].com`
|
|
81
|
+
7. SSL: Enable (auto via Let's Encrypt / Traefik)
|
|
82
|
+
|
|
83
|
+
### Environment Variables di Coolify
|
|
84
|
+
Masukkan semua env vars production di Coolify UI — **JANGAN** di `.env` yang ter-commit:
|
|
85
|
+
```
|
|
86
|
+
DATABASE_URL=postgresql://user:pass@postgres:5432/myapp_prod
|
|
87
|
+
REDIS_URL=redis://redis:6379
|
|
88
|
+
BETTER_AUTH_SECRET=[generate baru untuk prod]
|
|
89
|
+
BETTER_AUTH_URL=https://[domain].com
|
|
90
|
+
XENDIT_SECRET_KEY=xnd_production_...
|
|
91
|
+
XENDIT_CALLBACK_TOKEN=[random string panjang]
|
|
92
|
+
XENDIT_FEE_RULE_ID=
|
|
93
|
+
NEO_ENDPOINT=https://nos.wjv-1.neo.id
|
|
94
|
+
NEO_ACCESS_KEY=
|
|
95
|
+
NEO_SECRET_KEY=
|
|
96
|
+
NEO_BUCKET_NAME=myapp-prod
|
|
97
|
+
RESEND_API_KEY=
|
|
98
|
+
NEXT_PUBLIC_APP_URL=https://[domain].com
|
|
99
|
+
NODE_ENV=production
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 4. Dockerfile
|
|
105
|
+
|
|
106
|
+
### Next.js (`apps/web/Dockerfile`)
|
|
107
|
+
```dockerfile
|
|
108
|
+
FROM node:22-alpine AS base
|
|
109
|
+
RUN apk add --no-cache libc6-compat
|
|
110
|
+
|
|
111
|
+
FROM base AS deps
|
|
112
|
+
WORKDIR /app
|
|
113
|
+
COPY package*.json ./
|
|
114
|
+
RUN npm ci
|
|
115
|
+
|
|
116
|
+
FROM base AS builder
|
|
117
|
+
WORKDIR /app
|
|
118
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
119
|
+
COPY . .
|
|
120
|
+
RUN npx prisma generate
|
|
121
|
+
RUN npm run build
|
|
122
|
+
|
|
123
|
+
FROM base AS runner
|
|
124
|
+
WORKDIR /app
|
|
125
|
+
ENV NODE_ENV=production
|
|
126
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
127
|
+
RUN adduser --system --uid 1001 nextjs
|
|
128
|
+
COPY --from=builder /app/.next/standalone ./
|
|
129
|
+
COPY --from=builder /app/.next/static ./.next/static
|
|
130
|
+
COPY --from=builder /app/public ./public
|
|
131
|
+
USER nextjs
|
|
132
|
+
EXPOSE 3000
|
|
133
|
+
CMD ["node", "server.js"]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Socket.io + Worker (`apps/worker/Dockerfile`)
|
|
137
|
+
```dockerfile
|
|
138
|
+
FROM node:22-alpine
|
|
139
|
+
WORKDIR /app
|
|
140
|
+
COPY package*.json ./
|
|
141
|
+
RUN npm ci --only=production
|
|
142
|
+
COPY . .
|
|
143
|
+
EXPOSE 3001
|
|
144
|
+
CMD ["node", "server.js"]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 5. GitHub Actions CI/CD
|
|
150
|
+
|
|
151
|
+
### `.github/workflows/deploy.yml`
|
|
152
|
+
```yaml
|
|
153
|
+
name: Deploy Production
|
|
154
|
+
|
|
155
|
+
on:
|
|
156
|
+
push:
|
|
157
|
+
branches: [main]
|
|
158
|
+
|
|
159
|
+
jobs:
|
|
160
|
+
check:
|
|
161
|
+
runs-on: ubuntu-latest
|
|
162
|
+
steps:
|
|
163
|
+
- uses: actions/checkout@v4
|
|
164
|
+
- uses: actions/setup-node@v4
|
|
165
|
+
with:
|
|
166
|
+
node-version: '22'
|
|
167
|
+
cache: 'npm'
|
|
168
|
+
- run: npm ci
|
|
169
|
+
- run: npm run type-check
|
|
170
|
+
- run: npm run lint
|
|
171
|
+
|
|
172
|
+
deploy:
|
|
173
|
+
needs: check
|
|
174
|
+
runs-on: ubuntu-latest
|
|
175
|
+
steps:
|
|
176
|
+
- name: Trigger Coolify Deploy
|
|
177
|
+
run: |
|
|
178
|
+
curl -X POST \
|
|
179
|
+
-H "Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}" \
|
|
180
|
+
"https://[IP-VPS]:8000/api/v1/deploy?uuid=${{ secrets.COOLIFY_APP_UUID }}"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### GitHub Secrets yang Diperlukan
|
|
184
|
+
Di: Settings → Secrets → Actions
|
|
185
|
+
```
|
|
186
|
+
COOLIFY_TOKEN → dari Coolify: Settings → API Keys
|
|
187
|
+
COOLIFY_APP_UUID → UUID aplikasi di Coolify
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 6. Database Migration (Production)
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Jalankan migration di production via Coolify terminal atau SSH
|
|
196
|
+
cd /app
|
|
197
|
+
npx prisma migrate deploy
|
|
198
|
+
|
|
199
|
+
# Jangan pernah pakai migrate dev di production!
|
|
200
|
+
# migrate dev = reset + seed (bahaya di prod)
|
|
201
|
+
# migrate deploy = apply pending migrations saja
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Supabase CLI untuk manage migrations
|
|
205
|
+
```bash
|
|
206
|
+
npm install -g prisma
|
|
207
|
+
# Generate migration baru (di local)
|
|
208
|
+
npx prisma migrate dev --name [nama_migration]
|
|
209
|
+
# Push ke production
|
|
210
|
+
npx prisma migrate deploy
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 7. NEO Object Storage Setup
|
|
216
|
+
|
|
217
|
+
### Buat Bucket di Portal Biznet Gio
|
|
218
|
+
1. Login ke https://portal.biznetgio.com
|
|
219
|
+
2. NEO Object Storage → Create Bucket
|
|
220
|
+
3. Nama bucket: `myapp-prod`
|
|
221
|
+
4. ACL: Private (akses via presigned URL)
|
|
222
|
+
5. Salin Access Key + Secret Key → masukkan ke env vars Coolify
|
|
223
|
+
|
|
224
|
+
### Konfigurasi CORS (untuk upload langsung dari browser)
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"CORSRules": [{
|
|
228
|
+
"AllowedOrigins": ["https://[domain].com"],
|
|
229
|
+
"AllowedMethods": ["GET", "PUT", "POST"],
|
|
230
|
+
"AllowedHeaders": ["*"],
|
|
231
|
+
"MaxAgeSeconds": 3000
|
|
232
|
+
}]
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 8. Backup Strategy
|
|
239
|
+
|
|
240
|
+
### Backup PostgreSQL Harian ke NEO Object Storage
|
|
241
|
+
```bash
|
|
242
|
+
#!/bin/bash
|
|
243
|
+
# /home/ubuntu/backup-db.sh
|
|
244
|
+
|
|
245
|
+
DATE=$(date +%Y%m%d_%H%M%S)
|
|
246
|
+
BACKUP_FILE="backup_${DATE}.sql.gz"
|
|
247
|
+
BUCKET="myapp-backups"
|
|
248
|
+
|
|
249
|
+
# Dump database
|
|
250
|
+
docker exec postgres pg_dump -U produser myapp_prod | gzip > /tmp/${BACKUP_FILE}
|
|
251
|
+
|
|
252
|
+
# Upload ke NEO Object Storage
|
|
253
|
+
s3cmd put /tmp/${BACKUP_FILE} s3://${BUCKET}/${BACKUP_FILE} \
|
|
254
|
+
--host=nos.wjv-1.neo.id \
|
|
255
|
+
--host-bucket="%(bucket)s.nos.wjv-1.neo.id" \
|
|
256
|
+
--access_key=${NEO_ACCESS_KEY} \
|
|
257
|
+
--secret_key=${NEO_SECRET_KEY}
|
|
258
|
+
|
|
259
|
+
# Hapus backup lokal
|
|
260
|
+
rm /tmp/${BACKUP_FILE}
|
|
261
|
+
|
|
262
|
+
# Hapus backup lebih dari 7 hari
|
|
263
|
+
s3cmd ls s3://${BUCKET}/ | grep backup_ | sort | head -n -7 | \
|
|
264
|
+
awk '{print $4}' | xargs -I{} s3cmd del {}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Setup Cron
|
|
268
|
+
```bash
|
|
269
|
+
# Jalankan backup setiap hari jam 02:00 WIB
|
|
270
|
+
crontab -e
|
|
271
|
+
0 19 * * * /home/ubuntu/backup-db.sh >> /var/log/backup.log 2>&1
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 9. DNS & Domain Setup
|
|
277
|
+
|
|
278
|
+
### Cloudflare DNS Records
|
|
279
|
+
```
|
|
280
|
+
A @ [IP-VPS] # apex domain
|
|
281
|
+
A www [IP-VPS] # www
|
|
282
|
+
A api [IP-VPS] # API subdomain (jika terpisah)
|
|
283
|
+
A ws [IP-VPS] # Socket.io (jika butuh subdomain)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Cloudflare Settings
|
|
287
|
+
- **SSL/TLS:** Full (strict)
|
|
288
|
+
- **Auto HTTPS Redirect:** On
|
|
289
|
+
- **WebSocket:** On (untuk Socket.io)
|
|
290
|
+
- **Cache Level:** Standard
|
|
291
|
+
|
|
292
|
+
### ⚠️ Wajib: Accept Cloudflare DPA
|
|
293
|
+
Setelah domain aktif di Cloudflare, accept Data Processing Addendum:
|
|
294
|
+
1. Login Cloudflare → klik nama akun kanan atas
|
|
295
|
+
2. **My Profile → Privacy → Data Processing Addendum**
|
|
296
|
+
3. Klik "Accept DPA"
|
|
297
|
+
|
|
298
|
+
Ini menjadikan Cloudflare sub-processor sah sesuai UU PDP. Tanpa ini, IP address pengguna yang diproses Cloudflare tidak memiliki mekanisme transfer lintas negara yang sah.
|
|
299
|
+
|
|
300
|
+
> ⚠️ Socket.io butuh WebSocket support — pastikan Cloudflare proxy diaktifkan dengan setting WebSocket = On, atau bypass proxy untuk subdomain Socket.io.
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 10. Deployment Checklist
|
|
305
|
+
|
|
306
|
+
### Sebelum Deploy ke Production
|
|
307
|
+
- [ ] `npm run build` sukses tanpa error di local
|
|
308
|
+
- [ ] `npm run lint` bersih
|
|
309
|
+
- [ ] `npx prisma migrate deploy` sudah dijalankan
|
|
310
|
+
- [ ] Semua env vars sudah diset di Coolify
|
|
311
|
+
- [ ] Xendit callback URL sudah diupdate ke domain production
|
|
312
|
+
- [ ] Firebase project sudah switch ke production — **hanya FCM yang diaktifkan** (Analytics/Crashlytics/Performance = OFF)
|
|
313
|
+
- [ ] Backup database terakhir tersimpan
|
|
314
|
+
- [ ] Test manual di staging (jika ada)
|
|
315
|
+
|
|
316
|
+
### UU PDP Compliance (sekali saja, sebelum go-live pertama)
|
|
317
|
+
- [ ] **Cloudflare DPA** sudah di-accept → Dashboard → My Profile → Privacy → Data Processing Addendum
|
|
318
|
+
- [ ] **Firebase Data Processing Terms** sudah di-accept → Firebase Console → Project Settings → Usage and billing
|
|
319
|
+
- [ ] Privacy Policy mencantumkan Cloudflare, Firebase, Resend sebagai **sub-processor**
|
|
320
|
+
- [ ] Halaman Privacy Policy & Terms of Service tersedia dalam Bahasa Indonesia di app
|
|
321
|
+
- [ ] Consent flow saat registrasi aktif (checkbox **tidak** pre-checked)
|
|
322
|
+
- [ ] Tabel `consent_records` ada di database dan berfungsi
|
|
323
|
+
- [ ] Fitur **hapus akun** tersedia di settings pengguna
|
|
324
|
+
- [ ] Fitur **unduh data saya** tersedia di settings pengguna
|
|
325
|
+
|
|
326
|
+
### Setelah Deploy
|
|
327
|
+
- [ ] Aplikasi bisa diakses via domain
|
|
328
|
+
- [ ] SSL certificate valid (https berjalan)
|
|
329
|
+
- [ ] Login berhasil
|
|
330
|
+
- [ ] Test pembayaran Xendit (mode production)
|
|
331
|
+
- [ ] Cek logs tidak ada error critical di Coolify
|
|
332
|
+
- [ ] Uptime Kuma mendeteksi service UP
|
|
333
|
+
- [ ] Monitor resource VPS 15 menit pertama
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## 11. Troubleshooting
|
|
338
|
+
|
|
339
|
+
### Container tidak mau start
|
|
340
|
+
```bash
|
|
341
|
+
# Cek logs di Coolify UI atau via SSH
|
|
342
|
+
docker logs [container-name] --tail 100 -f
|
|
343
|
+
docker ps -a # lihat status semua container
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Database connection error
|
|
347
|
+
```bash
|
|
348
|
+
# Test koneksi PostgreSQL
|
|
349
|
+
docker exec postgres psql -U produser -d myapp_prod -c "SELECT 1"
|
|
350
|
+
# Cek env DATABASE_URL sudah benar
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Xendit webhook tidak masuk
|
|
354
|
+
1. Cek Xendit Dashboard → Settings → Webhooks
|
|
355
|
+
2. Pastikan URL sudah benar dan HTTPS
|
|
356
|
+
3. Test dengan Xendit webhook tester
|
|
357
|
+
4. Cek logs di Coolify untuk error
|
|
358
|
+
5. Pastikan `XENDIT_CALLBACK_TOKEN` sama antara Xendit dan env vars
|
|
359
|
+
|
|
360
|
+
### Socket.io tidak connect
|
|
361
|
+
1. Pastikan port 3001 tidak diblok firewall
|
|
362
|
+
2. Pastikan Cloudflare WebSocket = On
|
|
363
|
+
3. Cek CORS origin di Socket.io server sudah include domain production
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# 06 — Development Log
|
|
2
|
+
> File ini **append-only** — JANGAN edit entry lama, hanya tambah di bawah.
|
|
3
|
+
> Catat setiap keputusan teknis, perubahan arsitektur, dan lesson learned.
|
|
4
|
+
> AI membaca ini untuk memahami kenapa sebuah keputusan dibuat.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Cara Menambah Entry
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
## YYYY-MM-DD
|
|
12
|
+
|
|
13
|
+
### [KEPUTUSAN] Judul singkat
|
|
14
|
+
**Konteks:** Apa situasinya?
|
|
15
|
+
**Keputusan:** Apa yang dipilih?
|
|
16
|
+
**Alasan:** Kenapa ini dipilih vs alternatif lain?
|
|
17
|
+
**Dampak:** Apa konsekuensinya?
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Kategori:** `[KEPUTUSAN]` `[PERUBAHAN]` `[PROBLEM]` `[RISET]` `[REGULASI]` `[DEPLOY]`
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Maret 2026
|
|
25
|
+
|
|
26
|
+
### [KEPUTUSAN] Stack teknologi final
|
|
27
|
+
**Konteks:** Memilih stack untuk aplikasi multi-platform (Web + Mobile + Marketplace).
|
|
28
|
+
**Keputusan:** Next.js 16.1 + Flutter 3.41.2 + PostgreSQL 17 + Prisma 7 + Better Auth 1.5 + Coolify di Biznet Gio VPS.
|
|
29
|
+
**Alasan:** Next.js 16 App Router terbaik untuk SSR/SSG. Flutter untuk single codebase Android+iOS. Biznet Gio untuk data residency Indonesia. Coolify untuk self-hosted PaaS tanpa vendor lock-in.
|
|
30
|
+
**Dampak:** Semua developer wajib familiar dengan App Router, async params, dan async headers() di Next.js 16.
|
|
31
|
+
|
|
32
|
+
### [KEPUTUSAN] Data fetching: Server Components default + TanStack Query client
|
|
33
|
+
**Konteks:** Memilih strategi data fetching untuk Next.js 16.
|
|
34
|
+
**Keputusan:** Server Components (default, sebagian besar data) + TanStack Query (client mutations/optimistic UI/realtime).
|
|
35
|
+
**Alasan:** Server Components = zero bundle, SEO, langsung query Prisma. TanStack Query (12.3M weekly downloads) lebih powerful dari SWR.
|
|
36
|
+
**Dampak:** Default fetch di server — TanStack Query hanya untuk client interaktif.
|
|
37
|
+
|
|
38
|
+
### [KEPUTUSAN] Arsitektur: Modular Monolith
|
|
39
|
+
**Konteks:** Memilih arsitektur untuk tim 2–3 orang.
|
|
40
|
+
**Keputusan:** Modular Monolith — 1 Next.js app + 1 BullMQ Worker container.
|
|
41
|
+
**Alasan:** Di bawah 10 developer monolith selalu lebih produktif. Expert consensus 2025: microservices di tahap ini = "trading a cluttered closet for a burning warehouse".
|
|
42
|
+
**Dampak:** Kode per domain (auth/, payment/, orders/). Extract microservice hanya jika ada bottleneck teridentifikasi.
|
|
43
|
+
|
|
44
|
+
### [KEPUTUSAN] CDN: Cloudflare Free + NEO Object Storage
|
|
45
|
+
**Konteks:** Strategi CDN dan file storage.
|
|
46
|
+
**Keputusan:** Cloudflare Free (DNS/DDoS/proxy) + NEO Object Storage Biznet Gio.
|
|
47
|
+
**Alasan:** Cloudflare + VPS Indonesia cukup untuk user lokal. NEO sudah di stack, data di Indonesia (comply UU PDP). Catatan: November 2025 Kominfo ancam blokir Cloudflare — Bunny.net bisa jadi backup.
|
|
48
|
+
**Dampak:** Wajib accept Cloudflare DPA. NEO bucket = private, akses via presigned URL.
|
|
49
|
+
|
|
50
|
+
### [KEPUTUSAN] Push Notifications: Firebase FCM only
|
|
51
|
+
**Konteks:** Provider push notif untuk Flutter.
|
|
52
|
+
**Keputusan:** Firebase FCM — hanya `firebase_messaging`.
|
|
53
|
+
**Alasan:** Gratis, unlimited, official Google SDK Flutter. Android dari Play Store wajib FCM. OneSignal tetap pakai FCM di balik layar.
|
|
54
|
+
**Dampak:** JANGAN aktifkan Firebase Analytics/Crashlytics/Performance — pakai Sentry. Accept Firebase Data Processing Terms di Console.
|
|
55
|
+
|
|
56
|
+
### [KEPUTUSAN] Payment Gateway: Xendit
|
|
57
|
+
**Konteks:** Perlu split payment native untuk marketplace.
|
|
58
|
+
**Keputusan:** Xendit.
|
|
59
|
+
**Alasan:** Satu-satunya gateway Indonesia dengan native split payment API. Terdaftar OJK. Fee: VA Rp 4.000, QRIS 0.7%, CC 2.9%+Rp2.000.
|
|
60
|
+
**Dampak:** Platform tidak pernah tampung dana. Hanya install di app yang ada transaksi keuangan.
|
|
61
|
+
|
|
62
|
+
### [REGULASI] UU PDP — Cloudflare DPA + Firebase DPT
|
|
63
|
+
**Konteks:** UU PDP No. 27/2022 berlaku efektif Oktober 2024.
|
|
64
|
+
**Keputusan:** Accept Cloudflare DPA + Firebase Data Processing Terms.
|
|
65
|
+
**Alasan:** UU PDP tidak wajibkan semua data di Indonesia — yang wajib adalah mekanisme transfer sah. DPA/DPT memenuhi syarat. PostgreSQL tetap di Biznet Gio.
|
|
66
|
+
**Dampak:** Privacy Policy wajib cantumkan Cloudflare, Firebase, Resend sebagai sub-processor. Data breach: lapor Komdigi + user dalam 72 jam.
|
|
67
|
+
|
|
68
|
+
### [KEPUTUSAN] Antigravity: Rules + 8 Skills + 6 Workflows + MCP
|
|
69
|
+
**Konteks:** Standarisasi cara kerja AI agent.
|
|
70
|
+
**Keputusan:** Rules + 8 Skills + 6 Workflows + MCP servers (Context7, GitHub, PostgreSQL, Playwright, Sentry, Docker).
|
|
71
|
+
**Alasan:** Rules = selalu aktif. Skills = pengetahuan stack on-demand. Workflows = automation. Context7 kritis untuk Prisma 7 + Next.js 16 yang sering breaking change.
|
|
72
|
+
**Dampak:** Developer baru langsung dapat config yang sama. Wajib `use context7` saat coding Prisma/Next.js.
|
|
73
|
+
|
|
74
|
+
### [PERUBAHAN] Next.js 16: `headers()` harus di-await
|
|
75
|
+
**Konteks:** Setelah setup ditemukan Next.js 16 membuat `headers()` juga async.
|
|
76
|
+
**Perubahan:** Semua `headers()` harus `await` — termasuk di Better Auth `getSession()` dan Xendit webhook.
|
|
77
|
+
**Kenapa:** Breaking change Next.js 16.
|
|
78
|
+
**Dampak:** Pattern baru: `await auth.api.getSession({ headers: await headers() })` dan `(await headers()).get('x-callback-token')`. Ditambahkan ke rules dan semua code examples.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# specs/ — Feature Spec Files
|
|
2
|
+
|
|
3
|
+
Folder ini berisi spec singkat per fitur **sebelum** AI mulai coding.
|
|
4
|
+
Konsep dari KhazP/vibe-coding-prompt-template — "agent handoff artifacts".
|
|
5
|
+
|
|
6
|
+
## Kenapa Perlu Ini?
|
|
7
|
+
|
|
8
|
+
Antigravity agent bekerja terbaik dengan konteks yang terfokus.
|
|
9
|
+
Daripada langsung bilang "buat fitur checkout", tulis spec dulu di sini —
|
|
10
|
+
agent punya blueprint yang jelas dan tidak akan salah arah.
|
|
11
|
+
|
|
12
|
+
## Format File
|
|
13
|
+
|
|
14
|
+
Nama file: `NNN-nama-fitur.md` (contoh: `001-checkout.md`, `002-profile-edit.md`)
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
# [NNN] Nama Fitur
|
|
18
|
+
|
|
19
|
+
**Status:** Draft / Ready / In Progress / Done
|
|
20
|
+
**Sprint:** [nomor sprint]
|
|
21
|
+
**Assignee:** [nama atau "AI"]
|
|
22
|
+
**Estimasi:** S / M / L
|
|
23
|
+
|
|
24
|
+
## Tujuan
|
|
25
|
+
[1-2 kalimat: kenapa fitur ini dibangun]
|
|
26
|
+
|
|
27
|
+
## Acceptance Criteria
|
|
28
|
+
- [ ] [kriteria 1 — testable, konkret]
|
|
29
|
+
- [ ] [kriteria 2]
|
|
30
|
+
- [ ] [kriteria 3]
|
|
31
|
+
|
|
32
|
+
## File yang Akan Diubah
|
|
33
|
+
- `app/(dashboard)/[path]/page.tsx`
|
|
34
|
+
- `lib/[module]/index.ts`
|
|
35
|
+
- `prisma/schema.prisma` (jika ada perubahan DB)
|
|
36
|
+
|
|
37
|
+
## API / Data yang Dibutuhkan
|
|
38
|
+
- `GET /api/[resource]` — [deskripsi]
|
|
39
|
+
- `POST /api/[resource]` — [deskripsi]
|
|
40
|
+
|
|
41
|
+
## Constraint
|
|
42
|
+
- Jangan ubah: [komponen/file yang tidak boleh diubah]
|
|
43
|
+
- Dependensi: [fitur lain yang harus selesai dulu]
|
|
44
|
+
|
|
45
|
+
## Catatan Tambahan
|
|
46
|
+
[hal-hal penting lainnya]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Cara Pakai di Antigravity
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Baca specs/001-checkout.md, lalu implementasikan sesuai acceptance criteria.
|
|
53
|
+
Jangan ubah file selain yang tercantum di "File yang Akan Diubah".
|
|
54
|
+
```
|