Fitur Lanjutan#
Multi-File Template#
Satu template bisa menghasilkan beberapa file sekaligus. Cocok untuk pola seperti:
- Screen + ViewModel + Test
- Controller + Service + DTO
- Entity + Repository + Migration
Setup di configs.yaml#
templates:
- name: screen
description: Flutter screen dengan ViewModel
files:
- path: screen/view.lokio
output: lib/features/<%= snakeCase(name) %>/view/<%= snakeCase(name) %>_screen.dart
- path: screen/viewmodel.lokio
output: lib/features/<%= snakeCase(name) %>/viewmodel/<%= snakeCase(name) %>_viewmodel.dart
- path: screen/test.lokio
output: test/features/<%= snakeCase(name) %>/<%= snakeCase(name) %>_test.dart
parameters:
- name: name
type: string
required: true
prompt: "Nama screen:"Generate#
lokio g screen LoginOutput:
Generating 3 files...
✓ Generated: lib/features/login/view/login_screen.dart
✓ Generated: lib/features/login/viewmodel/login_viewmodel.dart
✓ Generated: test/features/login/login_test.dart
Code generation complete! (3 files)
Hooks (Post-Generation)#
Jalankan perintah otomatis setelah lokio gen berhasil. Definisikan di lokio/configs.yaml:
templates:
- name: service
description: NestJS service
path: service.lokio
output: src/services/<%= pascalCase(name) %>Service.ts
parameters:
- name: name
type: string
required: true
prompt: "Nama service:"
hooks:
after_gen:
- bun run format # format kode setelah generate
- bun run build:check # pastikan tidak ada error TypeScriptOutput saat generate:
✓ Generated: src/services/UserService.ts
Running post-generation hooks...
✓ bun run format
✓ bun run build:check
Code generation complete! (1 file)
Contoh Hook Lainnya#
hooks:
after_gen:
- go mod tidy # Go: update dependencies
- flutter pub get # Flutter: install packages
- npx prettier --write src/ # format dengan Prettier
- php artisan optimize # Laravel: clear cacheCatatan: Hook dijalankan dari root folder project. Jika hook gagal, generate tetap dianggap berhasil — hanya menampilkan warning.
Sync & 3-Way Merge#
Masalah yang Diselesaikan#
Kamu sudah generate UserService.ts dari template. Lalu:
- Kamu menambahkan method
getUserById()secara manual ke file tersebut - Template
service.lokiodiupdate tim (misalnya constructor berubah)
Kalau kamu langsung overwrite, method yang kamu tambahkan hilang. Lokio menyelesaikan ini dengan 3-way merge.
Cara Kerja 3-Way Merge#
base = versi file yang tersimpan di git (git show HEAD:<file>)
current = file sekarang (mungkin sudah kamu modifikasi)
theirs = hasil re-render dari template yang sudah diupdate
Aturan:
- Hanya kamu yang ubah → perubahan kamu dipertahankan
- Hanya template yang ubah → perubahan template diterapkan
- Keduanya ubah baris yang sama → conflict markers ditulis
Preview dengan lokio diff#
Sebelum apply, lihat dulu apa yang akan berubah:
lokio diff ✓ src/services/AuthService.ts — up to date
~ src/services/UserService.ts — +2 -1 (your edits preserved)
✗ src/services/OrderService.ts — conflict (resolve markers manually)
1 conflict detected.
2 files can be updated — run lokio sync to apply
Jalankan Sync#
lokio syncScanning 3 generated files...
✓ src/services/AuthService.ts — up to date
~ src/services/UserService.ts — +2 -1 (your edits preserved)
✗ src/services/OrderService.ts — conflict (resolve markers manually)
1 conflict detected — conflict markers will be written.
2 files can be updated.
? How do you want to proceed?
› Apply all changes
Review each file
Cancel
Menyelesaikan Conflict#
File conflict akan berisi marker:
export class OrderService {
// Method baru dari template
async voidOrder(id: number) {
return this.repo.void(id);
}
}Edit file tersebut, pilih/gabungkan bagian yang kamu inginkan, lalu hapus marker <<<<<<<, =======, >>>>>>>.
Syarat 3-Way Merge Berfungsi#
File harus sudah pernah di-commit ke git. Kalau belum, Lokio akan minta konfirmasi sebelum overwrite.
lokio check — Lint Struktural#
Validasi apakah file-file di repo sudah mengikuti aturan struktural yang didefinisikan di template.
Perbedaan dengan
lokio sync:synchanya peduli file yang ada dilokio.lock.checkbisa mendeteksi file manapun di repo yang path-nya cocok dengan pola output template — termasuk file yang ditulis manual tanpa Lokio.
Cara Kerja#
Lokio membaca anotasi dari file .lokio dan membuat aturan lint otomatis.
Auto-Fingerprinting#
Setiap baris yang mengandung <%= %> otomatis dijadikan aturan required + danger:
// lokio/templates/service.lokio
import { Injectable } from '@nestjs/common'; // ← baris ini jadi aturan required
@Injectable() // ← ini juga
export class <%= pascalCase(name) %>Service {}Artinya: semua file yang cocok dengan output pattern template ini harus mengandung import { Injectable } dan @Injectable().
Anotasi Manual#
Lebih eksplisit dan fleksibel:
<%# @lokio required danger "Harus ada @Injectable()" @Injectable %>
<%# @lokio forbidden warning "Jangan pakai console.log" console\.log %>
<%# @lokio required warning "Harus export class" export class %>
@Injectable()
export class <%= pascalCase(name) %>Service {}Format anotasi:
<%# @lokio <required|forbidden> <danger|warning> "pesan" [regex-pattern] %>
| Bagian | Nilai | Keterangan |
|---|---|---|
required | — | File harus mengandung pattern ini |
forbidden | — | File tidak boleh mengandung pattern ini |
danger | — | Dilaporkan sebagai error |
warning | — | Dilaporkan sebagai warning |
"pesan" | teks | Pesan yang ditampilkan ke user |
[pattern] | regex | Opsional; kalau tidak ada, baris berikutnya dijadikan pattern |
Konfigurasi di lokio/configs.yaml#
check:
danger_mode: block # "block" = exit code 1 (cocok pre-commit hook)
# "warn" = hanya tampilkan, tidak exit 1
# templates: # opsional — omit untuk check semua template
# - service
# - controllerGunakan Sebagai Pre-commit Hook#
# .git/hooks/pre-commit
#!/bin/sh
lokio checkAtau dengan Husky / Lefthook:
# .lefthook.yml
pre-commit:
commands:
lokio-check:
run: lokio checklokio ai — Validasi Standar dengan AI#
Gunakan AI untuk memvalidasi standar tim yang tidak bisa ditangkap oleh regex — seperti keberadaan test file, dokumentasi, atau pola arsitektur.
Setup#
1. Konfigurasi di lokio/configs.yaml (aman di-commit):
ai:
provider: gemini # openai | anthropic | gemini | ollama | openrouter
model: gemini-2.0-flash
standards:
- id: unit-test
description: "Setiap service harus punya file unit test"
severity: danger
- id: no-console-log
description: "Tidak ada console.log di kode produksi"
severity: warning
- id: has-readme
description: "Setiap package/module harus punya README"
severity: warning2. API key di lokio.local.yaml (gitignored — jangan commit):
# lokio.local.yaml
ai:
api_key: YOUR_API_KEY_HEREAtau environment variable:
export LOKIO_AI_API_KEY=your-keyJalankan#
lokio aiJika belum setup, wizard interaktif akan memandu konfigurasi dan membuat lokio.local.yaml secara otomatis.
Provider yang Didukung#
| Provider | Model rekomendasi | Catatan |
|---|---|---|
gemini | gemini-2.0-flash | Free tier, recommended untuk mulai |
openai | gpt-4o-mini | Terjangkau |
anthropic | claude-haiku-4-5-20251001 | — |
openrouter | meta-llama/llama-3.3-70b-instruct:free | Model gratis tersedia |
ollama | llama3.2 | Lokal / VPS, tidak butuh API key |
Konfigurasi Ollama:
ai:
provider: ollama
model: llama3.2
endpoint: http://your-vps:11434 # default: http://localhost:11434Severity#
danger— jika fail, command exit dengan code 1 (cocok untuk CI/CD gate)warning— hanya ditampilkan, tidak memblokir
lokio doctor — Diagnosa Setup#
Periksa seluruh setup Lokio dalam satu perintah:
lokio doctorBerguna untuk:
- Onboarding developer baru di tim
- Debug ketika ada command yang tidak berjalan
- Memastikan API key dan konfigurasi AI sudah benar sebelum menjalankan
lokio ai
lokio.lock — Tracking File Generate#
File lokio.lock otomatis dibuat dan diupdate setiap kali lokio gen berhasil.
# lokio.lock
generations:
- template: service
parameters:
name: UserService
files:
- output: src/services/UserService.ts
template_path: service.lokio
generated_at: "2026-03-09T10:00:00.000Z"Aturan:
- ✅ Commit ke git — supaya seluruh tim bisa pakai
lokio syncdanlokio diff - ❌ Jangan edit manual kecuali tahu apa yang kamu lakukan
Kenapa aman di-commit?
- File kecil — hanya menyimpan nama template, parameter, dan path output
- Tidak menyimpan konten file (untuk merge base, Lokio pakai
git show HEAD) - Konflik di
lokio.lockmudah diselesaikan (format YAML sederhana)
Deduplication otomatis: Jika file yang sama di-generate ulang dari template berbeda, Lokio otomatis memindahkan kepemilikan file ke template yang terbaru — tidak ada duplikasi di lock file.
AI Key Security#
| File | Komit? | Isi |
|---|---|---|
lokio.yaml | ✅ Ya | Metadata project, enterprise config |
lokio/configs.yaml | ✅ Ya | Template, check config, AI provider & model |
lokio.local.yaml | ❌ Tidak | API key (auto-gitignored saat lokio init) |
lokio.lock | ✅ Ya | Tracking file generate |
lokio.local.yaml otomatis ditambahkan ke .gitignore saat lokio init. Jika file ini tidak ada, Lokio juga menerima API key dari environment variable LOKIO_AI_API_KEY.
Enterprise Hub#
Untuk tim yang ingin berbagi template antar project:
# Aktivasi saat init
lokio init --enterprise ENT-xxxxxx
# Atau gunakan flag langsung
lokio init -e ENT-xxxxxx
# Tarik template dari hub
lokio pullSetelah lokio init --enterprise, jalankan lokio pull untuk mengisi template dari Hub ke lokio/configs.yaml dan lokio/templates/.