laporan-generator 3.0.0 → 3.1.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 (59) hide show
  1. package/.agents/skills/laporan-generator/SKILL.md +11 -2
  2. package/.agents/skills/laporan-generator/references/campus-guide.md +24 -0
  3. package/.agents/skills/laporan-generator/references/metadata-schema.md +8 -3
  4. package/.agents/skills/laporan-generator/references/metadata.schema.json +221 -0
  5. package/.agents/skills/laporan-generator/references/preset-schema.md +7 -2
  6. package/.agents/skills/laporan-generator/references/prompt.md +81 -5
  7. package/.agents/skills/laporan-generator/references/syntax-cheatsheet.md +9 -9
  8. package/.agents/skills/laporan-generator/references/troubleshooting.md +36 -0
  9. package/.agents/skills/laporan-generator/resources/Makefile +13 -1
  10. package/.agents/skills/laporan-generator/resources/build-docx.sh +42 -16
  11. package/.agents/skills/laporan-generator/resources/build.sh +46 -25
  12. package/.agents/skills/laporan-generator/resources/chapters/bab4-hasil-dan-pembahasan.md +2 -2
  13. package/.agents/skills/laporan-generator/resources/chapters/bab5-penutup.md +10 -12
  14. package/.agents/skills/laporan-generator/resources/docx.lua +38 -0
  15. package/.agents/skills/laporan-generator/resources/laporan +182 -85
  16. package/.agents/skills/laporan-generator/resources/laporan.ps1 +71 -26
  17. package/.agents/skills/laporan-generator/resources/presets/jurnal-standar.yml +20 -0
  18. package/.agents/skills/laporan-generator/resources/presets/jurnal-uajy.yml +20 -0
  19. package/.agents/skills/laporan-generator/resources/scripts/audit-forensics.py +300 -0
  20. package/.agents/skills/laporan-generator/resources/scripts/test_scripts.py +60 -5
  21. package/.agents/skills/laporan-generator/resources/scripts/verify-citations.py +214 -0
  22. package/.agents/skills/laporan-generator/resources/template.typ +93 -23
  23. package/.agents/skills/laporan-generator/scripts/audit-forensics.py +300 -0
  24. package/.agents/skills/laporan-generator/scripts/build-docx.sh +42 -16
  25. package/.agents/skills/laporan-generator/scripts/build.sh +46 -25
  26. package/.agents/skills/laporan-generator/scripts/laporan +182 -85
  27. package/.agents/skills/laporan-generator/scripts/laporan.ps1 +71 -26
  28. package/.agents/skills/laporan-generator/scripts/test_scripts.py +60 -5
  29. package/.agents/skills/laporan-generator/scripts/verify-citations.py +214 -0
  30. package/Makefile +13 -1
  31. package/README.md +95 -11
  32. package/bin/laporan-generator.js +122 -19
  33. package/build-docx.sh +42 -16
  34. package/build.sh +46 -25
  35. package/completions/laporan.bash +46 -0
  36. package/completions/laporan.fish +38 -0
  37. package/completions/laporan.zsh +95 -0
  38. package/docs/campus-guide.md +24 -0
  39. package/docs/metadata-schema.md +8 -3
  40. package/docs/metadata.schema.json +221 -0
  41. package/docs/preset-schema.md +7 -2
  42. package/docs/prompt.md +81 -5
  43. package/docs/syntax-cheatsheet.md +9 -9
  44. package/docs/troubleshooting.md +36 -0
  45. package/laporan +182 -85
  46. package/laporan.ps1 +71 -26
  47. package/lib/init.js +53 -8
  48. package/lib/mcp.js +60 -5
  49. package/package.json +4 -1
  50. package/presets/jurnal-standar.yml +20 -0
  51. package/presets/jurnal-uajy.yml +20 -0
  52. package/scripts/audit-forensics.py +300 -0
  53. package/scripts/test_scripts.py +60 -5
  54. package/scripts/verify-citations.py +214 -0
  55. package/templates/default/chapters/bab4-hasil-dan-pembahasan.md +2 -2
  56. package/templates/default/chapters/bab5-penutup.md +10 -12
  57. package/templates/default/docx.lua +38 -0
  58. package/templates/default/ieee.csl +519 -0
  59. package/templates/default/template.typ +93 -23
@@ -33,9 +33,12 @@ When available in your environment, **always prefer calling the native MCP tools
33
33
  | :--- | :--- | :--- |
34
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
+ | **Forensic AI & Anti-Slop** | `laporan_audit({ target_dir, fail_on_ai, threshold })` | `./laporan audit` or `npx laporan-generator audit` |
37
+ | **Verify Citation DOIs** | `laporan_verify_citations({ bib_file, offline })` | `./laporan citations verify` or `npx laporan-generator citations verify` |
36
38
  | **Document Stats & Metrics** | `laporan_stats({ target_dir })` | `./laporan stats` or `npx laporan-generator stats --json` |
37
39
  | **Inspect Campus Presets** | `laporan_presets({ action: "list" \| "get", preset_name })` | `./laporan preset list` |
38
40
  | **Search & Add Citations** | `laporan_citations({ action: "search_doi" \| "get_bibtex" \| "add_citation" \| "validate", query, doi, bibtex })` | Manual edit `references.bib` |
41
+ | **Ingest External Docs** | `laporan_import({ source_file, target_dir })` | `./laporan import <file>` |
39
42
  | **Compile PDF & DOCX** | `laporan_build({ target_dir, format: "all" \| "pdf" \| "docx" })` | `./laporan build` or `npx laporan-generator build` |
40
43
 
41
44
  --------------------------------------------------------------------------------
@@ -49,7 +52,8 @@ Identify the document type and target university:
49
52
  1. **Tugas Akhir / Skripsi / Tesis**: Formal 5-chapter structure (BAB I - BAB V), bilingual abstract, approval sheet, standard university margins.
50
53
  2. **Laporan Magang / PKL / KKN**: Company profile, department scope, implemented system/project, troubleshooting analysis, recommendations.
51
54
  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
- 4. **Target University Preset**:
55
+ 4. **Artikel Jurnal Ilmiah / Paper Jurnal**: IMRaD format, single-page header, IEEE / APA citation, no standalone cover/TOC (`doc_type: "journal"`).
56
+ 5. **Target University & Journal Preset**:
53
57
  - `skripsi-4433`: National Standard (Top 4cm, Left 4cm, Bottom 3cm, Right 3cm).
54
58
  - `ui-skripsi`: Universitas Indonesia (Left 4cm, Top/Right/Bottom 3cm).
55
59
  - `itb-ta`: Institut Teknologi Bandung (Pedoman TA ITB 4-4-3-3, Minimalist Cover).
@@ -61,6 +65,8 @@ Identify the document type and target university:
61
65
  - `unair-skripsi`: Universitas Airlangga (4-4-3-3).
62
66
  - `ipb-ppki`: IPB University - Pedoman PPKI (Left 4cm, Top/Right/Bottom 3cm, 1cm indent).
63
67
  - `telkom-ta`: Telkom University (Left 4cm, Top/Right/Bottom 3cm).
68
+ - `jurnal-uajy`: Universitas Atma Jaya Yogyakarta - JBI (Margin 3-3-3-3, 11pt, IEEE CSL, IMRaD).
69
+ - `jurnal-standar`: National Journal Standard (Margin 3-3-3-3, IMRaD, IEEE/APA).
64
70
  - `standard`: General University (Top 2cm, Bottom 3cm, Left 2.5cm, Right 2.5cm).
65
71
 
66
72
  ### Stage 2: Document Structure Confirmation & Scaffolding
@@ -107,7 +113,10 @@ When authoring content into `chapters/bab*.md`, strictly enforce **Indonesian St
107
113
  1. Run pre-flight health audit:
108
114
  - Call MCP tool `laporan_doctor` or run `./laporan doctor`.
109
115
  - Ensure `missing_keys` is 0 and `broken_images` is 0.
110
- 2. Compile both outputs:
116
+ 2. Run forensic stylometry & citation verification:
117
+ - Call MCP tool `laporan_verify_citations` or run `./laporan citations verify` to ensure DOI reachability.
118
+ - Call MCP tool `laporan_audit` or run `./laporan audit --fail-on-ai` to ensure natural cadence and AI probability $\le 15\%$.
119
+ 3. Compile both outputs:
111
120
  - Call MCP tool `laporan_build` or run `./laporan build`.
112
121
  - Produces:
113
122
  - `Laporan.pdf`: Pixel-perfect publication PDF rendered by Typst.
@@ -39,6 +39,8 @@ Atau gunakan bantuan CLI interaktif:
39
39
  | `unair-skripsi` | Universitas Airlangga (UNAIR) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Pedoman penulisan karya ilmiah UNAIR |
40
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
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 |
42
+ | `jurnal-uajy` | Univ. Atma Jaya Yogyakarta (UAJY) | 3.0 cm - 3.0 cm - 3.0 cm - 3.0 cm | Format Jurnal Berita Informatika (JBI), 11pt, spasi 1, IEEE CSL, IMRaD |
43
+ | `jurnal-standar` | Jurnal Nasional / SINTA | 3.0 cm - 3.0 cm - 3.0 cm - 3.0 cm | Format artikel jurnal nasional standar (IEEE/APA, tanpa cover/TOC) |
42
44
 
43
45
  ---
44
46
 
@@ -90,6 +92,28 @@ year: "2026"
90
92
  preset: "ugm-skripsi"
91
93
  ```
92
94
 
95
+ ### D. Format Artikel Jurnal UAJY (Jurnal Berita Informatika)
96
+ ```yaml
97
+ title: "RANCANG BANGUN PLATFORM INTERAKTIF BERBASIS WEB DENGAN METODE MULTIMEDIA DEVELOPMENT LIFE CYCLE"
98
+ author:
99
+ - name: "Mu'adz Hudzaifah"
100
+ nim: "24903460014"
101
+ affiliation: "Program Studi Informatika, Universitas Atma Jaya Yogyakarta"
102
+ email: "muadz@students.uajy.ac.id"
103
+ institution: "Universitas Atma Jaya Yogyakarta"
104
+ faculty: "Fakultas Teknologi Industri"
105
+ department: "Informatika"
106
+ year: "2026"
107
+ preset: "jurnal-uajy"
108
+ doc_type: "journal"
109
+ abstract_id: |
110
+ Penelitian ini merancang platform web interaktif menggunakan metode MDLC...
111
+ keywords_id: ["MDLC", "Web Platform", "Robotika"]
112
+ abstract_en: |
113
+ This study designs an interactive web platform using MDLC method...
114
+ keywords_en: ["MDLC", "Web Platform", "Robotics"]
115
+ ```
116
+
93
117
  ---
94
118
 
95
119
  ## 4. Mengganti Logo Kampus
@@ -61,16 +61,21 @@ daftar_tabel: false
61
61
  | `author` | List of Objects | **Ya** | Daftar penulis. Setiap entri memiliki `name` dan `nim`. |
62
62
  | `author[].name` | String | **Ya** | Nama lengkap mahasiswa / penyusun. |
63
63
  | `author[].nim` | String | **Ya** | Nomor Induk Mahasiswa (NIM / NPM / NISN). |
64
- | `lecturer` | String | **Ya** | Nama lengkap dan gelar Dosen / Guru Pengampu / Pembimbing. |
64
+ | `author[].affiliation` | String | Opsional | Afiliasi akademik atau departemen (wajib pada artikel jurnal). |
65
+ | `author[].email` | String | Opsional | Alamat surel penulis (ditampilkan pada blok header jurnal). |
66
+ | `lecturer` | String | **Ya** | Nama lengkap dan gelar Dosen / Guru Pengampu / Pembimbing (pada skripsi/laporan). |
65
67
  | `lecturer_label` | String | Opsional | Label peran dosen (default: `"Dosen Pengampu:"`, bisa `"Dosen Pembimbing:"`). |
66
- | `course` | String | **Ya** | Nama Mata Kuliah atau Jenis Karya Tulis. |
68
+ | `course` | String | Opsional | Nama Mata Kuliah atau Jenis Karya Tulis (diwajibkan untuk laporan tugas). |
67
69
  | `institution` | String | **Ya** | Nama Universitas, Institut, Politeknik, atau Sekolah. |
68
70
  | `faculty` | String | **Ya** | Nama Fakultas, Sekolah, atau Departemen. |
69
71
  | `department` | String | Opsional | Nama Program Studi atau Jurusan. |
70
72
  | `city` | String | Opsional | Kota tempat institusi berada (digunakan pada lembar pengesahan). |
71
73
  | `year` | String | **Ya** | Tahun Ajaran atau Tahun Kelulusan (contoh: `2026` atau `2025/2026`). |
72
74
  | `date` | String | Opsional | Bulan dan Tahun pembuatan (contoh: `Juli 2026`). |
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`). |
75
+ | `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`, `jurnal-uajy`, `jurnal-standar`). |
76
+ | `doc_type` | String | Opsional | Paradigma dokumen: `"thesis"` (default: ada sampul & TOC) atau `"journal"` (header langsung di halaman 1, tanpa sampul & TOC). |
77
+ | `citation_style` | String | Opsional | Gaya sitasi: `"apa"` (default skripsi) atau `"ieee"` (default jurnal). |
78
+ | `csl` | String | Opsional | Nama file CSL spesifik (`apa.csl` atau `ieee.csl`). |
74
79
  | `daftar_gambar` | Boolean | Opsional | Aktifkan halaman DAFTAR GAMBAR (`true`/`false`, default: `false`). |
75
80
  | `daftar_tabel` | Boolean | Opsional | Aktifkan halaman DAFTAR TABEL (`true`/`false`, default: `false`). |
76
81
  | `approval` | Object | Opsional | Konfigurasi Lembar Pengesahan (`city`, `date`, `supervisors[]`, `dean`). |
@@ -0,0 +1,221 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://raw.githubusercontent.com/muadzhdz/laporan-generator/main/docs/metadata.schema.json",
4
+ "title": "Laporan Generator Metadata Schema",
5
+ "description": "JSON Schema untuk validasi dan autocompletion metadata.yml pada Laporan Generator (v3.1.0)",
6
+ "type": "object",
7
+ "required": [
8
+ "title",
9
+ "author",
10
+ "institution",
11
+ "year"
12
+ ],
13
+ "properties": {
14
+ "title": {
15
+ "type": "string",
16
+ "description": "Judul utama laporan atau karya ilmiah"
17
+ },
18
+ "subtitle": {
19
+ "type": "string",
20
+ "description": "Sub-judul atau keterangan jenis laporan (opsional)"
21
+ },
22
+ "author": {
23
+ "type": "array",
24
+ "description": "Daftar penulis laporan atau artikel",
25
+ "minItems": 1,
26
+ "items": {
27
+ "type": "object",
28
+ "required": [
29
+ "name"
30
+ ],
31
+ "properties": {
32
+ "name": {
33
+ "type": "string",
34
+ "description": "Nama lengkap penulis"
35
+ },
36
+ "nim": {
37
+ "type": "string",
38
+ "description": "Nomor Induk Mahasiswa (NIM / NPM / NISN)"
39
+ },
40
+ "affiliation": {
41
+ "type": "string",
42
+ "description": "Afiliasi institusi / prodi penulis (khusus jurnal)"
43
+ },
44
+ "email": {
45
+ "type": "string",
46
+ "format": "email",
47
+ "description": "Alamat surel penulis (khusus jurnal)"
48
+ }
49
+ }
50
+ }
51
+ },
52
+ "lecturer": {
53
+ "type": "string",
54
+ "description": "Nama lengkap dan gelar dosen pengampu atau pembimbing"
55
+ },
56
+ "lecturer_label": {
57
+ "type": "string",
58
+ "default": "Dosen Pengampu:",
59
+ "description": "Label peran dosen pada halaman sampul"
60
+ },
61
+ "course": {
62
+ "type": "string",
63
+ "description": "Nama mata kuliah atau jenis proyek tugas akhir"
64
+ },
65
+ "institution": {
66
+ "type": "string",
67
+ "description": "Nama universitas, institut, politeknik, atau sekolah"
68
+ },
69
+ "faculty": {
70
+ "type": "string",
71
+ "description": "Nama fakultas atau sekolah tinggi"
72
+ },
73
+ "department": {
74
+ "type": "string",
75
+ "description": "Nama program studi atau departemen"
76
+ },
77
+ "city": {
78
+ "type": "string",
79
+ "description": "Kota lokasi institusi"
80
+ },
81
+ "year": {
82
+ "type": "string",
83
+ "description": "Tahun ajaran atau tahun kelulusan (contoh: 2026)"
84
+ },
85
+ "date": {
86
+ "type": "string",
87
+ "description": "Bulan dan tahun penyusunan (contoh: Juli 2026)"
88
+ },
89
+ "preset": {
90
+ "type": "string",
91
+ "default": "standard",
92
+ "enum": [
93
+ "standard",
94
+ "skripsi-4433",
95
+ "ui-skripsi",
96
+ "itb-ta",
97
+ "ugm-skripsi",
98
+ "its-skripsi",
99
+ "unpad-skripsi",
100
+ "ub-skripsi",
101
+ "undip-skripsi",
102
+ "unair-skripsi",
103
+ "ipb-ppki",
104
+ "telkom-ta",
105
+ "jurnal-uajy",
106
+ "jurnal-standar"
107
+ ],
108
+ "description": "ID preset format kampus atau standar jurnal ilmiah"
109
+ },
110
+ "doc_type": {
111
+ "type": "string",
112
+ "default": "thesis",
113
+ "enum": [
114
+ "thesis",
115
+ "journal"
116
+ ],
117
+ "description": "Paradigma dokumen: thesis (skripsi dengan sampul/TOC) atau journal (artikel IMRaD)"
118
+ },
119
+ "citation_style": {
120
+ "type": "string",
121
+ "default": "apa",
122
+ "enum": [
123
+ "apa",
124
+ "ieee"
125
+ ],
126
+ "description": "Gaya sitasi utama (apa atau ieee)"
127
+ },
128
+ "csl": {
129
+ "type": "string",
130
+ "default": "apa.csl",
131
+ "enum": [
132
+ "apa.csl",
133
+ "ieee.csl"
134
+ ],
135
+ "description": "Nama berkas CSL spesifik"
136
+ },
137
+ "daftar_gambar": {
138
+ "type": "boolean",
139
+ "default": false,
140
+ "description": "Aktifkan halaman DAFTAR GAMBAR pada front-matter"
141
+ },
142
+ "daftar_tabel": {
143
+ "type": "boolean",
144
+ "default": false,
145
+ "description": "Aktifkan halaman DAFTAR TABEL pada front-matter"
146
+ },
147
+ "abstract_id": {
148
+ "type": "string",
149
+ "description": "Teks ringkasan/abstrak Bahasa Indonesia"
150
+ },
151
+ "keywords_id": {
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string"
155
+ },
156
+ "description": "Daftar kata kunci Bahasa Indonesia"
157
+ },
158
+ "abstract_en": {
159
+ "type": "string",
160
+ "description": "Teks abstract Bahasa Inggris"
161
+ },
162
+ "keywords_en": {
163
+ "type": "array",
164
+ "items": {
165
+ "type": "string"
166
+ },
167
+ "description": "Daftar keywords Bahasa Inggris"
168
+ },
169
+ "approval": {
170
+ "type": "object",
171
+ "description": "Konfigurasi Lembar Pengesahan",
172
+ "properties": {
173
+ "city": {
174
+ "type": "string"
175
+ },
176
+ "date": {
177
+ "type": "string"
178
+ },
179
+ "supervisors": {
180
+ "type": "array",
181
+ "items": {
182
+ "type": "object",
183
+ "required": [
184
+ "name",
185
+ "role"
186
+ ],
187
+ "properties": {
188
+ "name": {
189
+ "type": "string"
190
+ },
191
+ "nip": {
192
+ "type": "string"
193
+ },
194
+ "role": {
195
+ "type": "string"
196
+ }
197
+ }
198
+ }
199
+ },
200
+ "dean": {
201
+ "type": "object",
202
+ "required": [
203
+ "name",
204
+ "role"
205
+ ],
206
+ "properties": {
207
+ "name": {
208
+ "type": "string"
209
+ },
210
+ "nip": {
211
+ "type": "string"
212
+ },
213
+ "role": {
214
+ "type": "string"
215
+ }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
@@ -45,6 +45,7 @@ cover_logo_width: 4.5cm # Lebar logo di sampul depan
45
45
  | **Identitas** | `preset_id` | String | *Nama file tanpa .yml* | ID unik preset (contoh: `ui-skripsi`). |
46
46
  | | `name` | String | - | Nama lengkap format / institusi. |
47
47
  | | `description` | String | - | Penjelasan singkat karakteristik preset. |
48
+ | | `doc_type` | String | `thesis` | Tipe dokumen (`thesis` atau `journal`). |
48
49
  | **Margin** | `margin_top` | String / Satuan | `2cm` | Jarak batas atas halaman. |
49
50
  | | `margin_bottom` | String / Satuan | `3cm` | Jarak batas bawah halaman. |
50
51
  | | `margin_left` | String / Satuan | `2.5cm` | Jarak batas kiri halaman (misal: `4cm` untuk jilid). |
@@ -53,10 +54,14 @@ cover_logo_width: 4.5cm # Lebar logo di sampul depan
53
54
  | | `font_size` | String / pt | `12pt` | Ukuran font teks isi. |
54
55
  | | `line_spacing` | String / em | `0.75em` | Jarak leading baris (0.75em = setara 1.5 line). |
55
56
  | | `first_line_indent` | String / cm | `1.25cm` | Lebar indentasi baris pertama paragraf. |
56
- | **Heading** | `heading_chapter_prefix` | String | `BAB ` | Awalan judul bab level 1. |
57
+ | **Heading** | `heading_chapter_prefix` | String | `BAB ` | Awalan judul bab level 1 (bisa kosong untuk jurnal). |
58
+ | | `heading_chapter_num_format` | String | `roman` | Format angka bab (`roman` atau `arabic`). |
57
59
  | | `heading_sub_dot` | Boolean | `true` | Apakah nomor sub-bab diakhiri titik (`1.1.` vs `1.1`). |
58
60
  | | `heading_subsub_dot` | Boolean | `false` | Apakah nomor sub-sub-bab diakhiri titik (`1.1.1`). |
59
- | **Cover** | `cover_show_lecturer` | Boolean | `true` | Tampilkan blok Dosen Pengampu di cover depan. |
61
+ | **Sitasi** | `citation_style` | String | `apa` | Gaya sitasi bawaan (`apa` atau `ieee`). |
62
+ | | `csl` | String | `apa.csl` | Berkas format CSL (`apa.csl` atau `ieee.csl`). |
63
+ | **Cover** | `cover_show` | Boolean | `true` | Apakah cover jilid ditampilkan (set `false` untuk jurnal). |
64
+ | | `cover_show_lecturer` | Boolean | `true` | Tampilkan blok Dosen Pengampu di cover depan. |
60
65
  | | `cover_logo_width` | String / cm | `4cm` | Lebar visual gambar logo di halaman cover. |
61
66
 
62
67
  ---
@@ -15,10 +15,13 @@ Generator ini bersifat **universal** dan mendukung berbagai jenis dokumen akadem
15
15
 
16
16
  1. **Prioritaskan Native MCP Tools** (jika tersedia di lingkungan agen AI seperti Antigravity, Claude Code, OpenCode, Cursor):
17
17
  - `laporan_init`: Inisialisasi proyek baru & konfigurasi `metadata.yml`.
18
- - `laporan_presets`: Melihat daftar dan detail 12 preset kampus resmi.
18
+ - `laporan_presets`: Melihat daftar dan detail 14 preset kampus & jurnal resmi.
19
19
  - `laporan_citations`: Mencari DOI/paper asli di Crossref API & menambahkan BibTeX ke `references.bib`.
20
+ - `laporan_verify_citations`: Memverifikasi keabsahan tautan DOI di `references.bib`.
20
21
  - `laporan_doctor`: Mengaudit integritas berkas, sitasi, gambar, dan sintaks.
22
+ - `laporan_audit`: Menganalisis metrik forensik stylometry (variansi panjang kalimat, MATTR, deteksi klise AI / anti-slop).
21
23
  - `laporan_stats`: Menghitung statistik kata, bab, dan estimasi halaman.
24
+ - `laporan_import`: Mengonversi materi `.docx`, `.pdf`, `.pptx`, `.xlsx` menjadi bab Markdown.
22
25
  - `laporan_build`: Mengompilasi dokumen menjadi `Laporan.pdf` dan `Laporan.docx`.
23
26
  2. **Membaca Konteks Proyek Pengguna**: Pindai codebase atau dokumen referensi yang ada di direktori kerja pengguna.
24
27
  3. **Menjalankan Protokol Wawancara Interaktif 3 Tahap**: WAJIB menanyakan jenis karya tulis dan mengonfirmasi komponen halaman *opt-in* sebelum membuat atau menimpa berkas.
@@ -109,8 +112,20 @@ Setelah pengguna memilih jenis dokumen, tampilkan rancangan susunan babnya:
109
112
  - BAB V: Penutup (Kesimpulan & Saran)
110
113
  - **Halaman Akhir**: Daftar Pustaka
111
114
 
115
+ #### E. [5] Artikel Ilmiah / Paper Jurnal (Format IMRaD Ringkas):
116
+ - **Halaman Depan (Single-Header, Tanpa Cover Terpisah)**:
117
+ - Judul Artikel Ilmiah, Baris Nama Penulis, Afiliasi Institusi, Alamat Surel, serta Abstrak Indonesia & Inggris beserta Kata Kunci langsung berada di **bagian atas Halaman 1**.
118
+ - **TIDAK ADA**: Sampul luar terpisah, Lembar Pengesahan, Kata Pengantar, maupun Daftar Isi.
119
+ - Berkas `cover.md` dikosongkan atau dilewati.
120
+ - **Batang Tubuh (IMRaD 4 Bagian)**:
121
+ - BAB I: Pendahuluan (`# PENDAHULUAN` -> otomatis bernomor seksi `1. PENDAHULUAN`)
122
+ - BAB II: Metode Penelitian (`# METODE PENELITIAN` -> otomatis bernomor seksi `2. METODE PENELITIAN`)
123
+ - BAB III: Hasil dan Pembahasan (`# HASIL DAN PEMBAHASAN` -> otomatis bernomor seksi `3. HASIL DAN PEMBAHASAN`)
124
+ - BAB IV: Kesimpulan (`# KESIMPULAN` -> otomatis bernomor seksi `4. KESIMPULAN`)
125
+ - **Halaman Akhir**: Daftar Pustaka (Format Sitasi Numerik IEEE `[1]`, `[2]`)
126
+
112
127
  **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?"*
128
+ > *"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? (Catatan: Untuk format Artikel Jurnal, halaman sampul, kata pengantar, dan daftar isi otomatis ditiadakan sesuai kaidah IMRaD)."*
114
129
 
115
130
  ---
116
131
 
@@ -134,6 +149,8 @@ Setelah struktur halaman disepakati, tanyakan informasi identitas dokumen:
134
149
  - `unair-skripsi`: Universitas Airlangga (Atas 4cm, Kiri 4cm, Bawah 3cm, Kanan 3cm)
135
150
  - `ipb-ppki`: IPB University - Pedoman PPKI (Kiri 4cm, Atas 3cm, Kanan 3cm, Bawah 3cm, Sub-bab tanpa titik akhir)
136
151
  - `telkom-ta`: Telkom University (Kiri 4cm, Atas 3cm, Kanan 3cm, Bawah 3cm)
152
+ - `jurnal-uajy`: Universitas Atma Jaya Yogyakarta - JBI (Margin 3-3-3-3, 11pt, IEEE CSL, IMRaD)
153
+ - `jurnal-standar`: Standar Publikasi Jurnal Nasional (Margin 3-3-3-3, IMRaD, IEEE/APA)
137
154
 
138
155
  ================================================================================
139
156
  ## STEP 3 — MATRIKS STRUKTUR BAB BERDASARKAN DOMAIN TEKNIS
@@ -222,6 +239,39 @@ daftar_tabel: false
222
239
  ...
223
240
  ```
224
241
 
242
+ #### Contoh Konfigurasi metadata.yml untuk Mode Artikel Jurnal (IMRaD / UAJY / SINTA):
243
+ ```yaml
244
+ ---
245
+ title: "Perancangan Simulasi 3D Web Interaktif Edukasi Robotika Menggunakan Luther-Sutopo MDLC"
246
+ doc_type: "journal"
247
+ preset: "jurnal-uajy"
248
+ citation_style: "ieee"
249
+ csl: "ieee.csl"
250
+ author:
251
+ - name: "Muadz"
252
+ nim: "220711854"
253
+ affiliation: "Program Studi Informatika, Universitas Atma Jaya Yogyakarta"
254
+ email: "muadz@mail.uajy.ac.id"
255
+ - name: "Dosen Pembimbing, M.T."
256
+ nim: "0512038001"
257
+ affiliation: "Program Studi Informatika, Universitas Atma Jaya Yogyakarta"
258
+ email: "pembimbing@mail.uajy.ac.id"
259
+ institution: "Universitas Atma Jaya Yogyakarta"
260
+ faculty: "Fakultas Teknologi Industri"
261
+ department: "Informatika"
262
+ year: "2026"
263
+ date: "November 2026"
264
+ daftar_gambar: false
265
+ daftar_tabel: false
266
+ abstract_id: |
267
+ Edukasi robotika memerlukan visualisasi interaktif tiga dimensi untuk memfasilitasi pemahaman kinematika...
268
+ keywords_id: ["Robotika", "Three.js", "MDLC", "WebGL"]
269
+ abstract_en: |
270
+ Robotics education requires interactive three-dimensional visualization to facilitate kinematic understanding...
271
+ keywords_en: ["Robotics", "Three.js", "MDLC", "WebGL"]
272
+ ...
273
+ ```
274
+
225
275
  ### 2. Format `cover.md` (Wajib Menyertakan Gate `opt-daftar-gambar` & `opt-daftar-tabel`)
226
276
  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
277
 
@@ -286,6 +336,29 @@ Buat berkas terpisah per bab (`bab1-pendahuluan.md`, `bab2-tinjauan-pustaka.md`,
286
336
  - **Gaya Bahasa Akademik Indonesia (PUEBI / EYD V)**:
287
337
  - Gunakan kalimat pasif-objektif (*"Sistem dirancang menggunakan..."*, *"Data dianalisis melalui..."*, **"Penulis"**). **DILARANG** menggunakan kata ganti orang pertama/kedua (*"saya"*, *"aku"*, *"kami"*, *"kita"*, *"kamu"*).
288
338
  - **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.
339
+
340
+ - **Protokol Forensik Stylometri & Rekayasa Human Cadence (Anti-AI-Slop)**:
341
+ Naskah yang disusun **WAJIB** lolos uji `./laporan audit --strict` dengan vonis **HUMAN CADENCE** (skor probabilitas AI $\le 15\%$). Patuhi 4 aturan metrik matematis berikut:
342
+ 1. **Variansi Panjang Kalimat ($CV \ge 0.42$)**: Rasio deviasi standar terhadap rata-rata panjang kalimat harus di atas 0.42. Hindari kalimat dengan panjang monoton (misal: 18–22 kata di semua kalimat).
343
+ 2. **Selisih Kalimat Berdekatan ($\Delta \ge 12.0$)**: Terapkan teknik *Sentence Burstiness*. Selingi kalimat pendek padat (5–10 kata) yang menyatakan fakta/kesimpulan dengan kalimat majemuk bertingkat (25–35 kata) yang membedah metodologi atau sebab-akibat.
344
+ 3. **Kekayaan Leksikal ($MATTR \ge 0.70$)**: Gunakan variasi istilah teknis yang kaya. Moving-Average Type-Token Ratio wajib di atas 0.70.
345
+ 4. **Batas Transisi Formulaik ($< 25\%$)**: Batasi kata transisi penghubung di awal kalimat (*selain itu*, *namun demikian*, *oleh karena itu*, *di sisi lain*, *dengan demikian*). Maksimal hanya 25% dari total kalimat dalam satu bab.
346
+
347
+ - **Daftar Hitam 38 Klise RLHF Terlarang & Alternatif Penggantinya**:
348
+ | Kata / Frasa Terlarang | Alasan Larangan | Alternatif Pengganti Alami |
349
+ |:---|:---|:---|
350
+ | *komprehensif* | Klise RLHF umum | *terperinci*, *lengkap*, *mendalam*, *mencakup seluruh variabel* |
351
+ | *menyeluruh* | Klise frekuensi tinggi | *secara sistematis*, *luas*, *pada seluruh aspek* |
352
+ | *secara signifikan* | Sering dipakai tanpa uji statistik | *secara terukur*, *substansial*, *dengan kenaikan nyata* |
353
+ | *krusial / pivotal* | Adjektiva hiperbolis | *penting*, *menentukan*, *fundamental* |
354
+ | *lanskap / landscape* | Metafora abstrak | *ranah*, *bidang*, *domain*, *ekosistem teknis* |
355
+ | *memainkan peran penting* | Kalimat pasif klise | *berkontribusi langsung*, *menjadi fondasi*, *menopang* |
356
+ | *tidak dapat dipungkiri* | Retorika tanpa data | *data menunjukkan*, *bukti empiris membuktikan* |
357
+ | *patut dicatat* | Filler pengisi ruang | *hasil observasi mencatat*, *temuan mengindikasikan* |
358
+ | *selaras dengan* | Klise penghubung | *sesuai dengan*, *konsisten terhadap*, *mengikuti kaidah* |
359
+ | *dalam era / di era* | Pembuka klise | Sebutkan tahun, standar protokol, atau kondisi teknis spesifik |
360
+ | *delve / tapestry / testament* | Klise bahasa Inggris khas LLM | Tulis fakta teknis langsung tanpa majas berlebihan |
361
+
289
362
  - **Aturan Heading (Sangat Penting)**:
290
363
  - Level 1 (Judul Bab): `# PENDAHULUAN` (Jangan tulis `# BAB I PENDAHULUAN` karena engine otomatis menambahkan `BAB I`).
291
364
  - Level 2 (Sub-Bab): `## Latar Belakang` (Jangan tulis `## 1.1 Latar Belakang` karena engine otomatis menambahkan nomor `1.1.` atau `1.1`).
@@ -303,16 +376,19 @@ Buat berkas terpisah per bab (`bab1-pendahuluan.md`, `bab2-tinjauan-pustaka.md`,
303
376
  - 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
377
 
305
378
  ================================================================================
306
- ## STEP 5 — AUDIT PRA-KOMPILASI (`DOCTOR`) & BUILD DOKUMEN
379
+ ## STEP 5 — AUDIT PRA-KOMPILASI (`DOCTOR` & `AUDIT`) & BUILD DOKUMEN
307
380
 
308
381
  Setelah seluruh berkas selesai ditulis, jalankan verifikasi dan kompilasi:
309
382
 
310
383
  1. **Jalankan Audit Kesehatan Dokumen**:
311
384
  - Panggil MCP tool `laporan_doctor` atau jalankan `./laporan doctor` (Linux/macOS) / `.\laporan.ps1 doctor` (Windows).
312
385
  - 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)**:
386
+ 2. **Jalankan Verifikasi Sitasi & Forensik Stylometry**:
387
+ - Panggil MCP tool `laporan_verify_citations` atau jalankan `./laporan citations verify` untuk memastikan seluruh DOI dapat dijangkau dan valid.
388
+ - Panggil MCP tool `laporan_audit` atau jalankan `./laporan audit --fail-on-ai` untuk memverifikasi variansi panjang kalimat, Moving-Average Type-Token Ratio (MATTR), dan memastikan skor AI di bawah ambang batas toleransi (maksimal 15%).
389
+ 3. **Kompilasi Dokumen PDF & Word (DOCX)**:
314
390
  - Panggil MCP tool `laporan_build({ format: "all" })` atau jalankan `./laporan build` / `.\laporan.ps1 build`.
315
- 3. **Laporkan Hasil kepada Pengguna**:
391
+ 4. **Laporkan Hasil kepada Pengguna**:
316
392
  Tampilkan ringkasan akhir:
317
393
  - Lokasi berkas hasil kompilasi: `Laporan.pdf` dan `Laporan.docx`
318
394
  - Ringkasan metrik dokumen dari `./laporan stats` (total kata, jumlah bab, jumlah sitasi, estimasi halaman)
@@ -4,17 +4,17 @@ Panduan referensi cepat sintaks Markdown yang kompatibel dan teruji untuk pipeli
4
4
 
5
5
  ---
6
6
 
7
- ## 1. Sitasi & Bibliografi (BibTeX APA)
7
+ ## 1. Sitasi & Bibliografi (BibTeX APA & IEEE)
8
8
 
9
- Daftar pustaka dikelola melalui `references.bib` dan format APA melalui `apa.csl`.
9
+ Daftar pustaka dikelola melalui `references.bib`. Format sitasi dipilih otomatis berdasarkan preset atau opsi `csl` (`apa.csl` untuk skripsi, `ieee.csl` untuk jurnal):
10
10
 
11
- | Sintaks Markdown | Hasil Tipografi | Keterangan |
12
- |---|---|---|
13
- | `[@knuth1984texbook]` | (Knuth, 1984) | Sitasi tanda kurung standar |
14
- | `@knuth1984texbook menyatakan bahwa...` | Knuth (1984) menyatakan bahwa... | Sitasi naratif dalam kalimat |
15
- | `[-@knuth1984texbook]` | (1984) | Hanya tahun penerbitan |
16
- | `[@apa2020manual, hal. 45]` | (American Psychological Association, 2020, hal. 45) | Sitasi dengan nomor halaman |
17
- | `[@apa2020manual; @pandoc2024]` | (American Psychological Association, 2020; Pandoc, 2024) | Multi-sitasi sekaligus |
11
+ | Sintaks Markdown | Hasil Tipografi (APA) | Hasil Tipografi (IEEE) | Keterangan |
12
+ |---|---|---|---|
13
+ | `[@knuth1984texbook]` | (Knuth, 1984) | [1] | Sitasi tanda kurung / numerik standar |
14
+ | `@knuth1984texbook menyatakan bahwa...` | Knuth (1984) menyatakan... | [1] menyatakan bahwa... | Sitasi naratif dalam kalimat |
15
+ | `[-@knuth1984texbook]` | (1984) | [1] | Hanya tahun penerbitan |
16
+ | `[@apa2020manual, hal. 45]` | (APA, 2020, hal. 45) | [2, p. 45] | Sitasi dengan nomor halaman |
17
+ | `[@apa2020manual; @pandoc2024]` | (APA, 2020; Pandoc, 2024) | [2], [3] | Multi-sitasi sekaligus |
18
18
 
19
19
  ---
20
20
 
@@ -103,3 +103,39 @@ Gunakan perintah `docker compose` yang sudah dikonfigurasi dengan variabel `UID/
103
103
  docker compose run --rm laporan-generator
104
104
  ```
105
105
  *(File `docker-compose.yml` pada project ini secara otomatis memetakan `user: "${UID:-1000}:${GID:-1000}"`)*.
106
+
107
+ ---
108
+
109
+ ## 6. Kegagalan Audit Forensik AI (Probabilitas AI Melebihi Batas)
110
+
111
+ ### Gejala Error:
112
+ ```text
113
+ GAGAL: Probabilitas konten AI (32.4%) melebihi batas toleransi 15.0%
114
+ ```
115
+
116
+ ### Penyebab:
117
+ Teks pada bab mengandung pola kalimat repetitif (*burstiness* rendah), variasi kosakata terbatas (*MATTR* rendah), atau memuat frasa klise RLHF (seperti *"Di era modern yang berkembang pesat...", "Hal ini tentu sangat krusial..."*).
118
+
119
+ ### Solusi:
120
+ 1. Jalankan `laporan audit` untuk melihat rincian metrik per bab dan frasa klise yang terdeteksi.
121
+ 2. Variasikan ritme kalimat: gabungkan kalimat pendek dan kalimat majemuk bertingkat secara alami.
122
+ 3. Hilangkan seluruh frasa pembuka klise; ganti dengan fakta empiris, data kuantitatif, atau observasi teknis langsung.
123
+
124
+ ---
125
+
126
+ ## 7. Verifikasi DOI CrossRef Timeout atau Gagal
127
+
128
+ ### Gejala Error:
129
+ ```text
130
+ [WARN] DOI tidak valid atau server tidak merespons (HTTP 404 / Timeout)
131
+ ```
132
+
133
+ ### Penyebab:
134
+ Koneksi internet bermasalah atau format DOI pada berkas `references.bib` salah (misalnya terdapat URL lengkap `https://doi.org/...` di dalam field `doi = { ... }`).
135
+
136
+ ### Solusi:
137
+ 1. Pastikan field `doi` hanya berisi identitas murni, contoh: `doi = {10.1109/CVPR.2016.90}` (tanpa prefix `https://doi.org/`).
138
+ 2. Untuk pengujian luring tanpa koneksi internet, gunakan flag `--offline`:
139
+ ```bash
140
+ ./laporan citations verify --offline
141
+ ```
@@ -1,4 +1,16 @@
1
- .PHONY: build clean lint-deps watch docx html crossref test docker-build init view reference-docx
1
+ .PHONY: build clean lint-deps watch docx html crossref test docker-build init view reference-docx doctor audit stats citations
2
+
3
+ doctor:
4
+ ./laporan doctor
5
+
6
+ audit:
7
+ ./laporan audit
8
+
9
+ stats:
10
+ ./laporan stats
11
+
12
+ citations:
13
+ ./laporan citations verify
2
14
 
3
15
  build:
4
16
  ./build.sh