prpm-dbp
v0.20.0
Published
Semak ejaan Bahasa Melayu dan Jawi terhadap PRPM Dewan Bahasa dan Pustaka. CLI dan skill untuk AI agent.
Maintainers
Readme
prpm-dbp
Semak ejaan Bahasa Melayu dan Jawi terhadap PRPM Dewan Bahasa dan Pustaka sebelum teks itu sampai kepada pembaca.
AI model tulis Jawi dengan yakin dan kadangkala salah. Pembaca yang tidak fasih Jawi tidak akan perasan. Ini masalah sebenar untuk bahan sekolah, RPH, dan nota pelajar, di mana ejaan salah diajar sebagai betul.
Pakej ini tanya PRPM, bukan model.
$ npx prpm-dbp lookup murid abad
murid [mu.rid] Jawi: موريد
- = anak ~ orang atau anak yg sedang belajar atau berguru, pelajar, penuntut...
(Kamus Dewan Edisi Keempat)
https://prpm.dbp.gov.my/Cari1?keyword=murid
abad [a.bad] Jawi: ابد
...Kenapa ini wujud
Satu kamus rumi ke Jawi yang dijana automatik dari dokumen KPM diperiksa dengan alat ini. Antara yang dijumpai:
| kata | dalam glosari | sebenarnya |
|---|---|---|
| abad | ابعاض | ابد — ejaan itu milik ab-ad, perkataan lain |
| ahzab | اية | bukan kata Melayu langsung, nama surah Arab |
Dua jenis kesilapan berbeza. Yang pertama datang daripada menormalkan sempang semasa import, lalu menggabungkan dua entri. Yang kedua daripada memasukkan nama khas Arab ke dalam kamus Melayu, kemudian mengunci ejaan yang bukan miliknya.
Glosari itu dibina dengan mengikis dokumen kurikulum, bukan disemak seorang demi seorang. Kesilapan seperti ini senyap sehingga ada orang yang baca Jawi menyemaknya.
Pasang
Ada tiga cara, ikut apa yang anda mahu.
1. Cuba tanpa pasang
npx prpm-dbp lookup sekolahTiada apa yang dipasang. Sesuai untuk semakan sekali-sekala.
2. Sebagai skill Claude Code (disyorkan)
npx skills add afu-it/prpm-dbp -gIni memasang ke ~/.agents/skills/prpm-dbp dan membuat symlink ke direktori skill agen anda, jadi Claude Code menemuinya sendiri. Ia juga direkod dalam fail kunci, yang membuatkan kemas kini kemudian menjadi satu arahan.
Tanggalkan -g untuk memasang ke projek semasa sahaja, bukan ke seluruh sistem.
Jika satu agen dalam senarai gagal (contohnya "PromptScript does not support global skill installation"), agen lain tetap dipasang. Untuk menyasarkan satu agen sahaja:
npx skills add afu-it/prpm-dbp -g -a claude3. Sebagai dependency projek
npm install prpm-dbpimport { lookup, loadCache, saveCache } from 'prpm-dbp'Perlu Node 18 ke atas. Tiada dependency.
Kemas kini
Jika dipasang melalui npx skills:
npx skills update prpm-dbp -g -yAtau kemas kini semua skill sekali gus:
npx skills update -g -yJika dipasang sebagai dependency: npm update prpm-dbp.
Untuk npx prpm-dbp, tiada kemas kini diperlukan. npx mengambil versi terkini setiap kali.
Semak versi yang sedang dipasang:
npx skills list | grep prpm-dbp
npm view prpm-dbp versionUntuk penyelenggara
Sunting basecode, bukan salinan yang dipasang. Salinan itu ditulis ganti pada kemas kini berikutnya.
# 1. sunting, uji
npm test
# 2. hantar
git add -A && git commit -m "..." && git push
# 3. naikkan versi dan lepaskan
npm version patch
git push origin main --follow-tagsLangkah ketiga mencetuskan GitHub Actions, yang menerbitkan ke npm melalui Trusted Publishing. Tiada token disimpan, dan pakej dapat kenyataan provenance bertandatangan.
Gunakan npm version dan bukan menyunting package.json dengan tangan. Ia menghasilkan tag beranotasi; git push --follow-tags melangkau tag ringan secara senyap, dan pelepasan anda tidak akan berlaku.
Pengguna kemudian menarik versi baharu dengan npx skills update.
Perintah
| Perintah | Fungsi |
|---|---|
| lookup <kata...> | ejaan Jawi, sebutan, definisi ikut kamus |
| audit <fail> | semak setiap perkataan Rumi wujud dalam PRPM |
| audit-jawi <jawi> <rumi> | banding teks Jawi dengan teks Rumi sejajar |
| warm <senarai> | isi cache dari senarai perkataan |
| check-glosari <json> | audit kamus rumi ke Jawi sedia ada |
| jawi <fail> | tukar teks Rumi ke Jawi ikut ejaan DBP |
| rumi <fail> | tukar teks Jawi ke Rumi dari cache |
| import-tsv <fail> | import dataset rumi/jawi tambahan |
| nama <rumi> <jawi> | sahkan satu nama khas |
| banding <kata...> | silang semak PRPM lawan KamusDBP |
| cache | status cache, --buang <kata> untuk padam satu |
Pilihan: --refresh, --had <n>, --delay <ms>, --json, --cepat, --pedoman, --luar-talian, --homograf, --konteks.
Merumikan ialah keputusan peringkat ayat, bukan peringkat perkataan. مڠيکوت ialah ejaan sah bagi mengikut dan mengekot sekali gus, kedua-duanya entri PRPM sebenar. Gunakan --konteks supaya ayat dan makna setiap calon dipaparkan bersama, berserta bilangan rujukan korpus DBP yang mengisih calon lazim ke hadapan.
--luar-talian tidak pernah menyentuh rangkaian. Wajib untuk laluan permintaan aplikasi: dokumen penuh dari cache mengambil 0.19 saat, manakala satu perkataan baharu daripada PRPM mengambil beberapa saat.
--pedoman membenarkan penjanaan imbuhan menurut peraturan DBP apabila kamus tiada jawapan. Ketepatannya diukur 88-98% terhadap 66,000 perkataan sebenar, jadi ia mati secara lalai dan hasilnya sentiasa ditanda.
Guna sebagai library
import { lookup, loadCache, saveCache } from 'prpm-dbp'
const cache = await loadCache()
const rec = await lookup('murid', cache)
await saveCache(cache)
console.log(rec.jawi) // موريد
console.log(rec.entri[0].sumber) // Kamus Dewan Edisi KeempatDua sumber
DBP ada dua portal, dan liputan mereka tidak sama.
$ npx prpm-dbp banding murid kemahiran ahzab
murid PRPM: موريد KamusDBP: موريد sepakat (tinggi)
kemahiran PRPM: کماهيرن KamusDBP: - satu_sumber (sederhana)
ahzab PRPM: - KamusDBP: - tiada_langsung (rendah)Bila dua sumber bercanggah, alat ini tidak pilih pemenang. Medan jawi jadi null dan kedua-dua ejaan dilaporkan dengan pautan. Tiada cara automatik yang selamat untuk pilih antara dua sumber rasmi.
Medan sebutan tidak dibandingkan. PRPM beri pemisahan suku kata (a.bad), KamusDBP beri IPA (ɑ.bɑd).
Menukar dua hala
$ npx prpm-dbp jawi nota.txt
موريد داڤت مڽاتاکن کواجيڤن منونايکن صلاة فرض يڠ تله دڤلاجري دالم کلس.
$ npx prpm-dbp rumi jawi.txt
murid dapat menyatakan kewajipan menunaikan solat fardu yang telah dipelajari dalam kelas.Ini bukan transliterator. Tiada peraturan huruf demi huruf digunakan. Setiap perkataan datang dari kamus, atau ditanda «begini». Ejaan tidak pernah direka, kerana Jawi yang salah tidak kelihatan salah kepada pembaca yang tidak fasih.
Tanda baca, baris baru dan jarak dikekalkan, jadi susun atur dokumen tidak rosak.
Pakej membawa 485 perkataan yang sudah disahkan DBP, jadi ia menjawab serta-merta tanpa rangkaian pada pemasangan baharu.
Kata terbitan
KamusDBP disusun ikut lemma. Kata terbitan seperti kewajipan dan pengajian tidak wujud sebagai entri carian, ia tinggal di bawah kata dasar wajib dan kaji. Carian yang gagal untuk kata terbitan bukan bermakna liputan kurang, cuma soalan ditanya di pintu yang salah.
Satu halaman lemma membawa sepuluh atau lebih ejaan Jawi sekali jalan:
import { parseLemma, petaJawi } from 'prpm-dbp/lemma'
const rekod = parseLemma(html)
petaJawi(rekod)
// { wajib: 'واجب', kewajiban: 'کواجبن', kewajipan: 'کواجيڤن', ... }Halaman lemma berpagar. Tanpa sesi ia mengalih ke halaman log masuk. Untuk memuat turunnya, bekalkan cookie sesi anda sendiri:
export KAMUS_DBP_COOKIE="kamusdbp_session=..."Cookie, bukan kata laluan. Kata laluan tidak pernah masuk ke dalam alat ini dan tidak pernah dihantar oleh kodnya. Cookie luput dalam dua jam, jadi kebocoran pun terhad dan sementara.
Tanpa cookie, semua perintah lain tetap berfungsi seperti biasa.
Nota untuk sesiapa yang bina benda serupa
PRPM balas HTTP 200 walaupun perkataan langsung tiada dalam kamus. Kod yang percaya status code akan hantar halaman kosong sebagai jawapan yang sah. Penanda sebenar ialah ketiadaan div.tab-pane dalam HTML.
Selain itu laman ini biasa sahaja: GET terus, tiada JS, tiada login, tiada VIEWSTATE. Playwright atau browser automation tidak diperlukan dan hanya melambatkan kerja.
KamusDBP pula Laravel Livewire: GET / untuk cookie dan _token, POST /carian, kemudian ikut 302 ke /carian/e/v1.<signed> sebagai GET. Kekalkan POST pada redirect itu dan anda dapat 405. Tiada akaun diperlukan, walaupun laman ini ada halaman log masuk.
Sijil kamus.dbp.gov.my dihantar tanpa perantaraan, jadi rantaian TLS tidak lengkap dan Node menolaknya. Pakej ini membekalkan intermediate GeoTrust TLS RSA CA G1 yang berantai ke DigiCert Global Root G2. Perlu diingat: memberi ca kepada Node menggantikan seluruh trust store, jadi root lalai mesti disertakan semula dengan tls.rootCertificates. Pengesahan TLS tidak pernah dimatikan.
Jawapan sebenar dicache, kegagalan rangkaian tidak. Satu talian putus tidak sepatutnya menanda perkataan sah sebagai rosak selama-lamanya.
Adab
Ada jeda 400ms antara permintaan secara lalai. Cache bermakna setiap perkataan diambil sekali sahaja seumur hidup. Tolong jangan buang jeda itu untuk kikis seluruh kamus.
Kandungan PRPM hak milik DBP. Alat ini untuk semakan dan rujukan, bukan untuk salin kandungan kamus dan edar semula.
Lesen
MIT untuk kod dalam repo ini. Kandungan kamus bukan milik projek ini.
