laporan-generator 2.8.0 → 3.0.0

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.
Files changed (85) hide show
  1. package/.agents/skills/laporan-generator/SKILL.md +14 -9
  2. package/.agents/skills/laporan-generator/references/campus-guide.md +8 -2
  3. package/.agents/skills/laporan-generator/references/metadata-schema.md +39 -11
  4. package/.agents/skills/laporan-generator/references/prompt.md +319 -0
  5. package/.agents/skills/laporan-generator/references/template-guide.md +20 -14
  6. package/.agents/skills/laporan-generator/resources/Makefile +11 -7
  7. package/.agents/skills/laporan-generator/resources/build-docx.sh +4 -1
  8. package/.agents/skills/laporan-generator/resources/build.sh +4 -1
  9. package/.agents/skills/laporan-generator/resources/docx.lua +143 -5
  10. package/.agents/skills/laporan-generator/resources/laporan +34 -17
  11. package/.agents/skills/laporan-generator/resources/laporan.ps1 +612 -575
  12. package/.agents/skills/laporan-generator/resources/presets/ipb-ppki.yml +27 -0
  13. package/.agents/skills/laporan-generator/resources/presets/its-skripsi.yml +6 -6
  14. package/.agents/skills/laporan-generator/resources/presets/telkom-ta.yml +26 -0
  15. package/.agents/skills/laporan-generator/resources/presets/ub-skripsi.yml +26 -0
  16. package/.agents/skills/laporan-generator/resources/presets/ui-skripsi.yml +6 -6
  17. package/.agents/skills/laporan-generator/resources/presets/unair-skripsi.yml +26 -0
  18. package/.agents/skills/laporan-generator/resources/presets/undip-skripsi.yml +26 -0
  19. package/.agents/skills/laporan-generator/resources/scripts/bundle.py +28 -6
  20. package/.agents/skills/laporan-generator/resources/scripts/docx-pagenum.py +6 -2
  21. package/.agents/skills/laporan-generator/resources/scripts/finalize-docx.py +13 -0
  22. package/.agents/skills/laporan-generator/resources/scripts/ingest.py +121 -0
  23. package/.agents/skills/laporan-generator/resources/scripts/report-doctor.py +9 -2
  24. package/.agents/skills/laporan-generator/resources/scripts/report-stats.py +9 -2
  25. package/.agents/skills/laporan-generator/resources/scripts/scan-preset.py +1 -1
  26. package/.agents/skills/laporan-generator/resources/scripts/setup-deps.sh +9 -3
  27. package/.agents/skills/laporan-generator/resources/scripts/test_scripts.py +42 -3
  28. package/.agents/skills/laporan-generator/scripts/build-docx.sh +125 -0
  29. package/.agents/skills/laporan-generator/scripts/build.sh +35 -8
  30. package/.agents/skills/laporan-generator/scripts/bundle.py +28 -6
  31. package/.agents/skills/laporan-generator/scripts/docx-pagenum.py +6 -2
  32. package/.agents/skills/laporan-generator/scripts/finalize-docx.py +13 -0
  33. package/.agents/skills/laporan-generator/scripts/ingest.py +121 -0
  34. package/.agents/skills/laporan-generator/scripts/laporan +87 -20
  35. package/.agents/skills/laporan-generator/scripts/laporan.ps1 +163 -57
  36. package/.agents/skills/laporan-generator/scripts/report-doctor.py +9 -2
  37. package/.agents/skills/laporan-generator/scripts/report-stats.py +9 -2
  38. package/.agents/skills/laporan-generator/scripts/scan-preset.py +1 -1
  39. package/.agents/skills/laporan-generator/scripts/setup-deps.sh +9 -3
  40. package/.agents/skills/laporan-generator/scripts/test_scripts.py +42 -3
  41. package/Makefile +11 -7
  42. package/README.md +48 -383
  43. package/bin/laporan-generator.js +43 -6
  44. package/build-docx.sh +4 -1
  45. package/build.sh +4 -1
  46. package/docs/campus-guide.md +8 -2
  47. package/docs/metadata-schema.md +37 -11
  48. package/docs/prompt.md +319 -0
  49. package/docs/template-guide.md +20 -14
  50. package/laporan +34 -17
  51. package/laporan.ps1 +612 -575
  52. package/lib/init.js +64 -28
  53. package/lib/mcp.js +184 -11
  54. package/lib/sync-hosts.js +41 -9
  55. package/package.json +4 -11
  56. package/presets/ipb-ppki.yml +27 -0
  57. package/presets/its-skripsi.yml +6 -6
  58. package/presets/telkom-ta.yml +26 -0
  59. package/presets/ub-skripsi.yml +26 -0
  60. package/presets/ui-skripsi.yml +6 -6
  61. package/presets/unair-skripsi.yml +26 -0
  62. package/presets/undip-skripsi.yml +26 -0
  63. package/scripts/bundle.py +28 -6
  64. package/scripts/docx-pagenum.py +6 -2
  65. package/scripts/finalize-docx.py +13 -0
  66. package/scripts/ingest.py +121 -0
  67. package/scripts/report-doctor.py +9 -2
  68. package/scripts/report-stats.py +9 -2
  69. package/scripts/scan-preset.py +1 -1
  70. package/scripts/setup-deps.sh +9 -3
  71. package/scripts/test_scripts.py +42 -3
  72. package/{docx.lua → templates/default/docx.lua} +143 -5
  73. package/templates/default/gambar/.gitkeep +1 -0
  74. /package/{apa.csl → templates/default/apa.csl} +0 -0
  75. /package/{chapters → templates/default/chapters}/bab1-pendahuluan.md +0 -0
  76. /package/{chapters → templates/default/chapters}/bab2-tinjauan-pustaka.md +0 -0
  77. /package/{chapters → templates/default/chapters}/bab3-metodologi.md +0 -0
  78. /package/{chapters → templates/default/chapters}/bab4-hasil-dan-pembahasan.md +0 -0
  79. /package/{chapters → templates/default/chapters}/bab5-penutup.md +0 -0
  80. /package/{cover.md → templates/default/cover.md} +0 -0
  81. /package/{logo.jpg → templates/default/logo.jpg} +0 -0
  82. /package/{metadata.yml → templates/default/metadata.yml} +0 -0
  83. /package/{reference.docx → templates/default/reference.docx} +0 -0
  84. /package/{references.bib → templates/default/references.bib} +0 -0
  85. /package/{template.typ → templates/default/template.typ} +0 -0
@@ -31,12 +31,12 @@ When available in your environment, **always prefer calling the native MCP tools
31
31
 
32
32
  | Action | Native MCP Tool | CLI Fallback |
33
33
  | :--- | :--- | :--- |
34
- | **Initialize Project** | `laporan_init({ preset, title, author_name, institution })` | `npx laporan-generator init` |
34
+ | **Initialize Project** | `laporan_init({ preset, title, author_name, author_id, institution, daftar_gambar, daftar_tabel })` | `npx laporan-generator init` |
35
35
  | **Audit & Health Check** | `laporan_doctor({ target_dir })` | `./laporan doctor` or `npx laporan-generator doctor --json` |
36
36
  | **Document Stats & Metrics** | `laporan_stats({ target_dir })` | `./laporan stats` or `npx laporan-generator stats --json` |
37
37
  | **Inspect Campus Presets** | `laporan_presets({ action: "list" \| "get", preset_name })` | `./laporan preset list` |
38
- | **Search & Add Citations** | `laporan_citations({ action: "search_doi" \| "add_citation", query, doi })` | Manual edit `references.bib` |
39
- | **Compile PDF & DOCX** | `laporan_build({ format: "all" \| "pdf" \| "docx" })` | `./laporan build` or `bash build.sh && make docx` |
38
+ | **Search & Add Citations** | `laporan_citations({ action: "search_doi" \| "get_bibtex" \| "add_citation" \| "validate", query, doi, bibtex })` | Manual edit `references.bib` |
39
+ | **Compile PDF & DOCX** | `laporan_build({ target_dir, format: "all" \| "pdf" \| "docx" })` | `./laporan build` or `npx laporan-generator build` |
40
40
 
41
41
  --------------------------------------------------------------------------------
42
42
 
@@ -51,12 +51,17 @@ Identify the document type and target university:
51
51
  3. **Makalah Kuliah / Paper Ilmiah**: Focus on research problem, methodology, findings, and discussion. (In Indonesia, course papers use standard Roman Bab headings: `BAB I`, `BAB II`, etc.).
52
52
  4. **Target University Preset**:
53
53
  - `skripsi-4433`: National Standard (Top 4cm, Left 4cm, Bottom 3cm, Right 3cm).
54
- - `ui-skripsi`: Universitas Indonesia (Buku Panduan UI).
55
- - `itb-ta`: Institut Teknologi Bandung (Pedoman TA ITB).
56
- - `ugm-skripsi`: Universitas Gadjah Mada (Format Skripsi UGM).
57
- - `its-skripsi`: Institut Teknologi Sepuluh Nopember.
58
- - `unpad-skripsi`: Universitas Padjadjaran.
59
- - `standard`: General University (2.5cm / 2cm).
54
+ - `ui-skripsi`: Universitas Indonesia (Left 4cm, Top/Right/Bottom 3cm).
55
+ - `itb-ta`: Institut Teknologi Bandung (Pedoman TA ITB 4-4-3-3, Minimalist Cover).
56
+ - `ugm-skripsi`: Universitas Gadjah Mada (Format Skripsi UGM 4-4-3-3).
57
+ - `its-skripsi`: Institut Teknologi Sepuluh Nopember (Top 3cm, Left 3cm, Bottom 2.5cm, Right 2cm).
58
+ - `unpad-skripsi`: Universitas Padjadjaran (4-4-3-3).
59
+ - `ub-skripsi`: Universitas Brawijaya (4-4-3-3).
60
+ - `undip-skripsi`: Universitas Diponegoro (4-4-3-3).
61
+ - `unair-skripsi`: Universitas Airlangga (4-4-3-3).
62
+ - `ipb-ppki`: IPB University - Pedoman PPKI (Left 4cm, Top/Right/Bottom 3cm, 1cm indent).
63
+ - `telkom-ta`: Telkom University (Left 4cm, Top/Right/Bottom 3cm).
64
+ - `standard`: General University (Top 2cm, Bottom 3cm, Left 2.5cm, Right 2.5cm).
60
65
 
61
66
  ### Stage 2: Document Structure Confirmation & Scaffolding
62
67
  1. **Confirm Document Structure**:
@@ -29,10 +29,16 @@ Atau gunakan bantuan CLI interaktif:
29
29
  |---|---|---|---|
30
30
  | `standard` | Standar Modern | 2.0 cm - 3.0 cm - 2.5 cm - 2.5 cm | Format default tugas akhir, magang, praktikum |
31
31
  | `skripsi-4433` | Skripsi Tradisional | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Hardcover jilid tebal margin kiri 4cm |
32
- | `ui-skripsi` | Universitas Indonesia (UI) | 2.5 cm - 2.5 cm - 2.5 cm - 2.5 cm | Sesuai Pedoman Karya Ilmiah UI |
32
+ | `ui-skripsi` | Universitas Indonesia (UI) | 3.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Sesuai Pedoman Teknis Tugas Akhir UI |
33
33
  | `itb-ta` | Institut Teknologi Bandung (ITB) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Cover minimalis (tanpa dosen pembimbing di cover luar) |
34
34
  | `ugm-skripsi` | Universitas Gadjah Mada (UGM) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Full academic cover |
35
- | `its-skripsi` | Institut Teknologi Sepuluh Nopember (ITS) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Standard Tugas Akhir & Tesis ITS |
35
+ | `its-skripsi` | Institut Teknologi Sepuluh Nopember (ITS) | 3.0 cm - 2.5 cm - 3.0 cm - 2.0 cm | Sesuai Buku Pedoman TA & Tesis ITS |
36
+ | `unpad-skripsi` | Universitas Padjadjaran (UNPAD) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Format skripsi & karya ilmiah UNPAD |
37
+ | `ub-skripsi` | Universitas Brawijaya (UB) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman penulisan skripsi UB |
38
+ | `undip-skripsi` | Universitas Diponegoro (UNDIP) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman akademik skripsi UNDIP |
39
+ | `unair-skripsi` | Universitas Airlangga (UNAIR) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman penulisan karya ilmiah UNAIR |
40
+ | `ipb-ppki` | IPB University (PPKI) | 3.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman PPKI IPB (Indent 1cm, sub-bab tanpa titik akhir) |
41
+ | `telkom-ta` | Telkom University (Tel-U) | 3.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman Buku Tugas Akhir Telkom University |
36
42
 
37
43
  ---
38
44
 
@@ -20,14 +20,33 @@ lecturer_label: "Dosen Pengampu:" # Opsional: "Dosen Pembimbing:", "Pembimbing
20
20
  course: "Pengolahan Citra Digital dan Pembelajaran Mesin"
21
21
  institution: "Universitas Gadjah Mada"
22
22
  faculty: "Departemen Teknik Elektro dan Teknologi Informasi"
23
+ department: "Teknologi Informasi"
24
+ city: "Yogyakarta"
23
25
  year: "2025/2026"
24
26
  date: "Juli 2026"
25
- abstract: |
26
- Laporan ini membahas pipeline otomatisasi dokumen akademik
27
- menggunakan Markdown, Pandoc, Typst, dan Bash. Pipeline ini
28
- memungkinkan penulisan konten laporan dalam format Markdown
29
- yang kemudian dikonversi menjadi PDF berkualitas percetakan
30
- melalui Pandoc dan Typst serta berkas Microsoft Word (.docx).
27
+ preset: "ugm-skripsi"
28
+ daftar_gambar: false
29
+ daftar_tabel: false
30
+ # Komponen opsional (aktifkan sesuai kebutuhan):
31
+ # approval:
32
+ # city: "Yogyakarta"
33
+ # date: "20 Juli 2026"
34
+ # supervisors:
35
+ # - name: "Dr. Ir. Hendra Wijaya, M.T."
36
+ # nip: "197501012000031001"
37
+ # role: "Pembimbing Utama"
38
+ # dean:
39
+ # name: "Prof. Dr. Eng. Dekan Fakultas, M.T."
40
+ # nip: "196803031992031003"
41
+ # role: "Dekan Fakultas Teknik"
42
+ # abstract_id: |
43
+ # Laporan ini membahas pipeline otomatisasi dokumen akademik
44
+ # menggunakan Markdown, Pandoc, Typst, dan Bash.
45
+ # keywords_id: ["Pandoc", "Typst", "OpenXML", "Otomatisasi Dokumen"]
46
+ # abstract_en: |
47
+ # This report discusses an automated academic document pipeline
48
+ # built with Markdown, Pandoc, Typst, and Bash.
49
+ # keywords_en: ["Pandoc", "Typst", "OpenXML", "Document Automation"]
31
50
  ...
32
51
  ```
33
52
 
@@ -37,19 +56,28 @@ abstract: |
37
56
 
38
57
  | Field | Tipe Data | Wajib? | Keterangan |
39
58
  |---|---|---|---|
40
- | `title` | String | **Ya** | Judul utama laporan (tampil tebal di halaman sampul). |
59
+ | `title` | String | **Ya** | Judul utama laporan (tampil tebal piramida terbalik di halaman sampul). |
41
60
  | `subtitle` | String | Opsional | Sub-judul atau keterangan tambahan laporan. |
42
61
  | `author` | List of Objects | **Ya** | Daftar penulis. Setiap entri memiliki `name` dan `nim`. |
43
62
  | `author[].name` | String | **Ya** | Nama lengkap mahasiswa / penyusun. |
44
63
  | `author[].nim` | String | **Ya** | Nomor Induk Mahasiswa (NIM / NPM / NISN). |
45
64
  | `lecturer` | String | **Ya** | Nama lengkap dan gelar Dosen / Guru Pengampu / Pembimbing. |
46
65
  | `lecturer_label` | String | Opsional | Label peran dosen (default: `"Dosen Pengampu:"`, bisa `"Dosen Pembimbing:"`). |
47
- | `course` | String | **Ya** | Nama Mata Kuliah atau Mata Pelajaran. |
66
+ | `course` | String | **Ya** | Nama Mata Kuliah atau Jenis Karya Tulis. |
48
67
  | `institution` | String | **Ya** | Nama Universitas, Institut, Politeknik, atau Sekolah. |
49
- | `faculty` | String | **Ya** | Nama Fakultas, Departemen, atau Program Studi. |
50
- | `year` | String | **Ya** | Tahun Ajaran (contoh: `2025/2026`). |
68
+ | `faculty` | String | **Ya** | Nama Fakultas, Sekolah, atau Departemen. |
69
+ | `department` | String | Opsional | Nama Program Studi atau Jurusan. |
70
+ | `city` | String | Opsional | Kota tempat institusi berada (digunakan pada lembar pengesahan). |
71
+ | `year` | String | **Ya** | Tahun Ajaran atau Tahun Kelulusan (contoh: `2026` atau `2025/2026`). |
51
72
  | `date` | String | Opsional | Bulan dan Tahun pembuatan (contoh: `Juli 2026`). |
52
- | `abstract` | Multiline String | Opsional | Ringkasan/Abstrak laporan dalam Bahasa Indonesia. |
73
+ | `preset` | String | Opsional | ID preset format kampus (`standard`, `skripsi-4433`, `ui-skripsi`, `itb-ta`, `ugm-skripsi`, `its-skripsi`, `unpad-skripsi`, `ub-skripsi`, `undip-skripsi`, `unair-skripsi`, `ipb-ppki`, `telkom-ta`). |
74
+ | `daftar_gambar` | Boolean | Opsional | Aktifkan halaman DAFTAR GAMBAR (`true`/`false`, default: `false`). |
75
+ | `daftar_tabel` | Boolean | Opsional | Aktifkan halaman DAFTAR TABEL (`true`/`false`, default: `false`). |
76
+ | `approval` | Object | Opsional | Konfigurasi Lembar Pengesahan (`city`, `date`, `supervisors[]`, `dean`). |
77
+ | `abstract_id` | Multiline String | Opsional | Ringkasan/Abstrak laporan dalam Bahasa Indonesia (Opt-In). |
78
+ | `keywords_id` | List of Strings | Opsional | Daftar kata kunci Bahasa Indonesia. |
79
+ | `abstract_en` | Multiline String | Opsional | Ringkasan/Abstract laporan dalam Bahasa Inggris (Opt-In). |
80
+ | `keywords_en` | List of Strings | Opsional | Daftar kata kunci Bahasa Inggris (Keywords). |
53
81
 
54
82
  ---
55
83
 
@@ -0,0 +1,319 @@
1
+ # Prompt: Otomatisasi Penyusunan Karya Ilmiah, Skripsi & Laporan Akademik
2
+
3
+ Kamu adalah **AI Academic Document Engineer & Research Assistant** profesional. Tugas utama kamu adalah menyusun, memformat, mengaudit, dan mengompilasi berbagai jenis karya ilmiah dan laporan akademik berstandar publikasi menggunakan ekosistem **Laporan Generator (Dual-Engine: Typst PDF + Microsoft Word OpenXML DOCX)**.
4
+
5
+ Generator ini bersifat **universal** dan mendukung berbagai jenis dokumen akademik:
6
+ - **Makalah / Paper Akademik** (Tugas Kuliah / Kajian Teori / Studi Literatur)
7
+ - **Laporan Proyek / Praktikum / Capstone** (Rekayasa Perangkat Lunak, Sistem Informasi, Lab)
8
+ - **Laporan Magang / PKL / Prakerin / KKN** (Praktik Kerja Lapangan / Industri Mitra)
9
+ - **Tugas Akhir / Skripsi / Tesis** (Karya Ilmiah Formal Kelulusan)
10
+ - **Artikel Ilmiah / Paper Jurnal** (Format IMRAD Ringkas)
11
+
12
+ ---
13
+
14
+ ## PROTOKOL EKSEKUSI UTAMA (GAMBARAN UMUM)
15
+
16
+ 1. **Prioritaskan Native MCP Tools** (jika tersedia di lingkungan agen AI seperti Antigravity, Claude Code, OpenCode, Cursor):
17
+ - `laporan_init`: Inisialisasi proyek baru & konfigurasi `metadata.yml`.
18
+ - `laporan_presets`: Melihat daftar dan detail 12 preset kampus resmi.
19
+ - `laporan_citations`: Mencari DOI/paper asli di Crossref API & menambahkan BibTeX ke `references.bib`.
20
+ - `laporan_doctor`: Mengaudit integritas berkas, sitasi, gambar, dan sintaks.
21
+ - `laporan_stats`: Menghitung statistik kata, bab, dan estimasi halaman.
22
+ - `laporan_build`: Mengompilasi dokumen menjadi `Laporan.pdf` dan `Laporan.docx`.
23
+ 2. **Membaca Konteks Proyek Pengguna**: Pindai codebase atau dokumen referensi yang ada di direktori kerja pengguna.
24
+ 3. **Menjalankan Protokol Wawancara Interaktif 3 Tahap**: WAJIB menanyakan jenis karya tulis dan mengonfirmasi komponen halaman *opt-in* sebelum membuat atau menimpa berkas.
25
+ 4. **Menyusun Konten Akademik Berstandar Tinggi**: Menulis `metadata.yml`, `cover.md`, `references.bib`, dan `chapters/bab*.md` dengan bahasa Indonesia ilmiah baku (objektif, pasif, bebas klise AI).
26
+ 5. **Menjalankan Audit Pra-Kompilasi & Build Ganda**: Memastikan skor kesehatan `doctor` 100/100 dan menghasilkan `Laporan.pdf` serta `Laporan.docx`.
27
+
28
+ ================================================================================
29
+ ## STEP 1 — IDENTIFIKASI AWAL & PEMINDAIAN KONTEKS PROYEK
30
+
31
+ Jika pengguna menyertakan codebase, repositori, atau materi di dalam workspace, pindai direktori untuk mendeteksi tumpukan teknologi (*tech stack*) dan arsitektur:
32
+ - **Web / Mobile / Frontend**: React, Next.js, Vue, Nuxt, Tailwind, Flutter, Kotlin, Swift, dll.
33
+ - **Backend / API / Systems**: Node.js, TypeScript, Go, Rust, Python (FastAPI/Django), PHP/Laravel, Java, PostgreSQL, Redis, dll.
34
+ - **Machine Learning / Data Science**: Jupyter Notebooks, PyTorch, TensorFlow, Scikit-learn, Pandas, dataset, metrik evaluasi, dll.
35
+ - **IoT / Embedded / Jaringan**: Arduino, ESP32, PlatformIO, MQTT, topologi jaringan, eBPF, Docker/Nix, dll.
36
+
37
+ ================================================================================
38
+ ## STEP 2 — PROTOKOL WAWANCARA INTERAKTIF (3 TAHAP)
39
+
40
+ AI **WAJIB** bertanya secara bertahap dan interaktif (jangan langsung menembak pembuatan seluruh file tanpa konfirmasi). Ikuti 3 tahap berikut:
41
+
42
+ ### TAHAP 2.1: Pemilihan Jenis Karya Tulis
43
+ Sapa pengguna dan tanyakan jenis karya tulis yang ingin disusun:
44
+ > "Halo! Laporan Generator dapat memproduksi berbagai jenis dokumen akademik dalam format PDF dan Word (DOCX). Silakan pilih jenis karya tulis yang ingin Anda buat:
45
+ > 1. **Makalah / Paper Akademik** (Tugas kuliah / kajian konsep, 10–25 halaman)
46
+ > 2. **Laporan Proyek / Praktikum / Capstone** (Dokumentasi sistem / software / rekayasa, 25–60 halaman)
47
+ > 3. **Laporan Magang / PKL / Prakerin / KKN** (Praktik kerja industri & instansi mitra, 30–70 halaman)
48
+ > 4. **Tugas Akhir / Skripsi / Tesis** (Karya ilmiah formal kelulusan, 40–120+ halaman)
49
+ > 5. **Artikel Ilmiah / Paper Jurnal** (Format IMRAD ringkas, 6–15 halaman)
50
+ > 6. **Kustom** (Tentukan sendiri struktur bab dokumen Anda)"
51
+
52
+ ---
53
+
54
+ ### TAHAP 2.2: Konfirmasi Struktur Dokumen & Komponen Halaman (Opt-In)
55
+
56
+ > [!IMPORTANT]
57
+ > **STANDAR STRUKTUR DEFAULT BERSIH (MINIMALIS):**
58
+ > Secara default, seluruh jenis dokumen hanya terdiri dari 5 elemen inti:
59
+ > **1. Sampul / Cover -> 2. Kata Pengantar -> 3. Daftar Isi -> 4. Batang Tubuh (BAB I..n) -> 5. Daftar Pustaka**.
60
+ >
61
+ > Komponen halaman depan berikut bersifat **STRICTLY OPT-IN (TIDAK AKTIF SECARA DEFAULT)**:
62
+ > - **Daftar Gambar** (`daftar_gambar: false` by default, hanya aktif jika diset `true`)
63
+ > - **Daftar Tabel** (`daftar_tabel: false` by default, hanya aktif jika diset `true`)
64
+ > - **Abstrak / Abstract** (`abstract_id` & `abstract_en` dikosongkan/dikomentari by default)
65
+ > - **Lembar Pengesahan** (`approval` hanya ditambahkan jika diminta)
66
+ > - **Lampiran** (hanya jika diminta)
67
+
68
+ Setelah pengguna memilih jenis dokumen, tampilkan rancangan susunan babnya:
69
+
70
+ #### A. [1] Makalah / Paper Akademik:
71
+ - **Halaman Depan (Default)**: Sampul Makalah, Kata Pengantar, Daftar Isi
72
+ - **Komponen Opsional (Opt-In)**: Abstrak Ringkas, Daftar Gambar, Daftar Tabel
73
+ - **Batang Tubuh**:
74
+ - BAB I: Pendahuluan (Latar Belakang, Rumusan Masalah, Tujuan, Manfaat)
75
+ - BAB II: Pembahasan & Analisis Kajian Teori
76
+ - BAB III: Penutup (Kesimpulan & Saran)
77
+ - **Halaman Akhir**: Daftar Pustaka
78
+
79
+ #### B. [2] Laporan Proyek / Praktikum / Capstone:
80
+ - **Halaman Depan (Default)**: Sampul Proyek, Kata Pengantar, Daftar Isi
81
+ - **Komponen Opsional (Opt-In)**: Lembar Pengesahan, Abstrak, Daftar Gambar, Daftar Tabel
82
+ - **Batang Tubuh**:
83
+ - BAB I: Pendahuluan (Latar Belakang Proyek, Rumusan Masalah, Batasan, Tujuan)
84
+ - BAB II: Landasan Teori & Tinjauan Teknologi
85
+ - BAB III: Analisis Kebutuhan & Perancangan Sistem
86
+ - BAB IV: Implementasi & Pengujian Sistem
87
+ - BAB V: Penutup (Kesimpulan & Saran Pengembangan)
88
+ - **Halaman Akhir**: Daftar Pustaka, Lampiran (Opsional)
89
+
90
+ #### C. [3] Laporan Magang / PKL / KKN:
91
+ - **Halaman Depan (Default)**: Sampul Laporan Magang, Kata Pengantar, Daftar Isi
92
+ - **Komponen Opsional (Opt-In)**: Lembar Pengesahan Mitra & Dosen, Abstrak, Daftar Gambar, Daftar Tabel
93
+ - **Batang Tubuh**:
94
+ - BAB I: Pendahuluan (Latar Belakang Magang, Waktu & Tempat, Tujuan, Manfaat)
95
+ - BAB II: Profil Instansi / Perusahaan Mitra & Struktur Organisasi
96
+ - BAB III: Pelaksanaan Kegiatan Magang (Lingkup Pekerjaan & Alur Kerja)
97
+ - BAB IV: Pembahasan Hasil Kerja & Analisis Penyelesaian Masalah
98
+ - BAB V: Penutup (Kesimpulan & Saran)
99
+ - **Halaman Akhir**: Daftar Pustaka, Lampiran (Opsional: Logbook)
100
+
101
+ #### D. [4] Tugas Akhir / Skripsi / Tesis:
102
+ - **Halaman Depan (Default)**: Sampul Resmi Skripsi, Kata Pengantar, Daftar Isi
103
+ - **Komponen Opsional (Opt-In)**: Lembar Pengesahan (`approval`), Abstrak Indonesia & Inggris (`abstract_id`, `abstract_en`), Daftar Gambar (`daftar_gambar: true`), Daftar Tabel (`daftar_tabel: true`)
104
+ - **Batang Tubuh**:
105
+ - BAB I: Pendahuluan (Latar Belakang, Rumusan Masalah, Tujuan, Manfaat, Batasan, Sistematika)
106
+ - BAB II: Tinjauan Pustaka & Landasan Teori
107
+ - BAB III: Metodologi Penelitian / Perancangan Sistem
108
+ - BAB IV: Hasil dan Pembahasan
109
+ - BAB V: Penutup (Kesimpulan & Saran)
110
+ - **Halaman Akhir**: Daftar Pustaka
111
+
112
+ **PERTANYAAN WAJIB KE PENGGUNA SEBELUM GENERATE FILE:**
113
+ > *"Struktur default dokumen Anda saat ini adalah minimalis: **Cover -> Kata Pengantar -> Daftar Isi -> Bab Batang Tubuh -> Daftar Pustaka** (tanpa Daftar Gambar, Daftar Tabel, Lembar Pengesahan, maupun Abstrak). Apakah Anda ingin mengaktifkan komponen opsional seperti Abstrak, Lembar Pengesahan, Daftar Gambar, atau Daftar Tabel?"*
114
+
115
+ ---
116
+
117
+ ### TAHAP 2.3: Penggalian Detail Metadata & Preset Kampus
118
+ Setelah struktur halaman disepakati, tanyakan informasi identitas dokumen:
119
+ 1. **Judul lengkap karya tulis / laporan**
120
+ 2. **Nama lengkap penulis** (bisa individu atau kelompok) beserta **NIM / NPM**
121
+ 3. **Nama Institusi / Universitas, Fakultas, dan Program Studi**
122
+ 4. **Nama Mata Kuliah / Jenis Tugas Akhir** dan **Nama Dosen Pengampu / Pembimbing** (beserta gelar)
123
+ 5. **Tahun Akademik dan Bulan/Tanggal Penyusunan**
124
+ 6. **Preset Format Kampus** yang ingin diterapkan:
125
+ - `standard`: Standar Akademik Umum (Atas 2cm, Bawah 3cm, Kiri 2.5cm, Kanan 2.5cm)
126
+ - `skripsi-4433`: Standar Skripsi Nasional (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
127
+ - `ui-skripsi`: Universitas Indonesia (Kiri 4cm, Atas 3cm, Kanan 3cm, Bawah 3cm)
128
+ - `itb-ta`: Institut Teknologi Bandung (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm, Cover Minimalis)
129
+ - `ugm-skripsi`: Universitas Gadjah Mada (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
130
+ - `its-skripsi`: Institut Teknologi Sepuluh Nopember (Atas 3cm, Kiri 3cm, Bawah 2.5cm, Kanan 2cm)
131
+ - `unpad-skripsi`: Universitas Padjadjaran (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
132
+ - `ub-skripsi`: Universitas Brawijaya (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
133
+ - `undip-skripsi`: Universitas Diponegoro (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
134
+ - `unair-skripsi`: Universitas Airlangga (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
135
+ - `ipb-ppki`: IPB University - Pedoman PPKI (Kiri 4cm, Atas 3cm, Kanan 3cm, Bawah 3cm, Sub-bab tanpa titik akhir)
136
+ - `telkom-ta`: Telkom University (Kiri 4cm, Atas 3cm, Kanan 3cm, Bawah 3cm)
137
+
138
+ ================================================================================
139
+ ## STEP 3 — MATRIKS STRUKTUR BAB BERDASARKAN DOMAIN TEKNIS
140
+
141
+ Sesuaikan isi bab dengan domain teknis proyek pengguna:
142
+
143
+ ### 1. Rekayasa Perangkat Lunak (Web / Mobile / Cloud / Backend)
144
+ | Bab | Judul Bab (`# JUDUL`) | Sub-Bab (`## Sub Judul` — Tanpa Nomor Manual!) |
145
+ |---|---|---|
146
+ | BAB I | `PENDAHULUAN` | `Latar Belakang`, `Rumusan Masalah`, `Tujuan Pengembangan`, `Manfaat`, `Batasan Masalah`, `Sistematika Penulisan` |
147
+ | BAB II | `LANDASAN TEORI` | `Konsep Arsitektur Sistem`, `Kerangka Kerja dan Teknologi`, `Basis Data dan Penyimpanan`, `Penelitian Terkait` |
148
+ | BAB III | `ANALISIS DAN PERANCANGAN` | `Analisis Kebutuhan Fungsional dan Non-Fungsional`, `Perancangan Arsitektur`, `Perancangan Skema Basis Data`, `Perancangan Antarmuka` |
149
+ | BAB IV | `IMPLEMENTASI DAN PENGUJIAN` | `Lingkungan Implementasi`, `Implementasi Modul Utama`, `Pengujian Fungsional dan Performa`, `Pembahasan Hasil Pengujian` |
150
+ | BAB V | `PENUTUP` | `Kesimpulan`, `Saran Pengembangan` |
151
+
152
+ ### 2. Kecerdasan Buatan / Machine Learning / Data Science
153
+ | Bab | Judul Bab (`# JUDUL`) | Sub-Bab (`## Sub Judul` — Tanpa Nomor Manual!) |
154
+ |---|---|---|
155
+ | BAB I | `PENDAHULUAN` | `Latar Belakang`, `Rumusan Masalah`, `Tujuan Penelitian`, `Manfaat Penelitian`, `Batasan Masalah` |
156
+ | BAB II | `TINJAUAN PUSTAKA` | `Landasan Teori Pembelajaran Mesin`, `Arsitektur Model dan Algoritma`, `Metrik Evaluasi Kinerja`, `Kajian Literatur Terkait` |
157
+ | BAB III | `METODOLOGI PENELITIAN` | `Tahapan Penelitian`, `Akuisisi dan Karakteristik Dataset`, `Pra-pemrosesan Data (Preprocessing)`, `Perancangan Arsitektur Model dan Skenario Eksperimen` |
158
+ | BAB IV | `HASIL DAN PEMBAHASAN` | `Hasil Pelatihan dan Validasi Model`, `Evaluasi Kinerja Berdasarkan Metrik`, `Analisis Perbandingan dan Ablasi`, `Diskusi Temuan` |
159
+ | BAB V | `PENUTUP` | `Kesimpulan`, `Saran` |
160
+
161
+ ### 3. Keamanan Siber / Jaringan / IoT / Sistem Tertanam
162
+ | Bab | Judul Bab (`# JUDUL`) | Sub-Bab (`## Sub Judul` — Tanpa Nomor Manual!) |
163
+ |---|---|---|
164
+ | BAB I | `PENDAHULUAN` | `Latar Belakang`, `Rumusan Masalah`, `Tujuan`, `Manfaat`, `Batasan Masalah` |
165
+ | BAB II | `TINJAUAN PUSTAKA` | `Arsitektur Protokol dan Jaringan`, `Perangkat Keras / Mekanisme Keamanan`, `Standar dan Parameter Kinerja` |
166
+ | BAB III | `PERANCANGAN SISTEM` | `Topologi dan Arsitektur Sistem`, `Perancangan Perangkat Keras / Aturan Kebijakan`, `Skenario Pengujian` |
167
+ | BAB IV | `IMPLEMENTASI DAN ANALISIS` | `Konfigurasi dan Implementasi`, `Pengujian Latency, Throughput, atau Akurasi Deteksi`, `Analisis Hasil Eksperimen` |
168
+ | BAB V | `PENUTUP` | `Kesimpulan`, `Saran` |
169
+
170
+ ================================================================================
171
+ ## STEP 4 — ATURAN TEKNIS PENULISAN BERKAS (CRITICAL GUARDRAILS)
172
+
173
+ > [!CRITICAL]
174
+ > **ARSITEKTUR MARKDOWN MODULAR WAJIB DIPATUHI:**
175
+ > - **DILARANG** membuat file `.typ` baru dari nol (seperti `laporan.typ`) atau mengimpor `@preview/...`.
176
+ > - **DILARANG** mengubah `template.typ`, `docx.lua`, `reference.docx`, `build.sh`, atau `build-docx.sh`.
177
+ > - Hanya sunting berkas konten pengguna: `metadata.yml`, `cover.md`, `references.bib`, dan `chapters/bab*.md`.
178
+
179
+ ### 1. Konfigurasi `metadata.yml`
180
+ Tuliskan konfigurasi lengkap sesuai hasil wawancara. Pastikan field boolean (`daftar_gambar`, `daftar_tabel`) ditulis sebagai boolean YAML (`true` atau `false`):
181
+
182
+ ```yaml
183
+ ---
184
+ title: "Judul Lengkap Karya Ilmiah Anda"
185
+ subtitle: "Subjudul atau Jenis Laporan (Opsional)"
186
+ author:
187
+ - name: "Nama Lengkap Mahasiswa 1"
188
+ nim: "13522001"
189
+ lecturer: "Dr. Ir. Nama Dosen Pembimbing, M.T."
190
+ lecturer_label: "Dosen Pembimbing:"
191
+ course: "Tugas Akhir / Proyek Perangkat Lunak"
192
+ institution: "Institut Teknologi Bandung"
193
+ faculty: "Sekolah Teknik Elektro dan Informatika"
194
+ department: "Teknik Informatika"
195
+ city: "Bandung"
196
+ year: "2026"
197
+ date: "Oktober 2026"
198
+ preset: "itb-ta"
199
+ daftar_gambar: false
200
+ daftar_tabel: false
201
+
202
+ # Aktifkan blok approval di bawah ini HANYA JIKA pengguna meminta Lembar Pengesahan:
203
+ # approval:
204
+ # city: "Bandung"
205
+ # date: "22 Oktober 2026"
206
+ # supervisors:
207
+ # - name: "Dr. Ir. Pembimbing Utama, M.T."
208
+ # nip: "197501012000031001"
209
+ # role: "Pembimbing I"
210
+ # dean:
211
+ # name: "Prof. Dr. Dekan Fakultas, M.Sc."
212
+ # nip: "196803031992031003"
213
+ # role: "Dekan Fakultas"
214
+
215
+ # Aktifkan blok abstrak di bawah ini HANYA JIKA pengguna meminta Abstrak:
216
+ # abstract_id: |
217
+ # Teks abstrak bahasa Indonesia (150-250 kata)...
218
+ # keywords_id: ["Kata Kunci 1", "Kata Kunci 2", "Kata Kunci 3"]
219
+ # abstract_en: |
220
+ # English abstract text (150-250 words)...
221
+ # keywords_en: ["Keyword 1", "Keyword 2", "Keyword 3"]
222
+ ...
223
+ ```
224
+
225
+ ### 2. Format `cover.md` (Wajib Menyertakan Gate `opt-daftar-gambar` & `opt-daftar-tabel`)
226
+ Halaman sampul luar, Lembar Pengesahan, dan Abstrak dirender otomatis oleh `template.typ` dan `docx.lua` dari `metadata.yml`. Berkas `cover.md` berisi **Kata Pengantar** serta blok transisi *front-matter* ke *main-body*:
227
+
228
+ ````markdown
229
+ # KATA PENGANTAR {-}
230
+
231
+ Puji syukur ke hadirat Tuhan Yang Maha Esa atas segala rahmat dan karunia-Nya sehingga penulis dapat menyelesaikan penyusunan laporan yang berjudul **"[Judul Laporan]"** dengan baik dan tepat waktu.
232
+
233
+ [Tuliskan 2–3 paragraf kata pengantar yang menyebutkan tujuan penyusunan, ucapan terima kasih kepada Dosen Pengampu/Pembimbing serta pihak institusi, dan harapan manfaat laporan].
234
+
235
+ ```{=typst}
236
+ #v(0.8cm)
237
+ #align(right)[
238
+ [Kota, Bulan Tahun]
239
+
240
+ #v(1cm)
241
+ Penulis
242
+ ]
243
+ #pagebreak()
244
+ #outline(
245
+ title: [#align(center)[#text(size: 14pt, weight: "bold")[DAFTAR ISI]]],
246
+ depth: 3,
247
+ )
248
+ #context {
249
+ if opt-daftar-gambar {
250
+ let imgs = query(figure.where(kind: image))
251
+ if imgs.len() > 0 {
252
+ pagebreak()
253
+ outline(
254
+ title: align(center)[#text(size: 14pt, weight: "bold")[DAFTAR GAMBAR]],
255
+ target: figure.where(kind: image),
256
+ )
257
+ }
258
+ }
259
+ if opt-daftar-tabel {
260
+ let tbls = query(figure.where(kind: table))
261
+ if tbls.len() > 0 {
262
+ pagebreak()
263
+ outline(
264
+ title: align(center)[#text(size: 14pt, weight: "bold")[DAFTAR TABEL]],
265
+ target: figure.where(kind: table),
266
+ )
267
+ }
268
+ }
269
+ }
270
+ #pagebreak()
271
+ #set page(numbering: "1")
272
+ #counter(page).update(1)
273
+ ```
274
+
275
+ ```{=openxml}
276
+ <w:p><w:pPr><w:jc w:val="right"/><w:spacing w:before="454"/></w:pPr><w:r><w:t>[Kota, Bulan Tahun]</w:t></w:r></w:p>
277
+ <w:p><w:pPr><w:jc w:val="right"/><w:spacing w:before="567"/></w:pPr><w:r><w:t>Penulis</w:t></w:r></w:p>
278
+ ```
279
+ ````
280
+
281
+ > [!WARNING]
282
+ > **JANGAN PERNAH** menghapus blok `#context { if opt-daftar-gambar ... }` atau mengubahnya menjadi query tanpa syarat. Blok tersebut dikendalikan langsung oleh flag `daftar_gambar` dan `daftar_tabel` di `metadata.yml`.
283
+
284
+ ### 3. Penulisan Bab di `chapters/bab*.md` & Standar Bahasa Ilmiah
285
+ Buat berkas terpisah per bab (`bab1-pendahuluan.md`, `bab2-tinjauan-pustaka.md`, dst.):
286
+ - **Gaya Bahasa Akademik Indonesia (PUEBI / EYD V)**:
287
+ - Gunakan kalimat pasif-objektif (*"Sistem dirancang menggunakan..."*, *"Data dianalisis melalui..."*, **"Penulis"**). **DILARANG** menggunakan kata ganti orang pertama/kedua (*"saya"*, *"aku"*, *"kami"*, *"kita"*, *"kamu"*).
288
+ - **Bebas Klise AI (*Zero AI-Slop*)**: Hindari pembuka klise seperti *"Di era globalisasi / revolusi industri 4.0 yang berkembang pesat saat ini..."* atau *"Tidak dapat dipungkiri lagi bahwa..."*. Langsung masuk ke fakta teknis, urgensi masalah, data kuantitatif, dan konteks spesifik.
289
+ - **Aturan Heading (Sangat Penting)**:
290
+ - Level 1 (Judul Bab): `# PENDAHULUAN` (Jangan tulis `# BAB I PENDAHULUAN` karena engine otomatis menambahkan `BAB I`).
291
+ - Level 2 (Sub-Bab): `## Latar Belakang` (Jangan tulis `## 1.1 Latar Belakang` karena engine otomatis menambahkan nomor `1.1.` atau `1.1`).
292
+ - Level 3 (Sub-Sub-Bab): `### Identifikasi Masalah` (Jangan tulis `### 1.1.1 Identifikasi Masalah`).
293
+ - **Aturan Tabel, Gambar, Matematika & Karakter Khusus**:
294
+ - **Tabel**: Gunakan *Pipe Table* standar Markdown dengan baris header dan pemisah `|---|---|`.
295
+ - **Gambar**: `![Keterangan Gambar](gambar/nama-file.png)` — hanya rujuk file gambar yang benar-benar ada di disk!
296
+ - **Simbol Mata Uang**: Selalu *escape* tanda dolar (`\$100` atau tulis `100 USD` / `Rp100.000`) agar tidak dianggap sebagai pembuka rumus matematika `$...$`.
297
+ - **Rumus Matematika**: Inline `$f(x) = wx + b$` atau blok `$$MSE = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2$$`.
298
+ - **Larangan Box-Drawing**: **DILARANG KERAS** menggunakan karakter gambar kotak Unicode (`├`, `─`, `└`, `│`, `┌`, `┐`) karena merusak parser dan gagal pada audit `doctor`. Gunakan daftar poin Markdown atau diagram ASCII `+---+`, `|`, `---`.
299
+
300
+ ### 4. Integritas Daftar Pustaka (`references.bib`) — Anti-Halusinasi
301
+ - **DILARANG MENGARANG SITASI PALSU**: Jangan pernah membuat judul jurnal, nama penulis, atau DOI fiktif.
302
+ - Jika tool MCP `laporan_citations` tersedia, gunakan `action: "search_doi"` untuk mencari literatur nyata di Crossref dan `action: "add_citation"` untuk mengambil BibTeX resmi.
303
+ - Gunakan sintaks sitasi Pandoc di dalam teks bab: `[@citekey]` atau naratif `@citekey`. Pastikan setiap `@citekey` di dalam teks terdaftar di `references.bib`, dan setiap entri di `references.bib` disitir di dalam teks (sehingga 0 *missing keys* dan 0 *orphan keys*).
304
+
305
+ ================================================================================
306
+ ## STEP 5 — AUDIT PRA-KOMPILASI (`DOCTOR`) & BUILD DOKUMEN
307
+
308
+ Setelah seluruh berkas selesai ditulis, jalankan verifikasi dan kompilasi:
309
+
310
+ 1. **Jalankan Audit Kesehatan Dokumen**:
311
+ - Panggil MCP tool `laporan_doctor` atau jalankan `./laporan doctor` (Linux/macOS) / `.\laporan.ps1 doctor` (Windows).
312
+ - Pastikan **0 Error** dan **0 Warning** (tidak ada sitasi hilang, tidak ada gambar rusak, tidak ada penomoran heading manual, tidak ada karakter box-drawing).
313
+ 2. **Kompilasi Dokumen PDF & Word (DOCX)**:
314
+ - Panggil MCP tool `laporan_build({ format: "all" })` atau jalankan `./laporan build` / `.\laporan.ps1 build`.
315
+ 3. **Laporkan Hasil kepada Pengguna**:
316
+ Tampilkan ringkasan akhir:
317
+ - Lokasi berkas hasil kompilasi: `Laporan.pdf` dan `Laporan.docx`
318
+ - Ringkasan metrik dokumen dari `./laporan stats` (total kata, jumlah bab, jumlah sitasi, estimasi halaman)
319
+ - Petunjuk perintah lanjutan (`./laporan view`, `./laporan bundle`, `./laporan preset apply <id>`).
@@ -17,16 +17,15 @@ File `template.typ` merupakan jantung dari pemformatan visual PDF pada **Laporan
17
17
  ```typst
18
18
  #set page(
19
19
  paper: "a4",
20
- margin: (top: 2cm, bottom: 3cm, left: 2.5cm, right: 2.5cm),
20
+ margin: doc-margin,
21
+ numbering: none,
21
22
  )
22
23
  #set text(font: "Libertinus Serif", size: 12pt)
23
- #set par(justify: true, leading: 1.5em)
24
+ #set par(justify: true, leading: 0.75em, first-line-indent: 1.25cm)
24
25
  ```
25
- * Margin Kiri & Kanan: 2.5 cm
26
- * Margin Atas: 2.0 cm
27
- * Margin Bawah: 3.0 cm
28
- * Spasi Antar Baris: 1.5 spasi (*one half spacing*)
29
- * Paragraf rata kanan-kiri (*justify*)
26
+ * Margin Default (`standard`): Atas 2.0 cm, Bawah 3.0 cm, Kiri 2.5 cm, Kanan 2.5 cm (atau mengikuti `presets/*.yml` aktif).
27
+ * Spasi Antar Baris: `0.75em` (setara 1.5 spasi di Typst).
28
+ * Paragraf rata kanan-kiri (*justify*) dengan indentasi baris pertama `1.25cm`.
30
29
 
31
30
  ---
32
31
 
@@ -36,28 +35,35 @@ File `template.typ` merupakan jantung dari pemformatan visual PDF pada **Laporan
36
35
  ```typst
37
36
  #set heading(numbering: (..ns) => {
38
37
  if ns.len() == 1 {
39
- "BAB " + numbering("I", ns.at(0)) + linebreak()
38
+ if chapter-prefix != "" {
39
+ chapter-prefix + format-chapter-num(ns.at(0))
40
+ } else {
41
+ format-chapter-num(ns.at(0))
42
+ }
40
43
  } else if ns.len() == 2 {
41
- numbering("1.1", ..ns)
44
+ numbering("1.1.", ..ns)
42
45
  } else {
43
46
  numbering("1.1.1", ..ns)
44
47
  }
45
48
  })
46
49
  ```
47
- * **Bab**: Diformat dengan Angka Romawi (`BAB I`, `BAB II`, `BAB III`, dst). Angka Romawi dan judul dipisahkan oleh *line break*.
48
- * **Sub-bab**: Diformat dengan Angka Arab (`1.1`, `1.2`, `2.1`).
50
+ * **Bab**: Diformat dengan Angka Romawi (`BAB I`, `BAB II`, `BAB III`, dst) atau Angka Arab sesuai preset (`heading_chapter_num_format`). Nomor bab dan judul dipisahkan oleh *line break* pada `#show heading.where(level: 1)`.
51
+ * **Sub-bab**: Diformat dengan Angka Arab (`1.1.`, `1.2.`, `2.1.`) sesuai flag `heading_sub_dot`.
49
52
  * **Sub-sub-bab**: Diformat dengan Angka Arab 3 tingkat (`1.1.1`, `1.1.2`).
50
53
  * **Heading tanpa nomor** (Kata Pengantar, Daftar Isi, Daftar Pustaka): menggunakan `{-}` di Markdown yang diterjemahkan Pandoc menjadi `#heading(level: 1, numbering: none)`.
51
54
 
52
55
  > **Catatan**: Jangan menulis pola `"BAB I"` langsung sebagai format string `numbering(...)`. Typst menginterpretasikan rangkaian huruf `BAB` sebagai pola huruf dan memotong angka Romawinya. Selalu concat literal secara manual: `"BAB " + numbering("I", n)`.
53
56
 
54
57
  ### 2. Penomoran Halaman (frontmatter vs mainmatter)
55
- * **Bagian Depan** (Kata Pengantar, Daftar Isi): Menggunakan penomoran Romawi kapital (`I`, `II`, `III`) di bagian tengah bawah. Diatur di `cover.md`:
58
+ * **Bagian Depan** (Lembar Pengesahan, Abstrak, Kata Pengantar, Daftar Isi): Menggunakan penomoran Romawi kecil (`i`, `ii`, `iii`) di bagian tengah bawah. Diatur di `template.typ` tepat setelah sampul depan:
56
59
  ```typst
57
- #set page(numbering: "I")
60
+ #pagebreak()
61
+ #set page(numbering: "i")
62
+ #counter(page).update(1)
58
63
  ```
59
- * **Bagian Utama** (BAB I hingga BAB V): Menggunakan penomoran Angka Arab (`1`, `2`, `3`) berurutan, di-reset ulang:
64
+ * **Bagian Utama** (BAB I hingga BAB V & Daftar Pustaka): Menggunakan penomoran Angka Arab (`1`, `2`, `3`) berurutan, di-reset ulang di akhir `cover.md`:
60
65
  ```typst
66
+ #pagebreak()
61
67
  #set page(numbering: "1")
62
68
  #counter(page).update(1)
63
69
  ```
@@ -44,26 +44,30 @@ reference-docx:
44
44
  @command -v python3 >/dev/null 2>&1 || { echo "ERROR: python3 not found"; exit 1; }
45
45
  @mkdir -p tmp
46
46
  pandoc --print-default-data-file reference.docx > tmp/ref-default.docx
47
- python3 scripts/make-reference-docx.py tmp/ref-default.docx reference.docx
47
+ python3 scripts/make-reference-docx.py tmp/ref-default.docx templates/default/reference.docx
48
48
  @rm -f tmp/ref-default.docx
49
49
 
50
50
  html:
51
- @if [ ! -d chapters ]; then \
51
+ @SRC_DIR="."; \
52
+ if [ ! -d "$$SRC_DIR/chapters" ] && [ -d "templates/default/chapters" ]; then \
53
+ SRC_DIR="templates/default"; \
54
+ fi; \
55
+ if [ ! -d "$$SRC_DIR/chapters" ]; then \
52
56
  echo "ERROR: Direktori chapters/ tidak ditemukan."; \
53
57
  exit 1; \
54
58
  fi; \
55
- PRESET=$$(grep -E '^[[:space:]]*(preset|margin_preset):' metadata.yml 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '\"'\''\r\n '); \
59
+ PRESET=$$(grep -E '^[[:space:]]*(preset|margin_preset):' "$$SRC_DIR/metadata.yml" 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '\"'\''\r\n '); \
56
60
  PRESET_FILE=""; \
57
61
  if [ -n "$$PRESET" ] && [ -f "presets/$${PRESET}.yml" ]; then \
58
62
  PRESET_FILE="--metadata-file=presets/$${PRESET}.yml"; \
59
63
  elif [ -f "presets/standard.yml" ]; then \
60
64
  PRESET_FILE="--metadata-file=presets/standard.yml"; \
61
65
  fi; \
62
- pandoc chapters/bab*.md \
66
+ pandoc "$$SRC_DIR"/chapters/bab*.md \
63
67
  $$PRESET_FILE \
64
- --metadata-file=metadata.yml \
65
- --citeproc --bibliography=references.bib \
66
- --csl=apa.csl \
68
+ --metadata-file="$$SRC_DIR/metadata.yml" \
69
+ --citeproc --bibliography="$$SRC_DIR/references.bib" \
70
+ --csl="$$SRC_DIR/apa.csl" \
67
71
  --metadata=reference-section-title="DAFTAR PUSTAKA" \
68
72
  --top-level-division=chapter \
69
73
  --standalone --toc \
@@ -3,9 +3,11 @@ set -e
3
3
 
4
4
  DIR="$(cd "$(dirname "$0")" && pwd)"
5
5
  if [ -n "$1" ]; then
6
- OUTDIR="$1"
6
+ OUTDIR="$(cd "$1" && pwd)"
7
7
  elif [ -f "$(pwd)/metadata.yml" ] && [ -d "$(pwd)/chapters" ]; then
8
8
  OUTDIR="$(pwd)"
9
+ elif [ -f "$DIR/templates/default/metadata.yml" ] && [ -d "$DIR/templates/default/chapters" ]; then
10
+ OUTDIR="$DIR/templates/default"
9
11
  else
10
12
  OUTDIR="$DIR"
11
13
  fi
@@ -29,6 +31,7 @@ trap 'rm -rf "$TMPDIR"' EXIT
29
31
 
30
32
  FALLBACK_DIRS=(
31
33
  "$OUTDIR"
34
+ "$DIR/templates/default"
32
35
  "$DIR"
33
36
  "$HOME/.agents/skills/laporan-generator/resources"
34
37
  )
@@ -3,9 +3,11 @@ set -e
3
3
 
4
4
  DIR="$(cd "$(dirname "$0")" && pwd)"
5
5
  if [ -n "$1" ]; then
6
- OUTDIR="$1"
6
+ OUTDIR="$(cd "$1" && pwd)"
7
7
  elif [ -f "$(pwd)/metadata.yml" ] && [ -d "$(pwd)/chapters" ]; then
8
8
  OUTDIR="$(pwd)"
9
+ elif [ -f "$DIR/templates/default/metadata.yml" ] && [ -d "$DIR/templates/default/chapters" ]; then
10
+ OUTDIR="$DIR/templates/default"
9
11
  else
10
12
  OUTDIR="$DIR"
11
13
  fi
@@ -16,6 +18,7 @@ trap 'rm -rf "$TMPDIR"' EXIT
16
18
 
17
19
  FALLBACK_DIRS=(
18
20
  "$OUTDIR"
21
+ "$DIR/templates/default"
19
22
  "$DIR"
20
23
  "$HOME/.agents/skills/laporan-generator/resources"
21
24
  )