@ojokesusu/lintasai 1.1.2
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/.github/workflows/publish-npm.yml +40 -0
- package/.github/workflows/validate.yml +93 -0
- package/AUDIT_POST_SETUP_PROMPT_v1.md +280 -0
- package/BOOTSTRAP_PROJECT_DOCS_PROMPT_v1.md +3 -0
- package/CHANGELOG.md +313 -0
- package/CLAUDE_universal_v1.md +1021 -0
- package/CONTRIBUTING.md +101 -0
- package/FIRST_SESSION_PROMPT_v1.md +7 -0
- package/JALANKAN_KIT.md +188 -0
- package/LICENSE +21 -0
- package/MULAI_DI_SINI.md +145 -0
- package/PROJECT_KICKOFF_PROMPT_v1.md +3 -0
- package/PROJECT_LIFECYCLE_PROMPT_v1.md +536 -0
- package/PROJECT_MIGRATION_PROMPT_v1.md +3 -0
- package/README.md +505 -0
- package/SETUP_POLA_B_PROMPT_v1.md +5 -0
- package/SPLIT_REPO_MIGRATION_PROMPT_v1.md +485 -0
- package/TEAM_ROLLOUT_GUIDE_v1.md +172 -0
- package/UPDATE_DOCS_PROMPT_v1.md +3 -0
- package/UPDATE_KIT_PROMPT_v1.md +213 -0
- package/bin/lintasai.js +81 -0
- package/docs/SIGNED_RELEASE.md +162 -0
- package/install-windows.ps1 +225 -0
- package/kit.ps1 +508 -0
- package/lib/agents-md.ps1 +174 -0
- package/lib/git-helpers.ps1 +104 -0
- package/lib/kit-files.psd1 +133 -0
- package/lib/manifest-signing.ps1 +65 -0
- package/lib/manifest.ps1 +267 -0
- package/lib/rollback.ps1 +241 -0
- package/lib/safety.ps1 +193 -0
- package/lib/template-deploy.ps1 +242 -0
- package/lib/version-detect.ps1 +161 -0
- package/package.json +36 -0
- package/setup-pola-b.ps1 +687 -0
- package/templates/ANALOGI_LIBRARY.md +7 -0
- package/templates/CLAUDE_TEAM_GUIDE.md +505 -0
- package/templates/CROSS_REPO_TYPES_PIPELINE.md +473 -0
- package/templates/DB_SCHEMA_SCAN_PROMPT.md +194 -0
- package/templates/DISCORD_BOT_INTEGRATION.md +187 -0
- package/templates/GLOSSARY_NON_PROGRAMMER.md +361 -0
- package/templates/INDEX.md +157 -0
- package/templates/MCP_SETUP.md +1145 -0
- package/templates/MIGRATE_TO_SUBFOLDER_PROMPT_v1.md +220 -0
- package/templates/ONBOARDING.md +172 -0
- package/templates/PROJECT_STARTER_TEMPLATES.md +264 -0
- package/templates/PROMPT_LIBRARY.md +790 -0
- package/templates/RLS_SETUP_PROMPT.md +167 -0
- package/templates/SECURITY_INCIDENT_PLAYBOOK.md +191 -0
- package/templates/SPLIT_REPO_AGENTS_TEMPLATES.md +32 -0
- package/templates/SPLIT_REPO_NON_PROGRAMMER_PROMPTS.md +604 -0
- package/templates/SPLIT_REPO_TOOLS_SETUP.md +388 -0
- package/templates/STACK_DETECTION_PATTERN.md +261 -0
- package/templates/STACK_GUIDE.md +564 -0
- package/templates/STACK_MIGRATION_GUIDE.md +154 -0
- package/templates/STACK_VERSIONS.md +31 -0
- package/templates/UPDATE_GUIDE.md +246 -0
- package/templates/_EXAMPLE.md +110 -0
- package/templates/_PATTERNS.md +173 -0
- package/templates/architecture.md +180 -0
- package/templates/architecture_auto.md +61 -0
- package/templates/decisions/README.md +108 -0
- package/templates/decisions/_TEMPLATE.md +84 -0
- package/templates/feature-flags-advanced.md +171 -0
- package/templates/github/CODEOWNERS.template +61 -0
- package/templates/github/GENERATE_TYPES_SCRIPT.md +77 -0
- package/templates/github/PUBLISH_SHARED_WORKFLOW.yml +52 -0
- package/templates/github/RECEIVE_BACKEND_UPDATE.yml +106 -0
- package/templates/github/RENOVATE_FRONTEND.json +28 -0
- package/templates/github/TRIGGER_FRONTEND_UPDATE.yml +29 -0
- package/templates/github/pull_request_template.md +44 -0
- package/templates/github/scripts/ai-review.js +153 -0
- package/templates/github/workflows/ai-review.yml +61 -0
- package/templates/github/workflows/backup-schemas.yml +169 -0
- package/templates/glossary.md +110 -0
- package/templates/split-agents/BACKEND.md +149 -0
- package/templates/split-agents/FRONTEND.md +141 -0
- package/templates/split-agents/SHARED.md +82 -0
- package/templates/split-agents/TOOLS.md +77 -0
- package/tests/Run-Tests.ps1 +19 -0
- package/tests/lib-safety.Tests.ps1 +66 -0
- package/tests/rollback.Tests.ps1 +66 -0
- package/tests/uninstall.Tests.ps1 +265 -0
- package/tests/update-kit.Tests.ps1 +78 -0
- package/uninstall.ps1 +794 -0
- package/update-kit.ps1 +907 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# templates/STACK_MIGRATION_GUIDE.md — Panduan Migrasi Stack (Advanced)
|
|
2
|
+
|
|
3
|
+
> Versi 1 · 2026-06-03
|
|
4
|
+
> **POST-LAUNCH ADVANCED.** Default tim pakai Vercel — file ini cuma untuk fase migrasi spesifik (cost Vercel over-budget, butuh background worker persistent, atau butuh WebSocket long-lived).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Pengantar
|
|
9
|
+
|
|
10
|
+
File ini = **pendamping `STACK_GUIDE.md`** untuk fase migrasi vendor hosting.
|
|
11
|
+
|
|
12
|
+
**JANGAN baca file ini di Day 0–1.** Staff IT non-programmer fase awal cukup pakai Vercel + Supabase sesuai `STACK_GUIDE.md` section 3.
|
|
13
|
+
|
|
14
|
+
**Baru relevan kalau:**
|
|
15
|
+
|
|
16
|
+
- Bill Vercel sudah lewat budget (umumnya >$100/bulan untuk satu project) DAN owner sudah verifikasi penyebabnya bukan misconfiguration (mis. ISR revalidate kekecilan, image optimization mati).
|
|
17
|
+
- Butuh **background worker persistent** (Vercel function = serverless, mati setelah HTTP response selesai → tidak cocok untuk job antrian panjang, polling DB terus-menerus, dll.).
|
|
18
|
+
- Butuh **WebSocket / Server-Sent Events long-lived connection** (Vercel Edge punya batasan koneksi durasi pendek).
|
|
19
|
+
- Owner sudah baca Decision Matrix di `STACK_GUIDE.md` section 9 dan memutuskan pindah.
|
|
20
|
+
|
|
21
|
+
> *Background worker* = proses yang jalan terus-menerus di server (bukan response per request HTTP). Contoh: pengirim email batch, scraper jadwal, queue processor.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 2. Railway Migration Guide
|
|
26
|
+
|
|
27
|
+
Kapan pilih Railway:
|
|
28
|
+
|
|
29
|
+
- Butuh background worker persistent + cron native gratis.
|
|
30
|
+
- Mau tetap pakai stack Docker-portable (tidak vendor-lock seperti Vercel Edge).
|
|
31
|
+
- Tim sudah familiar Nixpacks atau Dockerfile.
|
|
32
|
+
|
|
33
|
+
### 2.1. Provision
|
|
34
|
+
|
|
35
|
+
1. https://railway.app → New Project → Deploy from GitHub.
|
|
36
|
+
2. Add PostgreSQL plugin (klik **+ New** → Database → PostgreSQL).
|
|
37
|
+
3. Connection string auto-inject ke service via `${{ Postgres.DATABASE_URL }}`.
|
|
38
|
+
|
|
39
|
+
### 2.2. Env Vars
|
|
40
|
+
|
|
41
|
+
Service → Variables → tambah satu per satu, atau import dari `.env`.
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
DATABASE_URL = ${{ Postgres.DATABASE_URL }}
|
|
45
|
+
NEXT_PUBLIC_SITE_URL = https://akses.up.railway.app
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2.3. Dockerfile vs Nixpacks
|
|
49
|
+
|
|
50
|
+
- **Nixpacks** (default) — auto-detect Next.js, no config. Pilih ini dulu.
|
|
51
|
+
- **Dockerfile** — kalau butuh dependency native (ImageMagick, FFmpeg, Chromium).
|
|
52
|
+
|
|
53
|
+
Contoh Dockerfile Next.js minimal:
|
|
54
|
+
|
|
55
|
+
```dockerfile
|
|
56
|
+
FROM node:20-alpine AS builder
|
|
57
|
+
WORKDIR /app
|
|
58
|
+
COPY package*.json ./
|
|
59
|
+
RUN npm ci
|
|
60
|
+
COPY . .
|
|
61
|
+
RUN npm run build
|
|
62
|
+
|
|
63
|
+
FROM node:20-alpine AS runner
|
|
64
|
+
WORKDIR /app
|
|
65
|
+
COPY --from=builder /app/.next/standalone ./
|
|
66
|
+
COPY --from=builder /app/.next/static ./.next/static
|
|
67
|
+
COPY --from=builder /app/public ./public
|
|
68
|
+
EXPOSE 3000
|
|
69
|
+
CMD ["node", "server.js"]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Note: aktifkan `output: 'standalone'` di `next.config.js`.
|
|
73
|
+
|
|
74
|
+
### 2.4. Background Worker + Cron Native
|
|
75
|
+
|
|
76
|
+
Railway dukung worker service terpisah dari web. Add **+ New Service** → pilih repo yang sama, set start command beda:
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
Web service: npm run start (= next start)
|
|
80
|
+
Worker service: npm run worker (= node dist/worker.js)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Cron: pakai package `node-cron` di worker service, atau Railway **Cron Job** (klik service → Settings → Cron Schedule).
|
|
84
|
+
|
|
85
|
+
### 2.5. Healthcheck Endpoint
|
|
86
|
+
|
|
87
|
+
Railway monitor `GET /api/health` (configurable). Bikin route:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
// app/api/health/route.ts
|
|
91
|
+
export async function GET() {
|
|
92
|
+
return Response.json({ status: 'ok', ts: Date.now() })
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 3. Render Migration Guide (Alternative)
|
|
99
|
+
|
|
100
|
+
Mirip Railway, tapi UI beda + pricing model beda. Pilih Render kalau:
|
|
101
|
+
|
|
102
|
+
- Mau spending limit ketat (Render lebih predictable per service).
|
|
103
|
+
- Tim sudah familiar Render (mis. pakai untuk proyek lain).
|
|
104
|
+
|
|
105
|
+
### 3.1. Web Service + DB Terpisah
|
|
106
|
+
|
|
107
|
+
1. https://render.com → New → **PostgreSQL** → pilih region + plan.
|
|
108
|
+
2. New → **Web Service** → connect GitHub repo.
|
|
109
|
+
3. Connection string DB di-copy manual ke env var `DATABASE_URL`.
|
|
110
|
+
|
|
111
|
+
### 3.2. Build / Start Command
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
Build Command: npm ci && npm run build
|
|
115
|
+
Start Command: npm run start
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Untuk Next.js standalone:
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
Start Command: node .next/standalone/server.js
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 3.3. Background Worker + Cron
|
|
125
|
+
|
|
126
|
+
- **Background Worker**: New → Background Worker → set start command sama dengan worker proyek (mis. `npm run worker`).
|
|
127
|
+
- **Cron Job**: New → Cron Job → schedule pakai sintaks cron (`0 */6 * * *` = tiap 6 jam) + command (`npm run cron:cleanup`).
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 4. Checklist Pre-Migration (Sebelum Pindah dari Vercel)
|
|
132
|
+
|
|
133
|
+
Sebelum eksekusi migrasi, pastikan:
|
|
134
|
+
|
|
135
|
+
- [ ] Sudah verifikasi bill Vercel bukan akibat misconfiguration (cek `Project → Usage`, bandingkan dengan optimasi: ISR revalidate, image optimization, function region).
|
|
136
|
+
- [ ] Sudah baca `STACK_GUIDE.md` section 9 (Decision Matrix) dan paham trade-off vendor lock-in.
|
|
137
|
+
- [ ] Backup DB Supabase aktif (Settings → Database → Backups).
|
|
138
|
+
- [ ] Rollback plan siap: kalau migrasi gagal, balik ke Vercel via DNS switch (TTL DNS ≤5 menit sebelum cutover).
|
|
139
|
+
- [ ] Custom domain SSL siap di vendor baru (Railway/Render auto-handle, tapi propagation DNS bisa 1–24 jam).
|
|
140
|
+
- [ ] Env vars sensitif sudah di-copy ke vendor baru dan di-mark Sensitive/Secret.
|
|
141
|
+
- [ ] Tim yang punya akses Vercel sudah diberi akses Railway/Render (least privilege).
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 5. Referensi Eksternal
|
|
146
|
+
|
|
147
|
+
- Railway docs: https://docs.railway.app
|
|
148
|
+
- Render docs: https://render.com/docs
|
|
149
|
+
- Decision Matrix vendor: `templates/STACK_GUIDE.md` section 9
|
|
150
|
+
- Default workflow (sebelum migrasi): `templates/STACK_GUIDE.md` section 3 (Vercel Setup)
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
> **Update file ini** tiap kali ada perubahan flow Railway/Render (UI dashboard, pricing tier, atau best practice). Catat di `CHANGELOG.md` kit + bump versi.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Stack Versions Reference - lintasAI
|
|
2
|
+
|
|
3
|
+
> Single source of truth untuk version requirement.
|
|
4
|
+
> Update file ini saat upgrade major version framework.
|
|
5
|
+
> Konsumen: STACK_GUIDE.md, FRONTEND.md, STACK_DETECTION_PATTERN.md, dst.
|
|
6
|
+
> Last updated: 2026-06-05
|
|
7
|
+
|
|
8
|
+
## Required Versions (Minimum Supported)
|
|
9
|
+
|
|
10
|
+
| Stack | Minimum | Recommended | Tested |
|
|
11
|
+
|---|---|---|---|
|
|
12
|
+
| Node.js | 18.x | 20.x LTS | 20.x |
|
|
13
|
+
| Next.js | 14.x | 16.x | 16.2.3 |
|
|
14
|
+
| React | 18.x | 19.x | 19.2.4 |
|
|
15
|
+
| Prisma | 5.x | 7.x | 7.7.0 |
|
|
16
|
+
| Tailwind | 3.x | 4.x | 4.x |
|
|
17
|
+
| TypeScript | 5.x | 5.x | 5.x |
|
|
18
|
+
| NextAuth | v4 | v4 | 4.24.13 |
|
|
19
|
+
|
|
20
|
+
## Version Compatibility Matrix
|
|
21
|
+
|
|
22
|
+
| lintasAI version | Next.js | Prisma | Notes |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| v1.0.0 | 14-16 | 5-7 | Default akses stack |
|
|
25
|
+
| v1.1.0+ | 17+ | 8+ | Future |
|
|
26
|
+
|
|
27
|
+
## Update Policy
|
|
28
|
+
|
|
29
|
+
- Patch bumps (Next 16.2 → 16.3): auto-supported
|
|
30
|
+
- Minor bumps (Next 16 → 17): test in staging dulu
|
|
31
|
+
- Major bumps: kit version bump + migration guide
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# docs/UPDATE_GUIDE.md — Cara Update Kit lintasAI (untuk Staff IT Non-Programmer)
|
|
2
|
+
|
|
3
|
+
> Versi 1 · 2026-06-04 · auto-deployed oleh setup-pola-b.ps1
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Untuk siapa & kapan baca dokumen ini
|
|
8
|
+
|
|
9
|
+
Dokumen ini untuk **staff IT non-programmer** yang pakai kit `lintasAI` di proyek harian. Baca kalau:
|
|
10
|
+
|
|
11
|
+
- Kamu lihat notifikasi/chat "lintasAI versi baru rilis" dan bingung harus apa.
|
|
12
|
+
- AI di Claude Code bilang "kit kamu ketinggalan, update dulu".
|
|
13
|
+
- Kamu mau tahu apakah update versi baru aman atau bikin file lama berantakan.
|
|
14
|
+
- Kamu mau rollback (balik ke versi lama) karena update terasa "aneh".
|
|
15
|
+
|
|
16
|
+
Kalau kamu programmer senior dan butuh detail teknis sha256/manifest diff, langsung loncat ke `./.claude-kit/CHANGELOG.md` + baca source `update-kit.ps1`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. TL;DR (baca ini dulu kalau buru-buru)
|
|
21
|
+
|
|
22
|
+
Kit `lintasAI` di-update dengan **1 perintah** — entah lewat chat AI ("lintasAI v1.2.0 rilis, update") atau jalanin `kit.ps1 update` di PowerShell. Sistem otomatis re-clone versi terbaru, backup file kamu yang ter-modifikasi, lalu AI **auto-pakai aturan baru** di sesi berikutnya. Mirip kayak **WhatsApp auto-update di Play Store** — kamu tinggal tap, fitur baru langsung jalan, chat lama tidak hilang.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 3. 4-Tier Update Strategy (level keparahan update)
|
|
27
|
+
|
|
28
|
+
Tidak semua update sama besarnya. Kit `lintasAI` punya **4 level**, dari yang paling ringan sampai yang butuh perhatian khusus:
|
|
29
|
+
|
|
30
|
+
| Tier | Label CHANGELOG | Contoh isi update | Analogi tools digital | Aksi staff |
|
|
31
|
+
|------|-----------------|-------------------|----------------------|------------|
|
|
32
|
+
| **1 — Silent** | (tanpa label) | Typo, perbaikan kalimat, fix link rusak | **WhatsApp 2.23.10 → 2.23.11** auto-update di background, kamu bahkan tidak sadar | Cukup 1 perintah `kit.ps1 update`. Selesai. |
|
|
33
|
+
| **2 — AI auto-sync** | (tanpa label) | Aturan baru ditambahin, template baru, prompt baru | **iPhone iOS 17.3 → 17.4** minor — ada fitur baru tapi semua app lama tetap jalan normal | 1 perintah update. AI di sesi berikutnya auto-pakai aturan baru. Tidak perlu setup ulang. |
|
|
34
|
+
| **3 — [BREAKING]** | `[BREAKING]` | Struktur file/folder berubah, format CLAUDE.md ganti, nama file di-rename | **iPhone iOS 16 → iOS 17** major — sebelum upgrade muncul layar "backup dulu ya", beberapa setting harus dicek ulang | Baca **"Migration Steps"** inline di CHANGELOG.md untuk versi itu. Biasanya 2-5 langkah PowerShell. AI bisa bantu jalanin step-by-step. |
|
|
35
|
+
| **4 — [SCAN-REQUIRED]** | `[SCAN-REQUIRED]` | Logic bulk-bootstrap berubah, rule scan dokumen lama ganti | **Tokopedia Seller ganti algoritma kategori** — produk lama harus di-remap ulang biar tetap muncul di pencarian | Paste ulang isi `JALANKAN_KIT.md` ke chat AI baru. AI scan ulang proyek pakai rule baru, lalu apply. |
|
|
36
|
+
|
|
37
|
+
**Cara baca label:** buka `./.claude-kit/CHANGELOG.md`, lihat entry versi terbaru. Kalau ada `[BREAKING]` atau `[SCAN-REQUIRED]` di judul, naik tier. Kalau cuma "fix typo di template X", itu Tier 1.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 4. Dual-Mode Update — pilih yang nyaman
|
|
42
|
+
|
|
43
|
+
Ada **2 cara** update kit. Sama-sama valid, tapi pas konteks beda:
|
|
44
|
+
|
|
45
|
+
### Mode A — AI Chat (RECOMMENDED untuk harian)
|
|
46
|
+
|
|
47
|
+
Buka Claude Code, chat:
|
|
48
|
+
|
|
49
|
+
> "lintasAI v1.2.0 rilis, update dong"
|
|
50
|
+
|
|
51
|
+
AI akan:
|
|
52
|
+
1. Fetch `CHANGELOG.md` versi baru dari GitHub `ojokesusu/lintasAI`.
|
|
53
|
+
2. Parse label tier (Tier 1/2/3/4).
|
|
54
|
+
3. Compose ringkasan Bahasa Indonesia: "ada 3 perubahan, 1 typo + 1 fitur baru + 1 BREAKING (rename folder X → Y)".
|
|
55
|
+
4. Tanya konfirmasi: "lanjut update?" — kamu jawab "ya".
|
|
56
|
+
5. Jalanin `./.claude-kit/kit.ps1 update` otomatis.
|
|
57
|
+
6. Kalau Tier 3/4, AI bacain "Migration Steps" satu per satu sambil tunggu kamu OK.
|
|
58
|
+
|
|
59
|
+
**Analogi:** kayak **Tokopedia Seller** yang push notif "ada update aturan baru ongkir, mau lihat?" — kamu tap, dia jelasin pakai bahasa biasa, kamu tinggal setuju.
|
|
60
|
+
|
|
61
|
+
### Mode B — PowerShell Script (fallback / CI / advanced)
|
|
62
|
+
|
|
63
|
+
Buka PowerShell di folder proyek, jalanin:
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
./.claude-kit/kit.ps1 update
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Script otomatis classify tier dan kasih output terstruktur di terminal:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
[OK] Fetched lintasAI v1.2.0 (was: v1.1.3)
|
|
73
|
+
[INFO] 3 changes: 1 Tier-1, 1 Tier-2, 1 Tier-3 [BREAKING]
|
|
74
|
+
[ACTION REQUIRED] Tier-3 migration needed:
|
|
75
|
+
- Step 1: Rename folder docs/old/ -> docs/legacy/
|
|
76
|
+
- Step 2: Update reference di AGENTS.md line 42
|
|
77
|
+
[BACKUP] 2 files user-modified -> .claude-kit/CLAUDE_universal_v1.md.bak-20260604-1530
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Mode ini dipakai kalau:
|
|
81
|
+
- Kamu CI/CD pipeline (no AI in the loop).
|
|
82
|
+
- Sambungan internet AI lagi lemot, mau update offline lebih cepat.
|
|
83
|
+
- Kamu programmer dan suka lihat output mentah.
|
|
84
|
+
|
|
85
|
+
**Analogi:** kayak `git pull` manual vs pakai GitHub Desktop GUI — sama hasilnya, beda interface.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 5. Skenario sehari-hari — kapan tiap tier muncul
|
|
90
|
+
|
|
91
|
+
**Skenario A: Tier 1 — Hari Senin pagi**
|
|
92
|
+
> Owner kit fix typo "ANALAGI" → "ANALOGI" di `ANALOGI_LIBRARY.md`. Kamu chat "update", AI bilang "cuma typo, aman 100%, update otomatis". Kamu lanjut kerja. Tidak ada yang berubah di workflow kamu.
|
|
93
|
+
|
|
94
|
+
**Skenario B: Tier 2 — Hari Rabu sore**
|
|
95
|
+
> Owner kit tambah 5 prompt baru di `PROMPT_LIBRARY.md` untuk handle task "code review". Kamu update. Sesi AI besok pagi, kamu tanya "review PR ini", AI auto-pakai prompt baru tanpa kamu sadar. Mirip **Excel kasih function baru `XLOOKUP`** — formula lama (`VLOOKUP`) tetap jalan, function baru tinggal dipakai kalau mau.
|
|
96
|
+
|
|
97
|
+
**Skenario C: Tier 3 [BREAKING] — Hari Jumat siang**
|
|
98
|
+
> Owner kit rename `CLAUDE_universal_v1.md` → `LINTAS_AI_RULES.md`. CHANGELOG kasih Migration Steps:
|
|
99
|
+
> 1. Tutup semua sesi Claude Code.
|
|
100
|
+
> 2. Jalanin `kit.ps1 update`.
|
|
101
|
+
> 3. AI auto-update referensi di `AGENTS.md` kamu.
|
|
102
|
+
> 4. Buka sesi baru, verifikasi AI baca file baru.
|
|
103
|
+
>
|
|
104
|
+
> Analogi: kayak **BCA mobile minta re-login pakai biometric** setelah update major — sedikit ribet, tapi sekali doang.
|
|
105
|
+
|
|
106
|
+
**Skenario D: Tier 4 [SCAN-REQUIRED] — Hari Senin pagi setelah weekend**
|
|
107
|
+
> Owner kit ubah logic scan: dulu cuma baca `docs/`, sekarang juga baca `prisma/schema.prisma`. Kamu paste ulang `JALANKAN_KIT.md` ke chat AI baru. AI bilang "saya scan ulang proyek pakai rule baru ya", lalu propose update di beberapa file lama. Kamu approve. Analogi: **Tokopedia minta seller re-kategorisasi produk** setelah ganti algoritma — sekali kerjaan, manfaat panjang.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 6. Cara execute update — langkah konkret
|
|
112
|
+
|
|
113
|
+
### Cara 1 (RECOMMENDED): Chat ke AI
|
|
114
|
+
|
|
115
|
+
1. Buka Claude Code di folder proyek (mis. `D:\Users\Administrator\projects\akses`).
|
|
116
|
+
2. Ketik di chat: `lintasAI v1.2.0 rilis, update`.
|
|
117
|
+
(Ganti `1.2.0` dengan versi yang kamu lihat di chat tim / di GitHub.)
|
|
118
|
+
3. Tunggu AI ringkas perubahan dalam Bahasa Indonesia.
|
|
119
|
+
4. Jawab `ya` kalau setuju.
|
|
120
|
+
5. AI eksekusi + verifikasi + lapor "selesai, versi sekarang v1.2.0".
|
|
121
|
+
|
|
122
|
+
### Cara 2 (advanced): PowerShell
|
|
123
|
+
|
|
124
|
+
1. Buka PowerShell.
|
|
125
|
+
2. `cd` ke folder proyek.
|
|
126
|
+
3. Jalanin:
|
|
127
|
+
```powershell
|
|
128
|
+
./.claude-kit/kit.ps1 update
|
|
129
|
+
```
|
|
130
|
+
4. Baca output, ikuti `[ACTION REQUIRED]` kalau ada.
|
|
131
|
+
5. Kalau Tier 3/4, buka `./.claude-kit/CHANGELOG.md` baca section "Migration Steps" versi itu.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 7. Apa yang ter-backup otomatis
|
|
136
|
+
|
|
137
|
+
Update kit pakai **atomic re-clone** (kit lama dihapus, kit baru di-clone fresh). Tapi file yang **kamu modifikasi sendiri** tidak hilang — dilindungi pakai logic sha256 di `update-kit.ps1`:
|
|
138
|
+
|
|
139
|
+
- Sebelum re-clone, script hitung sha256 tiap file kit.
|
|
140
|
+
- Bandingkan dengan manifest versi awal install.
|
|
141
|
+
- File yang sha256-nya **beda** (= kamu pernah edit) → di-backup ke `.bak-YYYYMMDD-HHmm`.
|
|
142
|
+
- File yang sha256-nya **sama** (= tidak pernah disentuh) → langsung ditimpa fresh.
|
|
143
|
+
|
|
144
|
+
**Contoh:**
|
|
145
|
+
```
|
|
146
|
+
./.claude-kit/CLAUDE_universal_v1.md ← tidak pernah kamu edit, di-overwrite
|
|
147
|
+
./.claude-kit/CLAUDE_universal_v1.md.bak-20260604-1530 ← (tidak dibuat, file aman)
|
|
148
|
+
|
|
149
|
+
./.claude-kit/templates/INDEX.md ← kamu edit kemarin
|
|
150
|
+
./.claude-kit/templates/INDEX.md.bak-20260604-1530 ← BACKUP versi kamu disini
|
|
151
|
+
./.claude-kit/templates/INDEX.md ← versi baru kit di-install di sini
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Setelah update, kamu bisa **diff manual** antara file baru vs `.bak` kamu, lalu merge perubahan yang masih relevan. AI bisa bantu kalau kamu chat "merge backup INDEX.md kemarin ke versi baru".
|
|
155
|
+
|
|
156
|
+
**Analogi:** mirip **Google Drive kasih versioning otomatis** — file lama tidak hilang, tinggal buka "Version History".
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 8. Auto-cleanup backup (30 hari + max 3 versi)
|
|
161
|
+
|
|
162
|
+
Biar folder `.claude-kit/` tidak penuh sampah `.bak`, `update-kit.ps1` punya auto-cleanup:
|
|
163
|
+
|
|
164
|
+
- **Aturan 1:** file `.bak` yang umurnya > **30 hari** dihapus otomatis tiap kali update.
|
|
165
|
+
- **Aturan 2:** kalau ada > **3 versi backup** untuk file yang sama, versi paling lama dihapus (keep 3 terbaru).
|
|
166
|
+
|
|
167
|
+
**Contoh:**
|
|
168
|
+
```
|
|
169
|
+
INDEX.md.bak-20260301-1200 ← 95 hari lalu, DIHAPUS
|
|
170
|
+
INDEX.md.bak-20260520-0900 ← keep (3 terbaru)
|
|
171
|
+
INDEX.md.bak-20260601-1430 ← keep
|
|
172
|
+
INDEX.md.bak-20260604-1530 ← keep (paling baru)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Analogi:** kayak **WhatsApp auto-delete chat backup di Google Drive setelah 1 tahun** — sistem self-clean, tidak perlu kamu pikirin.
|
|
176
|
+
|
|
177
|
+
> Catatan: TIDAK ada folder `migrations/` per breaking change (over-engineering). Migration instructions ditulis **inline** di CHANGELOG entry per versi, supaya satu tempat aja yang dibaca.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 9. Rollback kalau update bermasalah
|
|
182
|
+
|
|
183
|
+
Kalau setelah update terasa "aneh" (mis. AI bingung, file hilang, error import), rollback:
|
|
184
|
+
|
|
185
|
+
### Cara 1: kit.ps1 rollback
|
|
186
|
+
|
|
187
|
+
```powershell
|
|
188
|
+
./.claude-kit/kit.ps1 rollback
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Script otomatis cari snapshot pre-update terakhir dan restore.
|
|
192
|
+
|
|
193
|
+
### Cara 2: git restore (kalau kit di-track git)
|
|
194
|
+
|
|
195
|
+
```powershell
|
|
196
|
+
git restore --source=HEAD~1 -- .claude-kit/
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Balik ke versi commit sebelumnya. Cocok kalau kamu sudah commit kit ke repo proyek.
|
|
200
|
+
|
|
201
|
+
### Cara 3: chat AI
|
|
202
|
+
|
|
203
|
+
> "rollback update lintasAI tadi, kayanya bermasalah"
|
|
204
|
+
|
|
205
|
+
AI auto-jalanin Cara 1 + verifikasi.
|
|
206
|
+
|
|
207
|
+
**Analogi:** kayak **iPhone "Restore from iCloud Backup"** — kalau update iOS bermasalah, restore ke snapshot sebelumnya, semua data balik.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 10. FAQ untuk staff non-programmer
|
|
212
|
+
|
|
213
|
+
**Q1: Saya tidak update selama 2 bulan, aman?**
|
|
214
|
+
Aman, kit lama tetap jalan. Tapi AI mungkin tidak tahu fitur/aturan baru. Best practice: update minimal 1× per 2 minggu, atau tiap kali owner kit announce versi baru di chat tim.
|
|
215
|
+
|
|
216
|
+
**Q2: Update bisa bikin file `docs/` proyek saya hilang?**
|
|
217
|
+
**TIDAK.** Update cuma sentuh folder `./.claude-kit/`. File proyek (mis. `docs/`, `prisma/`, `app/`) tidak ke-touch sama sekali. Kit dan proyek terpisah, kayak **app WhatsApp vs chat history kamu** — update app tidak hapus chat.
|
|
218
|
+
|
|
219
|
+
**Q3: Saya pernah edit `CLAUDE_universal_v1.md`, edit-an saya hilang setelah update?**
|
|
220
|
+
Tidak. File user-modified auto-backup ke `.bak-YYYYMMDD-HHmm`. Bisa kamu cek + merge manual. AI bisa bantu.
|
|
221
|
+
|
|
222
|
+
**Q4: Versi kit terbaru di mana saya lihat?**
|
|
223
|
+
Buka `github.com/ojokesusu/lintasAI` → file `CHANGELOG.md`. Atau chat AI: "versi terbaru lintasAI berapa?".
|
|
224
|
+
|
|
225
|
+
**Q5: Sesi AI besok pagi otomatis tahu aturan baru, atau saya perlu setting ulang?**
|
|
226
|
+
Auto. Tiap kali AI start sesi, dia baca `./.claude-kit/CLAUDE_universal_v1.md` fresh. Jadi setelah update, sesi berikutnya = pakai aturan baru tanpa setting ulang. Analogi: **Notion update template** → besok kamu buka Notion, template baru langsung ada.
|
|
227
|
+
|
|
228
|
+
**Q6: Saya CI/CD, update di pipeline gimana?**
|
|
229
|
+
Pakai Mode B (PowerShell). Tambahin step `./.claude-kit/kit.ps1 update --non-interactive` di pipeline. Exit code non-zero kalau ada Tier 3/4 yang butuh manual review.
|
|
230
|
+
|
|
231
|
+
**Q7: Kalau saya cuma 1 orang (solo project), perlu update juga?**
|
|
232
|
+
Perlu. Owner kit terus improve aturan, prompt, dan analogi. Update = AI kamu makin pintar. Solo project lebih gampang lagi karena tidak perlu koordinasi tim.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 11. Cross-reference
|
|
237
|
+
|
|
238
|
+
- **Istilah teknis** (mis. "sha256", "manifest", "atomic re-clone") → buka `./.claude-kit/templates/ANALOGI_LIBRARY.md` untuk analogi sehari-hari.
|
|
239
|
+
- **Detail per versi** (apa berubah di v1.2.0 vs v1.3.0) → buka `./.claude-kit/CHANGELOG.md`.
|
|
240
|
+
- **Audit setelah update besar** → ikuti pattern di `./.claude-kit/CLAUDE_universal_v1.md` section 4.4 "Audit Post-Setup".
|
|
241
|
+
- **Aturan umum kerja AI-first** → `./.claude-kit/CLAUDE_universal_v1.md` (wajib baca tiap sesi).
|
|
242
|
+
- **Kalau bingung, chat AI**: "saya mau update lintasAI tapi tidak paham langkahnya" — AI guide step-by-step.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
> Dokumen ini bagian dari kit `lintasAI` v1.0.0 (commit d7284b1). Update guide ini sendiri ikut tier classification — kalau owner kit ubah strategy update, versi guide ini naik ke v2 dengan `[BREAKING]` label.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# docs/_EXAMPLE.md — Contoh Format `.md` Pendamping (REFERENSI)
|
|
2
|
+
|
|
3
|
+
> Versi 1 · 2026-05-31 · generic untuk semua proyek tim
|
|
4
|
+
> File ini SISTEM (prefix `_`) — referensi format, **jangan dihapus**.
|
|
5
|
+
|
|
6
|
+
## Pengantar
|
|
7
|
+
|
|
8
|
+
File ini = **contoh konkret 1 file `.md` pendamping** yang ditulis sesuai format standar tim (`_PATTERNS.md` seksi 3). Pakai sebagai reference saat kamu (atau AI) buat `.md` pendamping baru — copy struktur, ganti isi sesuai modul aktual.
|
|
9
|
+
|
|
10
|
+
**Contoh di bawah = fiksional** (`users.ts` adalah file imajiner). Ini cuma reference format, bukan bagian dari proyekmu. Hapus atau biarkan — tidak akan mengganggu.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## CONTOH (mulai dari sini, copy & adapt)
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
# users.md — Modul User Management (CRUD + RBAC)
|
|
18
|
+
|
|
19
|
+
> Versi 1 · 2026-05-31 · auto-generated
|
|
20
|
+
|
|
21
|
+
## Tujuan
|
|
22
|
+
Modul `users.ts` adalah **fasad CRUD untuk entitas user** di proyek ini. Tujuan utama: centralisasi semua operasi user (create / read / update / soft-delete) supaya validasi + audit log konsisten lintas endpoint. Cegah duplikasi query Prisma di banyak handler.
|
|
23
|
+
|
|
24
|
+
Konsumen: handler API (`/api/users/*`), background job (mis. cleanup user inactive), CLI seeding (`scripts/seed-users.ts`).
|
|
25
|
+
|
|
26
|
+
## Cara Pakai
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { createUser, getUserById, updateUser, softDeleteUser } from "@/lib/users";
|
|
30
|
+
|
|
31
|
+
// Create — validasi schema + hash password + audit log otomatis
|
|
32
|
+
const user = await createUser({
|
|
33
|
+
email: "alice@example.com",
|
|
34
|
+
password: "plain-text-here", // di-hash di dalam, jangan hash sendiri
|
|
35
|
+
role: "MEMBER",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Read — return null kalau tidak ada (jangan throw)
|
|
39
|
+
const u = await getUserById("user_123");
|
|
40
|
+
|
|
41
|
+
// Update — partial update, validasi schema, audit log delta
|
|
42
|
+
await updateUser("user_123", { role: "ADMIN" });
|
|
43
|
+
|
|
44
|
+
// Soft delete — set deletedAt, JANGAN hard delete (audit retention 90 hari)
|
|
45
|
+
await softDeleteUser("user_123", { actorId: currentUser.id });
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Input / Output
|
|
49
|
+
|
|
50
|
+
- **`createUser(input: CreateUserInput): Promise<User>`**
|
|
51
|
+
- Input: `{ email: string, password: string, role: Role }`
|
|
52
|
+
- Output: `User` (tanpa field `password`)
|
|
53
|
+
- Throws: `ValidationError` kalau email duplicate / format invalid / password lemah
|
|
54
|
+
|
|
55
|
+
- **`getUserById(id: string): Promise<User | null>`**
|
|
56
|
+
- Input: `id` (string, format `user_<cuid>`)
|
|
57
|
+
- Output: `User` atau `null` (BUKAN throw kalau tidak ada)
|
|
58
|
+
|
|
59
|
+
- **`updateUser(id: string, patch: Partial<UserPatch>): Promise<User>`**
|
|
60
|
+
- Input: ID + partial patch object
|
|
61
|
+
- Output: User setelah update
|
|
62
|
+
- Throws: `NotFoundError` kalau ID tidak ada, `ValidationError` kalau patch invalid
|
|
63
|
+
|
|
64
|
+
- **`softDeleteUser(id: string, opts: { actorId: string }): Promise<void>`**
|
|
65
|
+
- Input: ID + actorId untuk audit
|
|
66
|
+
- Output: void
|
|
67
|
+
- Side effect: set `deletedAt = now()`, insert row `audit_log`
|
|
68
|
+
|
|
69
|
+
## Dependensi
|
|
70
|
+
|
|
71
|
+
- **Library**:
|
|
72
|
+
- `@prisma/client` — query DB user table
|
|
73
|
+
- `bcrypt` — password hash (cost factor 12)
|
|
74
|
+
- `zod` — schema validation
|
|
75
|
+
- **Env**:
|
|
76
|
+
- `BCRYPT_COST` (opsional, default 12) — biaya bcrypt
|
|
77
|
+
- **File terkait**:
|
|
78
|
+
- `prisma.ts` — singleton Prisma client
|
|
79
|
+
- `audit.ts` — `logAction()` untuk write ke `audit_log` table
|
|
80
|
+
- `permissions.ts` — `requireRole()` kalau caller perlu RBAC check di luar
|
|
81
|
+
- DB: tabel `users`, `audit_log`
|
|
82
|
+
|
|
83
|
+
## Catatan
|
|
84
|
+
|
|
85
|
+
- **Password hashing**: SELALU pakai `bcrypt.hash(password, BCRYPT_COST)` di dalam modul. JANGAN expose raw password compare ke caller — pakai `verifyPassword(plain, hash)` helper. Cegah timing attack: bcrypt sudah constant-time.
|
|
86
|
+
- **Soft delete bukan hard delete**: aturan compliance — semua user record retain 90 hari dengan `deletedAt` set. Hard delete cuma di cleanup job khusus (lihat `scripts/cleanup-deleted-users.ts`).
|
|
87
|
+
- **Email case-insensitive**: lookup pakai `.toLowerCase()` di query Prisma. Cegah Alice@x.com vs alice@x.com jadi 2 record.
|
|
88
|
+
- **Audit log wajib untuk mutation**: create/update/softDelete WAJIB insert ke `audit_log` table dengan `actorId` (siapa lakukan), `targetUserId` (siapa terdampak), `action` (string enum), `delta` (JSON diff).
|
|
89
|
+
- **Race condition email duplicate**: pakai DB unique constraint di kolom `email` + catch `PrismaClientKnownRequestError` code `P2002`. Jangan check-then-insert (race).
|
|
90
|
+
- Source code: `src/lib/users.ts:1` (entry), `src/lib/users.validation.ts:1` (zod schema).
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Aturan saat copy contoh ini
|
|
96
|
+
|
|
97
|
+
1. **Ganti `users.md` jadi nama modul aktual** (mis. `auth.md`, `invoices.md`).
|
|
98
|
+
2. **Ganti semua placeholder fiksional** — `users.ts`, `User`, env var, dll.
|
|
99
|
+
3. **Update `Versi` + tanggal** sesuai kenyataan.
|
|
100
|
+
4. **Source code path WAJIB nyata** — jangan biarkan `src/lib/users.ts:1` kalau file aktual beda.
|
|
101
|
+
5. **Pastikan max ~80 baris** (file ini contoh = lebih panjang karena ada explanation, tapi `.md` pendamping aktual cukup ringkas).
|
|
102
|
+
6. **Update `architecture_auto.md`** setelah create — tambah 1 baris baru.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Kenapa file ini ada?
|
|
107
|
+
|
|
108
|
+
Tim profesional = consistent format. Tanpa contoh konkret, tiap dev/AI bikin format beda → docs jadi messy + AI kebingungan saat baca. File `_EXAMPLE.md` ini = anchor format. Saat AI generate `.md` pendamping baru, AI baca file ini dulu sebagai reference.
|
|
109
|
+
|
|
110
|
+
Boleh dihapus kalau tim sudah hafal format. Default: **biarkan** — biaya 0, value tinggi untuk anggota baru.
|