laporan-generator 2.6.1

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 (109) hide show
  1. package/.agents/skills/laporan-generator/SKILL.md +132 -0
  2. package/.agents/skills/laporan-generator/agents/openai.yaml +3 -0
  3. package/.agents/skills/laporan-generator/references/campus-guide.md +120 -0
  4. package/.agents/skills/laporan-generator/references/metadata-schema.md +76 -0
  5. package/.agents/skills/laporan-generator/references/preset-schema.md +79 -0
  6. package/.agents/skills/laporan-generator/references/syntax-cheatsheet.md +122 -0
  7. package/.agents/skills/laporan-generator/references/template-guide.md +100 -0
  8. package/.agents/skills/laporan-generator/references/troubleshooting.md +105 -0
  9. package/.agents/skills/laporan-generator/resources/Makefile +90 -0
  10. package/.agents/skills/laporan-generator/resources/apa.csl +2273 -0
  11. package/.agents/skills/laporan-generator/resources/build-docx.sh +122 -0
  12. package/.agents/skills/laporan-generator/resources/build.sh +102 -0
  13. package/.agents/skills/laporan-generator/resources/chapters/bab1-pendahuluan.md +60 -0
  14. package/.agents/skills/laporan-generator/resources/chapters/bab2-tinjauan-pustaka.md +83 -0
  15. package/.agents/skills/laporan-generator/resources/chapters/bab3-metodologi.md +116 -0
  16. package/.agents/skills/laporan-generator/resources/chapters/bab4-hasil-dan-pembahasan.md +93 -0
  17. package/.agents/skills/laporan-generator/resources/chapters/bab5-penutup.md +27 -0
  18. package/.agents/skills/laporan-generator/resources/cover.md +50 -0
  19. package/.agents/skills/laporan-generator/resources/docx.lua +416 -0
  20. package/.agents/skills/laporan-generator/resources/laporan +464 -0
  21. package/.agents/skills/laporan-generator/resources/laporan.ps1 +552 -0
  22. package/.agents/skills/laporan-generator/resources/logo.jpg +0 -0
  23. package/.agents/skills/laporan-generator/resources/metadata.yml +35 -0
  24. package/.agents/skills/laporan-generator/resources/presets/itb-ta.yml +27 -0
  25. package/.agents/skills/laporan-generator/resources/presets/its-skripsi.yml +26 -0
  26. package/.agents/skills/laporan-generator/resources/presets/skripsi-4433.yml +26 -0
  27. package/.agents/skills/laporan-generator/resources/presets/standard.yml +26 -0
  28. package/.agents/skills/laporan-generator/resources/presets/ugm-skripsi.yml +26 -0
  29. package/.agents/skills/laporan-generator/resources/presets/ui-skripsi.yml +26 -0
  30. package/.agents/skills/laporan-generator/resources/presets/unpad-skripsi.yml +27 -0
  31. package/.agents/skills/laporan-generator/resources/reference.docx +0 -0
  32. package/.agents/skills/laporan-generator/resources/references.bib +115 -0
  33. package/.agents/skills/laporan-generator/resources/scripts/bundle.py +75 -0
  34. package/.agents/skills/laporan-generator/resources/scripts/docx-pagenum.py +192 -0
  35. package/.agents/skills/laporan-generator/resources/scripts/finalize-docx.py +291 -0
  36. package/.agents/skills/laporan-generator/resources/scripts/make-reference-docx.py +670 -0
  37. package/.agents/skills/laporan-generator/resources/scripts/report-doctor.py +211 -0
  38. package/.agents/skills/laporan-generator/resources/scripts/report-stats.py +149 -0
  39. package/.agents/skills/laporan-generator/resources/scripts/scan-preset.py +311 -0
  40. package/.agents/skills/laporan-generator/resources/scripts/setup-deps.ps1 +152 -0
  41. package/.agents/skills/laporan-generator/resources/scripts/setup-deps.sh +113 -0
  42. package/.agents/skills/laporan-generator/resources/scripts/test_scripts.py +128 -0
  43. package/.agents/skills/laporan-generator/resources/scripts/validate-preset.py +166 -0
  44. package/.agents/skills/laporan-generator/resources/template.typ +394 -0
  45. package/.agents/skills/laporan-generator/scripts/build.sh +78 -0
  46. package/.agents/skills/laporan-generator/scripts/bundle.py +75 -0
  47. package/.agents/skills/laporan-generator/scripts/docx-pagenum.py +192 -0
  48. package/.agents/skills/laporan-generator/scripts/finalize-docx.py +152 -0
  49. package/.agents/skills/laporan-generator/scripts/laporan +447 -0
  50. package/.agents/skills/laporan-generator/scripts/laporan.ps1 +529 -0
  51. package/.agents/skills/laporan-generator/scripts/make-reference-docx.py +630 -0
  52. package/.agents/skills/laporan-generator/scripts/report-doctor.py +211 -0
  53. package/.agents/skills/laporan-generator/scripts/report-stats.py +149 -0
  54. package/.agents/skills/laporan-generator/scripts/scan-preset.py +311 -0
  55. package/.agents/skills/laporan-generator/scripts/setup-deps.ps1 +152 -0
  56. package/.agents/skills/laporan-generator/scripts/setup-deps.sh +113 -0
  57. package/.agents/skills/laporan-generator/scripts/test_scripts.py +103 -0
  58. package/.agents/skills/laporan-generator/scripts/validate-preset.py +166 -0
  59. package/.agents/workflows/laporan-generator.md +8 -0
  60. package/LICENSE +21 -0
  61. package/Makefile +90 -0
  62. package/README.md +389 -0
  63. package/apa.csl +2273 -0
  64. package/bin/laporan-generator.js +71 -0
  65. package/build-docx.sh +122 -0
  66. package/build.sh +102 -0
  67. package/chapters/bab1-pendahuluan.md +60 -0
  68. package/chapters/bab2-tinjauan-pustaka.md +83 -0
  69. package/chapters/bab3-metodologi.md +116 -0
  70. package/chapters/bab4-hasil-dan-pembahasan.md +93 -0
  71. package/chapters/bab5-penutup.md +27 -0
  72. package/cover.md +50 -0
  73. package/docs/campus-guide.md +120 -0
  74. package/docs/metadata-schema.md +76 -0
  75. package/docs/preset-schema.md +79 -0
  76. package/docs/syntax-cheatsheet.md +122 -0
  77. package/docs/template-guide.md +100 -0
  78. package/docs/troubleshooting.md +105 -0
  79. package/docx.lua +416 -0
  80. package/laporan +464 -0
  81. package/laporan.ps1 +552 -0
  82. package/lib/init.js +118 -0
  83. package/lib/setup.js +33 -0
  84. package/lib/sync-hosts.js +194 -0
  85. package/lib/uninstall.js +123 -0
  86. package/logo.jpg +0 -0
  87. package/metadata.yml +35 -0
  88. package/package.json +65 -0
  89. package/presets/itb-ta.yml +27 -0
  90. package/presets/its-skripsi.yml +26 -0
  91. package/presets/skripsi-4433.yml +26 -0
  92. package/presets/standard.yml +26 -0
  93. package/presets/ugm-skripsi.yml +26 -0
  94. package/presets/ui-skripsi.yml +26 -0
  95. package/presets/unpad-skripsi.yml +27 -0
  96. package/reference.docx +0 -0
  97. package/references.bib +115 -0
  98. package/scripts/bundle.py +75 -0
  99. package/scripts/docx-pagenum.py +192 -0
  100. package/scripts/finalize-docx.py +291 -0
  101. package/scripts/make-reference-docx.py +670 -0
  102. package/scripts/report-doctor.py +211 -0
  103. package/scripts/report-stats.py +149 -0
  104. package/scripts/scan-preset.py +311 -0
  105. package/scripts/setup-deps.ps1 +152 -0
  106. package/scripts/setup-deps.sh +113 -0
  107. package/scripts/test_scripts.py +128 -0
  108. package/scripts/validate-preset.py +166 -0
  109. package/template.typ +394 -0
@@ -0,0 +1,464 @@
1
+ #!/usr/bin/env bash
2
+ # ==============================================================================
3
+ # Laporan Generator CLI Helper (./laporan)
4
+ # ==============================================================================
5
+ set -e
6
+
7
+ GREEN='\033[0;32m'
8
+ BLUE='\033[0;34m'
9
+ CYAN='\033[0;36m'
10
+ YELLOW='\033[1;33m'
11
+ RED='\033[0;31m'
12
+ BOLD='\033[1m'
13
+ NC='\033[0m'
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ cd "$SCRIPT_DIR"
17
+
18
+ # Resolve Python (handle WindowsApps stub redirector on Windows)
19
+ if ! command -v python3 >/dev/null 2>&1 || ! python3 -V >/dev/null 2>&1; then
20
+ if command -v python >/dev/null 2>&1 && python -V >/dev/null 2>&1; then
21
+ python3() { python "$@"; }
22
+ export -f python3 2>/dev/null || true
23
+ fi
24
+ fi
25
+ export PYTHONUTF8=1
26
+
27
+ show_banner() {
28
+ echo -e "${CYAN}${BOLD}"
29
+ echo " ========================================================"
30
+ echo " LAPORAN GENERATOR CLI v2.6.0 "
31
+ echo " Otomatisasi Dokumen Akademik (Typst + DOCX Engine) "
32
+ echo " ========================================================"
33
+ echo -e "${NC}"
34
+ }
35
+
36
+ show_help() {
37
+ show_banner
38
+ echo -e "${BOLD}Penggunaan:${NC} ./laporan <perintah>"
39
+ echo ""
40
+ echo -e "${BOLD}Perintah yang Tersedia:${NC}"
41
+ echo -e " ${GREEN}build${NC} Kompilasi PDF dan DOCX sekaligus"
42
+ echo -e " ${GREEN}pdf${NC} Kompilasi dokumen PDF (via Typst)"
43
+ echo -e " ${GREEN}docx${NC} Kompilasi dokumen Microsoft Word (.docx)"
44
+ echo -e " ${GREEN}init${NC} Wizard interaktif untuk konfigurasi awal metadata"
45
+ echo -e " ${GREEN}preset${NC} Kelola preset format kampus (list/show/apply/diff/validate)"
46
+ echo -e " ${GREEN}stats${NC} Analisis statistik kata, halaman, gambar, dan durasi baca"
47
+ echo -e " ${GREEN}doctor${NC} Audit kesehatan proyek (broken images, sitasi hilang, dll.)"
48
+ echo -e " ${GREEN}bundle${NC} Kemas seluruh laporan (PDF, DOCX, MD) menjadi arsip zip"
49
+ echo -e " ${GREEN}setup${NC} Pasang dependensi sistem otomatis (Linux, macOS, Nix, Docker)"
50
+ echo -e " ${GREEN}sync-skills${NC} Sinkronkan skill AI agent ke Antigravity, Claude, Gemini, Grok"
51
+ echo -e " ${GREEN}uninstall${NC} Hapus integrasi skill dan perintah AI agent dari seluruh sistem"
52
+ echo -e " ${GREEN}check${NC} Audit dependensi sistem dan struktur proyek"
53
+ echo -e " ${GREEN}test${NC} Jalankan suite pengujian otomatis (test.sh)"
54
+ echo -e " ${GREEN}view${NC} Buka dokumen Laporan.pdf di viewer"
55
+ echo -e " ${GREEN}watch${NC} Pantau perubahan berkas dan auto-rebuild (live)"
56
+ echo -e " ${GREEN}clean${NC} Bersihkan berkas output dan direktori sementara"
57
+ echo -e " ${GREEN}help${NC} Tampilkan panduan bantuan ini"
58
+ echo ""
59
+ echo -e "${YELLOW}Contoh:${NC}"
60
+ echo -e " ./laporan build"
61
+ echo -e " ./laporan preset list"
62
+ echo -e " ./laporan preset apply itb-ta"
63
+ }
64
+
65
+ cmd_check() {
66
+ show_banner
67
+ echo -e "${BLUE}${BOLD}[1/2] Memeriksa Dependensi Sistem...${NC}"
68
+
69
+ local all_ok=true
70
+
71
+ check_dep() {
72
+ local name="$1"
73
+ local cmd="$2"
74
+ local req="$3"
75
+ if command -v "$cmd" &>/dev/null; then
76
+ echo -e " [${GREEN}OK${NC}] $name ($cmd) terpasang: $(command -v "$cmd")"
77
+ else
78
+ if [ "$req" = "required" ]; then
79
+ echo -e " [${RED}FAIL${NC}] $name ($cmd) ${RED}TIDAK DITEMUKAN${NC} (Wajib)"
80
+ all_ok=false
81
+ else
82
+ echo -e " [${YELLOW}INFO${NC}] $name ($cmd) tidak ditemukan (Opsional, untuk auto-inject nomor halaman Word)"
83
+ fi
84
+ fi
85
+ }
86
+
87
+ check_dep "Pandoc" "pandoc" "required"
88
+ check_dep "Typst" "typst" "required"
89
+ check_dep "ImageMagick" "magick" "required" 2>/dev/null || check_dep "ImageMagick" "convert" "required"
90
+ check_dep "Python 3" "python3" "required"
91
+ check_dep "LibreOffice" "soffice" "optional"
92
+
93
+ echo ""
94
+ echo -e "${BLUE}${BOLD}[2/2] Memeriksa Berkas Proyek...${NC}"
95
+
96
+ check_file() {
97
+ local file="$1"
98
+ local desc="$2"
99
+ if [ -f "$file" ]; then
100
+ echo -e " [${GREEN}OK${NC}] $desc ($file)"
101
+ else
102
+ echo -e " [${RED}FAIL${NC}] $desc ($file) tidak ditemukan"
103
+ all_ok=false
104
+ fi
105
+ }
106
+
107
+ check_dir() {
108
+ local dir="$1"
109
+ local desc="$2"
110
+ if [ -d "$dir" ]; then
111
+ echo -e " [${GREEN}OK${NC}] $desc ($dir)"
112
+ else
113
+ echo -e " [${RED}FAIL${NC}] $desc ($dir) tidak ditemukan"
114
+ all_ok=false
115
+ fi
116
+ }
117
+
118
+ check_file "metadata.yml" "Metadata laporan"
119
+ check_file "cover.md" "Kata pengantar & outline"
120
+ check_file "template.typ" "Template Typst"
121
+ check_file "reference.docx" "Template Word"
122
+ check_file "references.bib" "Daftar pustaka"
123
+ check_dir "presets" "Direktori preset kampus"
124
+ check_dir "chapters" "Direktori bab laporan"
125
+
126
+ echo ""
127
+ if [ "$all_ok" = true ]; then
128
+ echo -e "${GREEN}${BOLD}Semua dependensi dan berkas proyek lengkap dan siap digunakan!${NC}"
129
+ else
130
+ echo -e "${RED}${BOLD}Ada beberapa komponen yang kurang. Silakan lengkapi sebelum build.${NC}"
131
+ echo -e "${YELLOW}Tips: Gunakan 'nix develop' atau Docker untuk instalasi instan.${NC}"
132
+ fi
133
+ }
134
+
135
+ cmd_preset() {
136
+ local subcmd="${1:-list}"
137
+ case "$subcmd" in
138
+ list)
139
+ show_banner
140
+ echo -e "${BLUE}${BOLD}Daftar Preset Format Kampus Tersedia:${NC}"
141
+ echo ""
142
+ if [ -d presets ]; then
143
+ for p in presets/*.yml; do
144
+ if [ -f "$p" ]; then
145
+ local pid
146
+ pid=$(basename "$p" .yml)
147
+ local pname
148
+ pname=$(grep -E '^[[:space:]]*name:' "$p" 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '"\r\n' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
149
+ local pdesc
150
+ pdesc=$(grep -E '^[[:space:]]*description:' "$p" 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '"\r\n' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
151
+ echo -e " * ${GREEN}${BOLD}$pid${NC} - ${BOLD}${pname:-$pid}${NC}"
152
+ if [ -n "$pdesc" ]; then
153
+ echo -e " ${pdesc}"
154
+ fi
155
+ echo ""
156
+ fi
157
+ done
158
+ else
159
+ echo -e "${RED}Direktori presets/ tidak ditemukan.${NC}"
160
+ fi
161
+ echo -e "${YELLOW}Perintah Terkait:${NC}"
162
+ echo -e " Pindai pedoman PDF : ${CYAN}./laporan preset scan <pedoman.pdf>${NC}"
163
+ echo -e " Lihat detail preset: ${CYAN}./laporan preset show <preset-id>${NC}"
164
+ echo -e " Bandingkan preset : ${CYAN}./laporan preset diff <preset-1> [preset-2]${NC}"
165
+ echo -e " Validasi preset : ${CYAN}./laporan preset validate [preset-id]${NC}"
166
+ echo -e " Terapkan preset : ${CYAN}./laporan preset apply <preset-id>${NC}"
167
+ ;;
168
+ scan)
169
+ local pdf_file="$2"
170
+ if [ -z "$pdf_file" ]; then
171
+ echo -e "${RED}Error: Masukkan path file PDF pedoman kampus.${NC}"
172
+ echo "Contoh: ./laporan preset scan /path/ke/pedoman.pdf"
173
+ exit 1
174
+ fi
175
+ if [ ! -f "$pdf_file" ]; then
176
+ echo -e "${RED}Error: Berkas '$pdf_file' tidak ditemukan.${NC}"
177
+ exit 1
178
+ fi
179
+ shift
180
+ python3 scripts/scan-preset.py "$@"
181
+ ;;
182
+ validate)
183
+ shift
184
+ if [ -n "$1" ]; then
185
+ local t="$1"
186
+ [ -f "presets/${t}.yml" ] && t="presets/${t}.yml"
187
+ python3 scripts/validate-preset.py "$t"
188
+ else
189
+ python3 scripts/validate-preset.py --all
190
+ fi
191
+ ;;
192
+ diff)
193
+ local p1="$2"
194
+ local p2="$3"
195
+ if [ -z "$p1" ]; then
196
+ echo -e "${RED}Error: Sebutkan setidaknya 1 preset untuk dibandingkan.${NC}"
197
+ echo "Contoh: ./laporan preset diff itb-ta ui-skripsi"
198
+ exit 1
199
+ fi
200
+ if [ ! -f "presets/${p1}.yml" ]; then
201
+ echo -e "${RED}Preset '${p1}' tidak ditemukan di folder presets/${NC}"
202
+ exit 1
203
+ fi
204
+ show_banner
205
+ if [ -n "$p2" ]; then
206
+ if [ ! -f "presets/${p2}.yml" ]; then
207
+ echo -e "${RED}Preset '${p2}' tidak ditemukan di folder presets/${NC}"
208
+ exit 1
209
+ fi
210
+ echo -e "${CYAN}${BOLD}Perbandingan Preset: ${p1} VS ${p2}${NC}"
211
+ echo "========================================================"
212
+ diff -u "presets/${p1}.yml" "presets/${p2}.yml" || true
213
+ else
214
+ local curr
215
+ curr=$(grep -E '^[[:space:]]*(preset|margin_preset):' metadata.yml 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '\"'\''\r\n ')
216
+ curr=${curr:-"standard"}
217
+ echo -e "${CYAN}${BOLD}Perbandingan: Aktif (${curr}) VS Target (${p1})${NC}"
218
+ echo "========================================================"
219
+ diff -u "presets/${curr}.yml" "presets/${p1}.yml" 2>/dev/null || true
220
+ fi
221
+ echo "========================================================"
222
+ ;;
223
+ show)
224
+ local target="$2"
225
+ if [ -z "$target" ]; then
226
+ echo -e "${RED}Error: Sebutkan ID preset. Contoh: ./laporan preset show itb-ta${NC}"
227
+ exit 1
228
+ fi
229
+ if [ -f "presets/${target}.yml" ]; then
230
+ show_banner
231
+ echo -e "${CYAN}${BOLD}Konfigurasi Preset: ${target}${NC}"
232
+ echo "--------------------------------------------------------"
233
+ cat "presets/${target}.yml"
234
+ echo "--------------------------------------------------------"
235
+ else
236
+ echo -e "${RED}Preset '${target}' tidak ditemukan di folder presets/${NC}"
237
+ exit 1
238
+ fi
239
+ ;;
240
+ apply)
241
+ local target="$2"
242
+ if [ -z "$target" ]; then
243
+ echo -e "${RED}Error: Sebutkan ID preset. Contoh: ./laporan preset apply itb-ta${NC}"
244
+ exit 1
245
+ fi
246
+ if [ ! -f "presets/${target}.yml" ]; then
247
+ echo -e "${RED}Preset '${target}' tidak ditemukan di presets/${NC}"
248
+ exit 1
249
+ fi
250
+ if [ ! -f "metadata.yml" ]; then
251
+ echo -e "${RED}metadata.yml tidak ditemukan. Jalankan './laporan init' terlebih dahulu.${NC}"
252
+ exit 1
253
+ fi
254
+ if grep -qE '^\s*preset:' metadata.yml; then
255
+ sed -i.bak -E "s/^\s*preset:.*/preset: \"$target\"/" metadata.yml && rm -f metadata.yml.bak
256
+ elif grep -qE '^\s*margin_preset:' metadata.yml; then
257
+ sed -i.bak -E "s/^\s*margin_preset:.*/preset: \"$target\"/" metadata.yml && rm -f metadata.yml.bak
258
+ elif grep -q '^\.\.\.' metadata.yml; then
259
+ sed -i.bak -E "s/^\.\.\./preset: \"$target\"\n.../" metadata.yml && rm -f metadata.yml.bak
260
+ else
261
+ echo "preset: \"$target\"" >> metadata.yml
262
+ fi
263
+ echo -e "${GREEN}${BOLD}[OK] Preset '${target}' berhasil diterapkan ke metadata.yml!${NC}"
264
+ ;;
265
+ *)
266
+ echo -e "${RED}Sub-perintah preset tidak dikenal: $subcmd${NC}"
267
+ echo "Gunakan: ./laporan preset [list | scan <file> | show <id> | diff <id> | validate | apply <id>]"
268
+ exit 1
269
+ ;;
270
+ esac
271
+ }
272
+
273
+ yaml_escape() {
274
+ local val="$1"
275
+ val="${val//\\/\\\\}"
276
+ val="${val//\"/\\\"}"
277
+ val="${val//$'\r'/}"
278
+ val="${val//$'\n'/ }"
279
+ echo -n "$val"
280
+ }
281
+
282
+ cmd_init() {
283
+ show_banner
284
+ echo -e "${CYAN}${BOLD}Wizard Konfigurasi Laporan Akademik${NC}"
285
+ echo "Isi data di bawah ini (tekan Enter untuk memakai nilai default):"
286
+ echo ""
287
+
288
+ read -rp "Judul Laporan [LAPORAN PROYEK AKADEMIK]: " in_title
289
+ in_title=${in_title:-"LAPORAN PROYEK AKADEMIK"}
290
+
291
+ read -rp "Subjudul [DOKUMENTASI DAN ANALISIS IMPLEMENTASI]: " in_subtitle
292
+ in_subtitle=${in_subtitle:-"DOKUMENTASI DAN ANALISIS IMPLEMENTASI"}
293
+
294
+ read -rp "Mata Kuliah [Proyek Perangkat Lunak]: " in_course
295
+ in_course=${in_course:-"Proyek Perangkat Lunak"}
296
+
297
+ read -rp "Dosen Pengampu [Dr. Nama Dosen, M.Kom.]: " in_lecturer
298
+ in_lecturer=${in_lecturer:-"Dr. Nama Dosen, M.Kom."}
299
+
300
+ read -rp "Nama Penulis 1 [Nama Mahasiswa]: " in_author
301
+ in_author=${in_author:-"Nama Mahasiswa"}
302
+
303
+ read -rp "NIM Penulis 1 [12345678]: " in_nim
304
+ in_nim=${in_nim:-"12345678"}
305
+
306
+ read -rp "Institusi/Universitas [UNIVERSITAS TEKNOLOGI]: " in_institution
307
+ in_institution=${in_institution:-"UNIVERSITAS TEKNOLOGI"}
308
+
309
+ read -rp "Fakultas [FAKULTAS ILMU KOMPUTER]: " in_faculty
310
+ in_faculty=${in_faculty:-"FAKULTAS ILMU KOMPUTER"}
311
+
312
+ read -rp "Tahun Akademik [2026/2027]: " in_year
313
+ in_year=${in_year:-"2026/2027"}
314
+
315
+ echo ""
316
+ echo -e "${BLUE}Pilihan Preset Format Kampus:${NC}"
317
+ echo " standard / skripsi-4433 / ui-skripsi / itb-ta / ugm-skripsi / its-skripsi"
318
+ read -rp "Preset Format [standard]: " in_preset
319
+ in_preset=${in_preset:-"standard"}
320
+
321
+ cat << YAML_EOF > metadata.yml
322
+ title: "$(yaml_escape "$in_title")"
323
+ subtitle: "$(yaml_escape "$in_subtitle")"
324
+ course: "$(yaml_escape "$in_course")"
325
+ lecturer: "$(yaml_escape "$in_lecturer")"
326
+ author:
327
+ - name: "$(yaml_escape "$in_author")"
328
+ nim: "$(yaml_escape "$in_nim")"
329
+ institution: "$(yaml_escape "$in_institution")"
330
+ faculty: "$(yaml_escape "$in_faculty")"
331
+ year: "$(yaml_escape "$in_year")"
332
+ date: "$(date +'%B %Y')"
333
+ preset: "$(yaml_escape "$in_preset")"
334
+ YAML_EOF
335
+
336
+ echo ""
337
+ echo -e "${GREEN}${BOLD}metadata.yml berhasil diperbarui!${NC}"
338
+ echo -e "Jalankan ${CYAN}./laporan build${NC} untuk mulai menghasilkan laporan."
339
+ }
340
+
341
+ cmd_build() {
342
+ show_banner
343
+ echo -e "${BLUE}${BOLD}1. Membangun Dokumen PDF (Typst Engine)...${NC}"
344
+ ./build.sh
345
+ echo ""
346
+ echo -e "${BLUE}${BOLD}2. Membangun Dokumen Microsoft Word (DOCX Multi-Pass)...${NC}"
347
+ make docx
348
+ echo ""
349
+ echo -e "${GREEN}${BOLD}Dokumen PDF dan DOCX berhasil dibuat!${NC}"
350
+ echo -e " - ${CYAN}Laporan.pdf${NC}"
351
+ echo -e " - ${CYAN}Laporan.docx${NC}"
352
+ }
353
+
354
+ cmd_pdf() {
355
+ show_banner
356
+ echo -e "${BLUE}${BOLD}Membangun Dokumen PDF...${NC}"
357
+ ./build.sh
358
+ }
359
+
360
+ cmd_docx() {
361
+ show_banner
362
+ echo -e "${BLUE}${BOLD}Membangun Dokumen DOCX...${NC}"
363
+ ./build-docx.sh
364
+ }
365
+
366
+ cmd_test() {
367
+ show_banner
368
+ echo -e "${BLUE}${BOLD}Menjalankan Test Suite...${NC}"
369
+ ./test.sh
370
+ }
371
+
372
+ cmd_view() {
373
+ make view
374
+ }
375
+
376
+ cmd_clean() {
377
+ make clean
378
+ echo -e "${GREEN}Berkas temporary berhasil dibersihkan.${NC}"
379
+ }
380
+
381
+ cmd_watch() {
382
+ make watch
383
+ }
384
+
385
+ cmd_stats() {
386
+ python3 scripts/report-stats.py
387
+ }
388
+
389
+ cmd_doctor() {
390
+ python3 scripts/report-doctor.py
391
+ }
392
+
393
+ cmd_bundle() {
394
+ python3 scripts/bundle.py
395
+ }
396
+
397
+ # Main routing
398
+ case "${1:-help}" in
399
+ build)
400
+ cmd_build
401
+ ;;
402
+ pdf)
403
+ cmd_pdf
404
+ ;;
405
+ docx)
406
+ cmd_docx
407
+ ;;
408
+ init)
409
+ cmd_init
410
+ ;;
411
+ preset)
412
+ shift
413
+ cmd_preset "$@"
414
+ ;;
415
+ stats)
416
+ cmd_stats
417
+ ;;
418
+ doctor)
419
+ cmd_doctor
420
+ ;;
421
+ bundle)
422
+ cmd_bundle
423
+ ;;
424
+ setup)
425
+ bash scripts/setup-deps.sh
426
+ ;;
427
+ sync-skills|sync-hosts)
428
+ if command -v node >/dev/null 2>&1; then
429
+ node bin/laporan-generator.js sync-hosts
430
+ else
431
+ echo "Node.js diperlukan untuk sinkronisasi multi-host AI agent."
432
+ fi
433
+ ;;
434
+ uninstall|clean-skills)
435
+ if command -v node >/dev/null 2>&1; then
436
+ node bin/laporan-generator.js uninstall
437
+ else
438
+ echo "Node.js diperlukan untuk membersihkan integrasi AI agent."
439
+ fi
440
+ ;;
441
+ check)
442
+ cmd_check
443
+ ;;
444
+ test)
445
+ cmd_test
446
+ ;;
447
+ view)
448
+ cmd_view
449
+ ;;
450
+ clean)
451
+ cmd_clean
452
+ ;;
453
+ watch)
454
+ cmd_watch
455
+ ;;
456
+ help|--help|-h)
457
+ show_help
458
+ ;;
459
+ *)
460
+ echo -e "${RED}Perintah tidak dikenal: $1${NC}"
461
+ echo "Gunakan './laporan help' untuk melihat daftar perintah."
462
+ exit 1
463
+ ;;
464
+ esac