一键导入
awcms-mini-reference-data
Kerjakan bagian mana pun dari modul reference_data AWCMS-Mini (Issue
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Kerjakan bagian mana pun dari modul reference_data AWCMS-Mini (Issue
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Kelola/konsumsi sistem Module Management AWCMS-Mini (registry, validasi komposisi registry base, tenant lifecycle enable/disable, settings, permission sync/status, navigation, job registry, health/readiness). Gunakan saat menambah field descriptor baru (permissions/navigation/settings/jobs/health) di modul lain, saat menambah modul domain baru langsung di `src/modules/` dan perlu memverifikasi registry base tetap valid (`bun run modules:compose:check`), saat menyelidiki kenapa suatu modul terlihat degraded/orphaned, atau saat mengubah perilaku enable/disable/settings/health module_management sendiri. Sesuai src/modules/module-management/README.md, epic
Pilih dan jalankan profil deployment AWCMS-Mini (development/staging/production/offline-LAN). Gunakan saat menyiapkan deployment baru, memutuskan LAN-first vs registry-based, atau deploy ke Coolify. Sesuai doc 18 dan deployment-profiles.md/deploy-coolify.md.
Kelola sistem log/audit/metrics AWCMS-Mini yang sudah aktif — correlation ID lintas hop, retensi/purge audit log, extension point untuk consumer eksternal (alerting/export/SIEM), dan metrics port (counter/histogram/gauge berkardinalitas rendah untuk request/pool/job/provider). Gunakan saat menambah endpoint baru (correlation ID otomatis), menjadwalkan purge audit log, memasang consumer log/audit di aplikasi turunan, atau menambah/mengonsumsi metrik operasional. Berbeda dari awcms-mini-audit-log (APA yang wajib diaudit) — skill ini tentang BAGAIMANA sistem log/audit/metrics itu sendiri dikelola, sesuai Issue
Kerjakan bagian mana pun dari modul tenant_provisioning AWCMS-Mini (Issue
Triase dan perbaiki temuan CodeQL code scanning AWCMS-Mini (github.com/ahliweb/awcms-mini/security/code-scanning). Gunakan saat diminta "analisis code scanning"/"perbaiki CodeQL", saat sebuah PR gagal check CodeQL, atau saat menemukan alert baru. Mendokumentasikan satu TRUE-positive terkonfirmasi (password sungguhan → digest cepat yang dipersist = oracle cracking offline, plus dua "fix" yang membungkam alert tanpa memperbaiki apa pun) dan lima false-positive nyata (name-heuristic password, incompatible-types typeof/null, URL substring-sanitization di test mock, dua kasus dismiss resmi tanpa reformulasi kode, dan Bun.SQL tagged-template null-cast) plus pola "unused-local-variable di test kadang menandai coverage gap" — supaya tidak diinvestigasi ulang dari nol.
Daftarkan tabel bervolume tinggi ke registry lifecycle AWCMS-Mini (retensi/partisi/arsip/legal hold/purge), atau kerjakan bagian mana pun modul data_lifecycle sendiri. Gunakan saat menambah tabel baru yang tumbuh besar (log, telemetry, outbox, queue, provider attempt) dan butuh kebijakan retensi/purge aman, saat membuat/melepas legal hold, atau saat mengubah engine dry-run/archive/purge/archive-port. Sesuai Issue
| name | awcms-mini-reference-data |
| description | Kerjakan bagian mana pun dari modul reference_data AWCMS-Mini (Issue |
reference_data (src/modules/reference-data, Issue #750, epic
platform-evolution #738 Wave 3, admission decision
docs/adr/0021-reference-data-module-admission.md — dinomori ulang dari
ADR-0018 untuk menyelesaikan tabrakan penomoran lintas-PR, lihat index
docs/adr/README.md) adalah Official Optional Business Foundation
(ADR-0013 §1) — fondasi reference data provider-neutral, opt-in per tenant,
generik untuk setiap aplikasi turunan.
Baca src/modules/reference-data/README.md untuk peta tabel/endpoint.
Skill ini merangkum yang tidak jelas dari membaca satu file: batas
global-vs-tenant-scoped (satu-satunya modul opsional di repo ini yang punya
tabel GLOBAL tanpa RLS), alur import 3-fase, dan semantik PATCH parsial.
Melengkapi (bukan menggantikan) awcms-mini-new-endpoint,
awcms-mini-new-migration, awcms-mini-idempotency,
awcms-mini-abac-guard. Pakai skill ini untuk konteks
reference_data spesifik: kapan sebuah katalog jadi module-contributed vs
platform-curated, aturan override tenant, dan invariant import.
awcms_mini_reference_value_sets) — katalog bernama
stabil (mis. "currency", "unit_of_measure", "fiscal_calendar").
scope membedakan module_contributed (dideklarasikan statis di
module.ts modul lain, disinkronkan application/contribution-sync.ts)
dari platform_curated (dibuat lewat API modul ini sendiri).
overridePolicy mengatur apa yang boleh dilakukan tenant.awcms_mini_reference_codes + _code_translations) — satu
baris per kode dalam value set, effective-dated, terlokalisasi, dengan
provenance + deprecation/supersession. Tidak pernah hard-delete sekali
direferensikan override/extension tenant.awcms_mini_reference_imports) — satu baris per batch
dry-run/commit.awcms_mini_reference_tenant_codes +
_tenant_code_translations) — TENANT-SCOPED. Override (baseCodeId diisi)
menyatakan ulang atribut kode baseline untuk satu tenant saja; extension
(baseCodeId null) adalah kode baru definisi tenant. Tidak pernah
menulis ke tabel baseline global.Empat tabel pertama di atas GLOBAL: tidak ada kolom tenant_id, tidak
ada RLS — identik untuk setiap tenant secara desain, pola reviewed-exempt
yang sama dengan awcms_mini_permissions/awcms_mini_modules/
awcms_mini_idn_admin_regions (terdaftar di
scripts/security-readiness.ts's RLS_FREE_TABLES dan
ALLOWED_GLOBAL_TABLE_GRANTS).
Konsekuensi operasional yang HARUS dipahami sebelum menyentuh modul ini:
codebase ini tidak punya konsep "platform superadmin" terpisah. Memutasi
tabel global tetap lewat request tenant-authenticated biasa dengan permission
reference_data.* yang tepat. Jadi reference_data.value_sets.*/.codes.*/
.imports.* harus diberikan sangat sempit — aksi-aksi itu mempengaruhi
baseline yang dipakai SETIAP tenant, bukan cuma tenant si caller. Jangan
tambahkan endpoint baru yang memutasi tabel global tanpa menyadari ini.
Dua tabel tenant-scoped memakai ENABLE+FORCE ROW LEVEL SECURITY dengan
predikat yang selalu dan hanya tenant_id.
PATCH /tenant-codes/{id} dan PATCH /value-sets/{key}/codes/{code} dulu
berperilaku sebagai PUT: field yang dihilangkan dari body direset diam-diam
ke default (sortOrder → 0, metadata → {}, validFrom → now(),
validTo → null), menjawab 200 tanpa peringatan. Klien yang mengirim PATCH
parsial — semantik normatif PATCH — kehilangan data. Ini reference data yang
bisa jadi acuan dokumen/transaksi turunan, sehingga validFrom/validTo
bersifat load-bearing.
Sekarang ditangani domain/code-patch.ts — pakai ini, jangan parse body
manual di route:
parseReferenceCodePatchInput(body) — per field: absen = pertahankan
nilai tersimpan, null eksplisit = kosongkan ke nilai kosong field itu
(sortOrder → 0, metadata → {}, validTo → null), nilai lain =
ganti. validFrom (NOT NULL di schema) dan labels (selalu butuh minimal
satu entri) menolak null eksplisit, bukan diam-diam di-default.mergeReferenceCodePatchInput(existing, patch) — field absen dibawa
verbatim dari record tersimpan.KNOWN_PATCH_FIELDS). Kedua schema PATCH
additionalProperties: false, tapi parser yang membaca key yang dikenal dan
mengabaikan sisanya mengubah typo klien (validUntil untuk validTo) jadi
patch kosong — digabung cabang no-op empty-patch, typo itu menjawab 200
dan tidak mengubah apa pun: request TERLIHAT diterima sambil tidak
melakukan apa-apa (temuan review PR #839).KNOWN_PATCH_FIELDS sengaja diletakkan di sebelah blok per-field: menambah
field tanpa mendaftarkannya di situ membuat test field itu langsung gagal
(ditolak sebagai unknown), bukan diabaikan diam-diam.Saat merapikan route ini, jangan ubah
computeRequestHash({ ...body, id, action: "update" }) — pengikatan id ke
hash idempotency itu sudah benar dan wajib (lihat awcms-mini-idempotency
§CRITICAL).
Pola "default-in-parse" yang sama layak di-grep di endpoint PATCH lain:
: new Date() dan ?? {} di parse body.
Modul lain mendeklarasikan katalognya sendiri secara statis di module.ts-nya:
export const myModule = defineModule({
// ...
referenceData: {
contributesValueSets: [
{
key: "my_value_set",
name: "My Value Set",
description: "...",
overridePolicy: "tenant_extend",
codes: [{ code: "A", labels: [{ locale: "en", label: "A" }] }]
}
]
}
});
Divalidasi domain/contribution-registry.ts
(bun run reference-data:contributions:check, tersambung ke bun run check
dan CI) dan disinkronkan ke tabel modul ini oleh
application/contribution-sync.ts (bun run reference-data:contributions:sync)
— langkah operasional eksplisit, tidak pernah dipanggil otomatis oleh kode
modul lain. Modul ini mengapalkan kontribusi contohnya sendiri
(currency/unit-of-measure/fiscal-calendar, application/seed-contributions.ts)
lewat mekanisme yang sama persis, sebagai demonstrasi netral — baca header file
itu untuk caveat "tidak komprehensif, bukan otoritas regulasi". Jangan
perlakukan seed itu sebagai daftar authoritative.
application/import-service.ts)POST /value-sets/{key}/imports) — menghitung diff terhadap
baseline code provenance = "import" yang ada. Tidak pernah memutasi
awcms_mini_reference_codes. Mempersist baris
awcms_mini_reference_imports (status: "validated"/"rejected") dengan
ringkasan diff + checksum.POST /imports/{id}/commit) — memverifikasi ulang checksum
dan menjalankan ulang perhitungan diff penuh DI DALAM transaksi yang sama
dengan write. Jangan "optimasi" ini jadi percaya hasil dry-run saja —
data bisa berubah sejak dry-run. Menolak (seluruh transaksi, tanpa
partial write) setiap entri payload yang meminta replace: true terhadap
kode yang sudah direferensikan override/extension tenant.POST /imports/{id}/rollback) — membalik efek kumulatif batch
yang sudah di-commit: menghapus kode yang dibuatnya (hanya bila masih tidak
direferensikan — menolak bila tidak, ini limitation yang terdokumentasi di
recovery notes, bukan bypass diam-diam), memulihkan snapshot atribut
sebelumnya untuk kode yang diupdate, dan meng-undeprecate kode yang
dideprecate.Bandingkan domain/import-diff.ts + tests/unit/reference-data-import-diff.test.ts.
Setiap endpoint create/update/deprecate/restore/import-dry-run/import-commit/
import-rollback mewajibkan Idempotency-Key dan diaudit — aturan blanket
yang disengaja (bukan subset bernama) setelah PR-PR sebelumnya di epic ini
menemukan celah dari coverage parsial. commit/rollback diklasifikasikan
HIGH_RISK_ACTIONS di identity-access/domain/access-control.ts, bersama
delete/restore yang sudah ada. Endpoint mutasi BARU di modul ini wajib
mengikuti aturan blanket ini — jangan berargumen "yang ini rendah risiko".
_shared/ports/reference-data-port.ts (ReferenceDataPort) — me-resolve satu
kode atau snapshot value set untuk sebuah tenant, menggabungkan baseline +
override tenant dengan presedens deterministik (domain/resolution.ts).
Diimplementasikan application/reference-data-port-adapter.ts. Belum ada
modul di repo ini yang mengonsumsinya (extension seam, preseden "provides
sebelum consumer nyata ada" yang sama dengan BusinessScopeHierarchyPort
milik organization_structure).
idn_admin_regionsidn_admin_regions tidak diduplikasi/dimigrasikan ke modul ini (ADR-0021
§4) — skema hierarkis 4-level-nya tidak memetakan bersih ke model flat
value-set/code di sini. Ia BOLEH, di issue tersendiri kelak, ikut mendaftarkan
diri sebagai module-contributed value set lewat mekanisme di atas — seam
opsional murni, bukan keharusan.
/api/v1/reference-data/value-sets, .../{key}[/restore],
.../{key}/codes[/{code}][/restore], .../{key}/imports[/{importId}] [/commit|/rollback], /api/v1/reference-data/tenant-codes[/{id}][/restore]
— tag Reference Data di openapi/awcms-mini-public-api.openapi.yaml.awcms-mini.reference-data.value-set.{created,updated,deprecated},
.code.{created,updated,deprecated}, .import.{committed,rolled-back},
.tenant-code.{created,deprecated}./admin/reference-data/value-sets, /admin/reference-data/codes
(+ panel import tervalidasi, ?valueSet=<key>),
/admin/reference-data/tenant-codes.domain/code-patch.ts.Idempotency-Key + audit.Katalog produk/item, chart of accounts, aturan pajak/payroll, atau master data
domain lain; menggantikan idn_admin_regions; panggilan provider eksternal
real-time saat resolusi (import adalah payload tervalidasi yang disubmit
operator, bukan fetch eksternal live).
tests/unit/reference-data-{code-patch,contribution-registry,domain,import-diff,resolution}.test.ts
dan tests/integration/reference-data.integration.test.ts. Jalankan bun test
dengan DATABASE_URL — tanpa itu seluruh test integration dilewati diam-diam.
Plus gate CLI: bun run reference-data:contributions:check.