CraftLife-1.6.3
CraftLife v1.6.3 — “Quality of Life+” · Release Notes
Versi: 1.6.3 · Nama rilis: “Quality of Life+” · Tanggal: 2026-09-16 · Channel: stable
Commit phase: A01–A14 (satu commit phase) · Basis: v1.6.0 “Quality of Life”
Status: ✅ FINAL — siap dipakai untuk GitHub Release v1.6.3.
📌 Ringkasan singkat
Rilis ini menutup empat area permintaan dan tiga bug fatal, semuanya dalam satu commit phase:
| Area | Perubahan | Fase |
|---|---|---|
| 🎵 Music | Lirik mengikuti lagu saat trek berganti · pencarian lirik berkandidat + skor · import lirik manual terdokumentasi | A01–A03 |
| 📥 Semua app | Audit export/download (Qt WebEngine tidak punya handler downloadRequested) |
A03.5 |
| 📚 Learning | Esai bisa dijawab (fatal) · dua counter PG/Essay (default 15 = 10 + 5) · satu dialog per tipe generator · hasil jadi daftar artefak · shell ala NotebookLM · sitasi sumber + grounding · podcast dua host · migrasi SDK google.genai |
A04–A08 |
| 💞 Love Space | plans · memories/bucket · connection · cycle · gallery diprofesionalkan · overview jadi dashboard pasangan + Special Day → pengingat tahunan |
A09–A12 |
| 🏠 Home | Year Wrapped memakai mata uang aktif user + i18n penuh + laporan yang bisa disalin/diunduh | A13 |
| 📦 Rilis | i18n sinkron 4 arah, versi, README, Release Notes, rekap fase, smoke S1–S10 | A14 |
Angka rilis: +567 key i18n baru (3.757 → 4.324; +16 di antaranya dari A13) · 23 file ditimpa · 27 file kode baru ·
10 endpoint baru + parameter ?year= · 5 blok migrasi SQLite (auto-apply) + 3 migrasi Supabase opsional (cloud).
🎵 Music
A01 — Lirik otomatis mengikuti lagu yang diputar ✅
- Lirik diperbarui setiap trek berganti (auto-advance, next/prev, klik dari mini-player) — dulu panel tertinggal di lagu lama.
- Cache lirik per-lagu + guard balapan request (request lagu lama tidak menimpa lagu baru).
- Header panel lirik menampilkan lagu aktif; auto-scroll baris lirik berhenti otomatis 3 detik bila digulir manual.
A02 — Perluasan & akurasi pencarian lirik ✅
- Pencarian kandidat multi-sumber (LRCLIB get + search, lyrics.ovh, embedded tag) dengan skor.
- Skor memakai album, toleransi durasi bertingkat (≤2 dtk +3 · ≤5 dtk +1,5 · >15 dtk −2) dan penalti versi live / remix / karaoke / cover.
- Dialog pilih kandidat: album · durasi · badge SYNCED/PLAIN · skor · pratinjau 5 baris; pilihan user disimpan permanen (
user-pick) dan tidak ditimpa pencarian web. - Batas library 80 → 500 (
CRAFTLIFE_MUSIC_LIB_LIMIT), metadata batch untuk trek di luar listing, cache negatif 10 menit.
A03 — Import lirik manual terdokumentasi ✅
- Dialog Import + Panduan dengan drop-zone
.lrc/.txtdan template .lrc siap unduh. - Validasi sebelum simpan (baris bertimestamp, rentang waktu, jeda, metadata, 8 jenis peringatan).
- Dukungan penuh
[ar:] [ti:] [al:] [by:] [offset:±ms], multi-timestamp, baris jeda; ekspor.lrcbertimestamp atau.txtpolos.
📥 Semua App
A03.5 — Audit & perbaikan SELURUH export/download ✅
- Akar masalah: shell PyQt tidak pernah menyambungkan
QWebEngineProfile.downloadRequested→ semua unduhan dibuang diam-diam (tanpa berkas, tanpa pesan). - Kini ada
DownloadManager: berkas masuk keDownloads/CraftLife(nama uniknama (1).ext), toast menampilkan lokasi lengkap, tombol Buka folder unduhan di Settings → Manajemen Data (folder bisa diubah viaCRAFTLIFE_DOWNLOAD_DIR). - Beres untuk: ekspor nutrisi (CSV/XLSX/DOCX/PDF*), ekspor tracker (JSON), ekspor studio (TXT), lampiran chat, template lirik, ekspor lirik.
*PDF butuhreportlab; tanpa itu server otomatis memakai CSV.
📚 Learning
A04 — Kuis: jawaban essay diperbaiki + dua counter PG/Essay + skor komposit ✅
- Bug fatal diperbaiki: soal esai tidak bisa diketik karena (1) penanda
type/modelAnswerdibuang saat notebook di-refetch → soal esai tampil sebagai PG tanpa opsi, dan (2) textarea dikuncidisabledbegitu tombol Evaluate ditekan. - Dua counter terpisah: Pilihan Ganda dan Esai (default 10 + 5, total ≤ 30, preset
10/5 · 20/10 · 30/0 · 0/10); tombol Generate mati bila total 0 atau > 30, dan server tetap memotong aman bila payload datang dari luar UI. - Penilaian mandiri esai: ✅ Sesuai (1) · 🟡 Sebagian (0,5) · ❌ Belum (0) → skor komposit
PG 4/10 · Essay 3,5/5+ persentase. - Jawaban tidak hilang lagi: kunci per ID soal (bukan indeks baris) + draft otomatis
localStorageper notebook (cl_learning_quiz_draft_<nb>_<gen>). - Tombol Evaluasi ulang (tanpa menghapus jawaban), Retake, dan Lihat semua jawaban contoh.
- Counter flashcard tetap terpisah (10–30 kartu).
A05 — Dialog konfigurasi per tipe generator Studio ✅
- Setiap tipe punya dialog sendiri (ala Customize NotebookLM): klik kartu di panel Studio → dialog terbuka
dengan opsi khusus tipe tersebut; tombol ⚡ di sisi kartu tetap bisa generate cepat dengan pengaturan terakhir. - Opsi per tipe: Quiz (PG/Esai + kesulitan + bahasa) · Flashcards (5–30 kartu, gaya Istilah→Definisi /
Pertanyaan→Jawaban / Rumus→Arti) · Audio Overview (gaya host Santai/Formal/Diskusi kritis, panjang
6–8 / 14–24 / 26–36 giliran, instruksi bebas) · Mind Map (kedalaman 1–3, cabang 3–8, sub 2–6) ·
Study Guide (pilih bagian + 3–10 soal latihan) · FAQ (5–15 Q&A, jawaban Singkat/Detail) ·
Timeline (harian/mingguan/bulanan/tahunan + tanggal absolut) · Summary (≤150 / 200–400 / 500–800 kata,
Poin-poin / Naratif). - Ingat pengaturan per notebook (
localStorage cl_learning_studio_cfg_<notebook>_<tipe>) + Reset ke default,
ringkasan sumber di dalam dialog (n sumber · m kata), dan bagian Pengaturan lanjutan (fokus topik + instruksi bebas). - Semua nilai divalidasi ulang di server (whitelist + clamp rentang + pemangkasan teks), dan tanpa opsi apa pun
perilaku lama tetap identik (zero-regression).
A06 — Hasil generate = daftar artefak rapi (list ke bawah) ✅
- Semua hasil Studio kini tampil sebagai satu daftar artefak vertikal: judul (bisa diganti), badge tipe,
waktu relatif, jumlah item (15 soal/20 kartu/18 giliran/340 kata), ukuran berkas, tanda diedit. - Kontrol: filter per tipe (dengan hitungan), pencarian judul, urutan Terbaru/Terlama/Tipe, empty state.
- Klik kartu → pratinjau isi langsung di bawah kartu (kuis + kunci jawaban, kartu, dialog podcast, JSON mind map, teks).
- Aksi per kartu: Buka (tampilan interaktif) · Ganti nama · Ekspor .md · Ekspor .txt · Duplikat · Hapus.
Ekspor menghasilkan berkas rapi diDownloads/CraftLife(kuis lengkap dengan kunci ✅ dan jawaban contoh esai). - Area pratinjau interaktif (kuis dikerjakan, kartu dibalik, podcast diputar) tetap ada dan bisa dilipat.
- Perbaikan kecil menyeluruh: semua berkas unduhan kini dikirim dengan Content-Type yang benar
(.md,.txt,.csv,.lrc,.xlsx,.docx,.pdf, gambar, audio) — sebelumnya selaluapplication/octet-stream.
A07 — Shell Learning ala NotebookLM ✅
Halaman Learning direstrukturisasi mengikuti tata letak NotebookLM namun tetap berciri CraftLife:
- Rail notebook kiri (72 px → 220 px): daftar notebook dengan avatar inisial, tombol + Notebook,
ganti nama & hapus notebook, navigasi Sumber / Chat / Studio, dan pemilih bahasa id/en. - Topbar dengan ganti nama notebook langsung di tempat, chip
{n} sumber/{m} kata/
status, serta tombol Ganti nama & Ekspor. - Kolom tengah Sumber ⇄ Chat: kartu sumber (ikon tipe, jumlah kata, tanggal, chip Dipakai/Tidak dipakai),
pencarian, empty state; chat dengan 4 kartu saran saat kosong, balon pengguna/AI, kontrol font, dan klarifikasi. - Kolom kanan Studio: daftar artefak A06 + grid peluncur 8 generator A05, bisa dilebarkan/dilipat.
- Drag-resize diganti preset: Sempit 320 / Sedang 420 / Lebar 560 + sembunyikan panel, tersimpan di
localStoragecl_learning_layout, dengan migrasi otomatis daricl_learning_panel_widths. - Responsif: <1024 px rail menjadi bottom-bar dan kolom menjadi tab penuh.
- Tanpa
backdrop-filterdan hanya transisi saat interaksi (taat aturan anti-flicker R10 pada WebEngine). - Seluruh fungsi Learning lama dipertahankan 100 % (notebook, sumber, chat, 8 generator, kuis & esai, kartu, podcast, ekspor).
Uji: 11 kasus logika tata letak · 10 kasus render komponen · 24/24 smoke live (:8899) · tsc 0 error · build bersih.
i18n: +30 key → 3.998 key (id + en).
A08 — Sitasi sumber, grounding, & podcast dua host ✅
Jawaban AI bisa dilacak ke sumbernya. Model menerima daftar sumber bernomor [S1], [S2], … dan
diminta menandai setiap klaim. Penanda itu berubah menjadi chip nomor yang bisa diklik di dalam balon
jawaban: popover menampilkan judul sumber + kutipan kalimat + tombol Buka sumber (isi penuh).
Di bawah balon ada baris ringkasan sitasi, dan chip tetap muncul setelah aplikasi di-restart
(kolom baru learning_chats.citations).
Anda yang menentukan sumber (grounding). Chip Dipakai / Tidak dipakai pada tiap kartu sumber
dikirim sebagai sourceIds saat bertanya dan saat generate materi — AI hanya memakai sumber yang dicentang.
Header chat menampilkan {n} dari {total} sumber dipakai, rail sumber punya tombol Pilih semua / Kosongkan.
Model yang lupa memberi sitasi tidak membuat error — jawaban tetap tampil.
Audio Overview: suara sesuai bahasa, pemutar interaktif. Pemutar lama memakai suara bawaan sistem
tanpa lang sehingga membaca teks Indonesia dengan suara Inggris. Sekarang transkrip diubah menjadi
berkas MP3 nyata dengan suara dua host mengikuti bahasa transkrip (id → Ardi & Gadis,
en → Andrew & Ava, dst., mesin edge-tts; cadangan gTTS). Pemutarnya benar-benar interaktif:
- klik salah satu giliran → langsung lompat ke detiknya; giliran aktif tersorot & ikut di-scroll;
- geser posisi (seek) dengan HTTP Range — tidak mengunduh ulang seluruh berkas;
- ±15 detik, kecepatan 0,75×–2×, loop, unduh MP3, tombol Buat ulang;
- hasil disimpan (tabel
learning_audio) → membuka ulang episode instan (tanpa menyusun ulang).
Dependency AI dimigrasikan: google.generativeai (sudah end of support) → google.genai
(from google import genai, multi-model 2.5-flash → 2.0-flash → 1.5-flash → gemma-3, retry + deteksi kuota).
Bila SDK baru belum terpasang, aplikasi otomatis memakai SDK lama agar tetap jalan, dan status SDK
ditampilkan di diagnostik Learning. requirements.txt: google-genai>=1.0.0 wajib, google-generativeai
dihapus dari daftar, gTTS>=2.5.0 ditambahkan.
Uji: 23/23 unit helper AI · 20/20 render komponen · 25/25 smoke live · regresi A07 24/24 ·
tsc 0 error · build bersih. i18n: +32 key → 4.030 key (id + en).
Migrasi: SQLite-only — tabel learning_audio + kolom learning_chats.citations (idempoten, otomatis).
A15 — Rail kiri Learning: ikon notebook sesuai input user + tata letak rapi ✅
Keluhan: notebook baru tidak menampilkan emoji yang dipilih (selalu 📚) dan sidebar kiri Learning tidak rapi.
Akar masalah: dialog Notebook Baru sudah mengirim { title, description, icon }, tetapi server tidak
menyimpan ikon — tabel learning_notebooks hanya (id, user_id, title, created_at) dan endpoint
POST /api/learning/notebooks hanya membaca title. Rail kiri menggambar nb.icon || '📚' (selalu 📚)
sekaligus avatar inisial sehingga dua penanda bertumpuk dalam satu kotak 40 px.
Perbaikan (hanya rail kiri; panel Sumber & Chat/Studio tidak diubah):
- Kolom baru
learning_notebooks.icon(default 📚),.description,.updated_at—ALTER TABLE
otomatis saat aplikasi mulai, aman untuk database lama maupun baru. - API: create menerima
icon/description;…/<id>/renamemenerimatitle,icon, atau
descriptionsecara parsial (mengganti ikon tidak mengosongkan judul); ikon disanitasi (maks 8 karakter,
spasi/kontrol dibuang, kosong → 📚). - Rail: satu avatar per notebook — emoji user apa adanya, fallback inisial judul (mis. “Bahasa Jepang” →
BJ) lewatnotebookGlyph(); lebar mengikuti token--rail-w(72/220 px), judultruncate, tombol
+ Notebook & navigasi ikut melebar, daftar panjang bisa digulir,title/aria-label/aria-currentlengkap. - Dialog Ganti nama kini memakai pemilih emoji yang sama (
NB_EMOJI, 8 pilihan) sehingga notebook lama
pun bisa diganti ikonnya; ikon direset setelah notebook baru dibuat. - i18n: key baru
learning_icon_label(id: Ikon (emoji) · en: Icon (emoji)) — total 4.325 key.
💞 Love Space
A10 — Memories & Bucket List: dari daftar sederhana menjadi fitur matang ✅
Sub-tab memories dan Bucket List sudah lama “ada”, tetapi keduanya masih berupa daftar sederhana:
kenangan tidak bisa diedit, emojinya selalu 💖, tidak ada tag/favorit/pencarian, dan tidak bisa
ditautkan ke foto — sementara Bucket List hanya punya judul, checkbox, dan tombol hapus. Fase ini
membuat keduanya benar-benar bisa dipakai:
Kenangan (tab memories)
- Edit kenangan lewat dialog baru (dulu hanya bisa tambah lalu hapus) + endpoint
POST /api/love/memories/<id>/update. - Emoji bisa dipilih (12 preset + emoji bebas) — sebelumnya server selalu mengirim
"emoji": "💖". - Tag (dengan pratinjau chip dan filter tag), bintang favorit satu klik, dan tautan foto dari
galeri — foto yang ditautkan menampilkan thumbnail di kartu. - Timeline + toolbar: pencarian (judul/catatan/tag), filter tahun, filter tag (berikut jumlah),
urutan Terbaru/Terlama, tombol Hanya favorit, serta 4 kartu statistik (total · favorit · bertag ·
berfoto). - Kartu memuat emoji · judul · tanggal · ⭐ · chip tag (bisa diklik untuk memfilter) · catatan ·
thumbnail foto · jejak “diubah {tanggal}”, dengan tombol ⭐ / ✏️ / 🗑️.
Bucket List
- Progres nyata: bar progres +
{done} dari {total} tercapai+ persen, serta chip
total · selesai · belum · lewat target. - Kategori berikon, target tanggal dengan badge
H-30/terlewat 12 hari, catatan, dan
prioritas ⭐–⭐⭐⭐ lewat dialog baruLoveBucketDialog.tsx(POST /api/love/bucket/<id>/update). - Filter Semua / Belum / Selesai / Terlewat (dengan jumlah) + pencarian item; tambah cepat
dengan Enter tetap seperti sebelumnya. - Item tercapai → kenangan: tombol “Jadi kenangan” memanggil
POST /api/love/bucket/<id>/promote-to-memory— kenangan baru memakai tanggal pencapaian, catatan
item + penanda asal bucket, emoji kategori, dan tagbucket+ kategori. Item ditandai
Sudah jadi kenangan dan promote ulang tidak membuat duplikat.
Uji: 65/65 uji DB · 77/77 logika & render FE · 37/37 render tab memories + Bucket List ·
45/45 smoke live · 38/38 regresi A07+A08+A09+Love Space · tsc 0 error · build bersih.
i18n: +90 key → 4.166 key. Migrasi: SQLite otomatis (9 kolom baru + 2 indeks);
Supabase opsional 20260916010000_phase_a10_love_memories_bucket.sql untuk pengguna cloud.
A11 — Love Space: connection · cycle · gallery diprofesionalkan ✅
connection: riwayat jawaban yang bisa dicari (jawaban sendiri, jawaban pasangan, teks prompt)
dengan filter kategori berhitungan, tombol Hanya favorit, ⭐ per baris, Jawab ulang satu klik,
dan hitungann dari m; panel prompt favorit; bank 20 prompt / 5 kategori dengan tombol
Tanya pasangan (prompt disalin ke clipboard); grafik tren mood 30/90 hari (garis kamu vs
pasangan) + grafik skor koneksi; dan kartu statistik dengan streak check-in🔥 N hari.
Tanpa data, grafik menampilkan empty state yang mengarahkan — bukan garis datar menipu.cycle: tabel riwayat siklus (mulai · selesai · panjang hari · catatan) yang kini bisa
ditambah manual, diedit, dan dihapus (dulu hanya tambah + hapus, tanpa catatan); prediksi
menampilkan siklus berikutnya · perkiraan ovulasi · jendela subur dengan rentang tanggal dan
badge keyakinan (Rendah/Sedang/Tinggi dari sebaran 3 siklus terakhir) plus baris dasar prediksi;
tombol “Jadikan pengingat (H-3 / H-1)” membuat reminder nyata pukul 09:00 dan idempoten.gallery: sampul album (⭐ jadikan cover, foto otomatis dimasukkan ke album) dengan
jumlah foto + tanggal di tiap chip album; aksi massal pindah album / hapus / ubah visibilitas
lewat satu panggilan server dan hanya menyentuh foto milik sendiri; lightbox bernavigasi
keyboard (← → ·Esc·+/-zoom 1×↔2×) dengan tombol Simpan ke album & Jadikan cover;
serta tombol Simpan keterangan yang eksplisit (dulu perubahan hanya tersimpan saatblur).- Perbaikan bug (temuan saat verifikasi): penghapusan foto massal akhirnya ikut tersinkron ke
cloud (cloud_iddulu dibaca setelah baris lokal dihapus, jadi antrean sync tidak pernah terisi);
reminderIdcreate-reminder tidak lagi kosong; badge keyakinan tidak muncul tanpa prediksi;
nilai bahasa Indonesia untuklove_weekly_reviewdiperbaiki. - Struktur:
LoveSpaceView.tsxmenyusut 2.200 → 1.635 baris — tiga tab dipindah ke
LoveConnectionPanel.tsx/LoveCyclePanel.tsx/LoveGalleryPanel.tsx, logika murni ke
connectionUtils.ts/cycleUtils.ts/galleryUtils.ts, dan helper UI bersama kegalleryParts.tsx.
Uji: 49/49 DB · 44/44 API · 35/35 regresi API (A09+A10+A11) · 170/170 FE (93 unit · 59 SSR tab ·
18 view) · tsc 0 error · build bersih · live :8899 hijau. i18n: +78 key → 4.244 key.
Migrasi: SQLite otomatis (menstrual_cycles.updated_at, love_albums.cover_photo_id + 2 indeks);
Supabase opsional 20260916020000_phase_a11_love_cycle_gallery_alignment.sql (idempoten — skema
cloud yang dibutuhkan sudah ada sejak fase 4a/A10; album galeri memang tersimpan lokal).
A12 — overview jadi dashboard pasangan & Special Day berujung pengingat tahunan ✅
Tab overview Love Space kini benar-benar jadi halaman depan hubungan kalian:
- Hero “bersama N hari · M tahun” dari tanggal jadian — lengkap dengan inisial berdua, jenis
hubungan (Pacaran/Bertunangan/Menikah), chip Couple aktif, dan ajakan ramah bila tanggal
jadian belum diisi. - Kartu Hari istimewa berikutnya: kejadian terdekat dari acara
yearlydan otomatis dari
profil (ulang tahun kamu, ulang tahun pasangan, hari jadi), dengan hitung mundur
Hari ini!/Besok/H-n, penanda yang ke-n, dan tombol 🔔 Buat pengingat. - Cincin skor kedekatan + rincian yang selama ini tak terlihat: check-in terakhir, streak,
rata-rata mood kamu & pasangan. - 6 kartu statistik (kenangan · bucket tercapai
1 dari 2· foto · album · prompt terjawab ·
check-in bulan ini) dan 5 aksi cepat (check-in, kenangan, acara, bucket, pengingat). - Form check-in harian + riwayatnya tetap ada di tempat yang sama — tidak ada fitur lama yang hilang.
Pengingat tahunan (permintaan lama yang kini tuntas):
- Mesin pengingat mengenal
repeat_type = 'yearly'— 29 Februari otomatis jatuh ke 28 Februari
pada tahun non-kabisat. - Endpoint baru
POST /api/love/events/<id>/create-reminderyang idempoten:idboleh id
acara atau kunci profil (my_birthdate,partner_birthdate,start_date). Klik dua kali
(atau setelah tanggal acara diubah) hanya memperbarui pengingat yang sama berkat penanda baru
reminders.source_ref— tidak akan pernah ada pengingat ganda. - Halaman Reminders dapat opsi Tahunan, kolom “Ulangi sampai tanggal”, badge
“🕐 Tahunan · tiap 03-14”, dan penanda 💞 untuk pengingat dari Love Space. - Beranda menampilkan chip satu baris “💞 Hari istimewa: Anniversary (12 hari lagi)” yang
mengantar langsung ke Love Space.
Perbaikan bug (semua ditemukan oleh uji A12, sebelum rilis): database baru gagal dibuat —
indeks album Love Space dijalankan sebelum tabelnya ada; update pengingat tanpa field repeat
menghapus pengulangan tahunan secara diam-diam; nilai repeat_until/reminder_datetime yang tidak
valid membuat proses pengingat gagal; dan chip Beranda pernah menghitung hari jadi memakai tahun
tanggal aslinya (menampilkan tanggal lampau).
A09 — Tab Plans: catatan acara, edit, & Special Day ✅
Dua lubang yang dilaporkan langsung diperbaiki, plus tiga peningkatan “profesional”:
- Catatan acara akhirnya bisa diisi. Sebelumnya aplikasi sudah menyiapkan
notesdan mengirimnya ke
server, tetapi tidak ada input apa pun yang mengisinya — jadi kolomnya selalu kosong. Kini ada
textarea Catatan di dialog acara (tersimpan di SQLite dan tampil di kartu acara). - Acara bisa diedit (dulu hanya bisa dihapus): tombol ✏️ di setiap kartu + endpoint
POST /api/love/events/<id>/update. - Special Day: tandai acara sebagai hari istimewa → opsi ulangi setiap tahun (ulang tahun,
anniversary) dan ingatkan H-n (1/3/7/14/30 hari sebelum). Endpoint
GET /api/love/events/upcoming?days=90menghitung tanggal berikutnya — termasuk ulang tahun & hari
jadi otomatis dari profil Love Space — lengkap dengan hitung mundur & tanggal pengingat. - Daftar acara jauh lebih enak dibaca: kelompok Akan datang (badge
H-12/Hari ini!, urut
terdekat) dan Sudah lewat (kolaps), pencarian judul/lokasi/catatan, filter kategori,
filter hanya hari istimewa, ikon/emoji per acara, lokasi, dan kartu Hari istimewa
terdekat di atas daftar. - Dialog acara baru (dipakai untuk Tambah & Edit) dengan pratinjau hitung mundur yang muncul saat
tanggal dipilih, 6 kategori berikon (💕 🎁 🏆 🌟 💞✈️ ), dan 12 preset ikon + emoji kustom.
Uji: 37/37 uji DB · 51/51 logika & render FE · 17/17 render tab plans · 19/19 smoke live ·
23/23 regresi A07+A08+Love Space · tsc 0 error · build bersih. i18n: +46 key → 4.076 key.
Migrasi: SQLite otomatis (6 kolom relationship_events); Supabase opsional
20260916000000_phase_a09_love_special_days.sql untuk pengguna cloud.
🏠 Home
A13 — Year Wrapped: laporan ekonomi mengikuti mata uang aktif + laporan siap dibagikan ✅
Masalah (item #4 user): bagian laporan ekonomi di dialog Year Wrapped (pemasukan & pengeluaran)
selalu tampil dalam IDR, walaupun user memakai mata uang lain — money() di
YearWrappedDialog.tsx menulis Rp … langsung, melanggar aturan modul utils/currency.ts
(“semua formatter uang wajib lewat modul ini — tidak ada lagi Rp hardcoded”).
Yang berubah:
- Mata uang user dipakai penuh. Semua angka (pemasukan, pengeluaran, selisih bersih) lewat
formatMoney(v, user.currency), plus chip mata uang aktif dan catatan kurs
(“Ditampilkan dalam USD (kurs 1 USD = Rp 17,800)”) dari/api/catalog/currency.
User IDR melihat catatan “mata uang bawaan”. - i18n penuh id + en. Seluruh teks dialog (dulu hardcoded bahasa Indonesia) kini key
wrapped_*ditranslations.py. - Laporan naik kelas: kartu Selisih bersih (hijau/merah + tanda), rasio tabungan
(income − expense) / income, rincian per tipe (Kebiasaan · Rutinitas · Quest · Olahraga dari
by_type), top habit dengan ikon + bar relatif, pemilih tahun (GET /api/year-wrapped?year=
danyears[]daridb.get_wrapped_years), tombol Salin ringkasan (clipboard) &
Unduh .txt, serta confetti singkat saat laporan berisi aktivitas. - Empty-state dipisah dari error. API gagal → pesan + tombol Coba lagi (dulu dua keadaan ini
tampil sama-sama “belum ada aktivitas”). - Reminders: badge Tahunan · tiap {tanggal} kini bisa diklik untuk langsung membuka dialog edit
reminder tahunan tersebut.
Uji: 33/33 DB & API (data 2025 & 2026, isolasi tahun, ?year tak wajar) · 103/103 FE
(59 unit logika + 44 render DOM jsdom: USD → $ 100 / +$ 50 / rasio 50% / chip $ USD / catatan
kurs, ganti tahun → data 2025, salin ringkasan, en → seluruh dialog Inggris, empty vs error, IDR utuh)
· 33/33 regresi A09–A13 (3× berturut) · tsc 0 error · build bersih.
i18n: +16 key → 4.324 key (19 key wrapped_* lama dipakai ulang, tidak diduplikasi).
Migrasi: tidak ada — A13 hanya membaca tabel yang sudah ada.
✅ Verifikasi rilis (A14 — final · A15 — perbaikan rail kiri)
| Pemeriksaan | Hasil |
|---|---|
python -m py_compile (8 modul: api_server, database, studio_api, life_api, learning_helper, music_downloader, translations, updater) |
✅ EXIT 0 |
npx tsc --noEmit (web) |
✅ 0 error |
npx vite build |
✅ clean — index-C18HtkK7.js 1.295,08 kB (gzip 343,55 kB) · index-BtP_pgWk.css 178,50 kB (gzip 26,99 kB) |
| Konsistensi i18n 4 arah | ✅ translations.py (TRANSLATIONS) 4.324 ↔ web/src/i18n/messages.json 4.324 ↔ web/public/i18n/messages.json 4.324 (identik, 0 nilai menyimpang) ↔ WEB_I18N_KEYS 4.253 (semua ada di id & en) |
| Smoke S1–S10 (Lampiran C roadmap) | ✅ dijalankan terhadap server hidup :8899 (hasil lengkap di chat A14 + 2026-09-14-A01-A14-PHASE-SUMMARY.md) |
| Uji otomatis gabungan | ✅ harness A11 (170/170) · A12 (136/136) · A13 (103/103) + regresi lintas fase (A11 33/33 · A12 50/50 ×3) · smoke API (A09 19/19 · A10 37/37 · A11 44/44 · A12 35/35) |
| Kesiapan versi | ✅ updater.py APP_VERSION = "1.6.3" · web/package.json 1.6.3 · /api/version → 1.6.3 (label SettingsView otomatis dari API) |
| Kebersihan workspace | ✅ tidak ada artefak uji ikut commit (craftlife.db*, logs/, learning_audio/, backups/ diabaikan .gitignore) |
| A15 — rail kiri Learning | ✅ py_compile 8/8 · tsc 0 error · vite build → index-BhYl4AnT.js 1.299.313 B + index-Cc5Zs89V.css 178.591 B · uji DB 23/23 · uji API 17/17 · harness rail 46/46 · regresi A11 170/170 · A12 136/136 · A13 103/103 · i18n 4.325 key (learning_icon_label, id & en, 0 hilang) · DB demo bersih (0 baris learning_notebooks) |
🚀 Langkah operator saat merilis
pip install -U google-genai edge-tts gTTS(SDKgoogle.generativeaisudah tidak didukung;edge-ttsuntuk kualitas podcast).- Migrasi SQLite jalan otomatis saat aplikasi pertama kali dibuka — tidak ada perintah manual.
- Opsional untuk pengguna Love Space cloud: jalankan 3 migrasi Supabase berurutan —
20260916000000_phase_a09_love_special_days.sql→20260916010000_phase_a10_love_memories_bucket.sql→
20260916020000_phase_a11_love_cycle_gallery_alignment.sql. Tanpa ini aplikasi tetap normal (field baru tersimpan lokal). - Unduh/unggah aset rilis: instalasi Windows +
web/dist/hasil build (aset di atas). - Tandai rilis di GitHub: v1.6.3 “Quality of Life+” dengan isi dokumen ini.
Catatan teknis rilis ini: seluruh perubahan A01–A13 berjalan SQLite-only — tidak ada migrasi
Supabase yang wajib. Untuk pengguna Love Space cloud tersedia dua migrasi opsional
(20260916000000_phase_a09_love_special_days.sql untuk Special Day/pengingat dan
20260916010000_phase_a10_love_memories_bucket.sql untuk emoji/tag/favorit kenangan + catatan/prioritas
bucket list, serta 20260916020000_phase_a11_love_cycle_gallery_alignment.sql untuk penyelarasan
riwayat siklus & pemetaan galeri A11). A12 tidak butuh migrasi cloud: kolom pengingat baru
(repeat_until, source_ref) murni lokal dan pengingat memang disimpan lokal seperti A09–A11. A13 tidak menambah kolom/tabel apa pun (hanya membaca riwayat task, sesi fokus, dan ekonomi) — tidak ada migrasi cloud yang perlu dijalankan. A15 menambah tiga kolom di learning_notebooks (icon, description, updated_at) yang di-ALTER otomatis saat aplikasi mulai — tanpa aksi manual dan tanpa migrasi cloud. Tanpa menjalankannya aplikasi tetap normal — field baru hanya tersimpan lokal.
Catatan rilis:
google.generativeaisudah end-of-support → rilis ini bermigrasi kegoogle.genai
(A08). Pastikan langkah operator #1 di atas dijalankan sebelum menjalankan aplikasi versi ini.
Backlog yang tahu diri belum dikerjakan (sengaja ditunda oleh user, bukan bagian commit phase):
.envkeluar dari git + rotasi kunci · hapus file mati · code-splitting bundle · pytest gate rilis ·
pemecahanGameContext/MainPyQt6.py(daftar lengkap: Lampiran E roadmap).