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.
- package/.agents/skills/laporan-generator/SKILL.md +132 -0
- package/.agents/skills/laporan-generator/agents/openai.yaml +3 -0
- package/.agents/skills/laporan-generator/references/campus-guide.md +120 -0
- package/.agents/skills/laporan-generator/references/metadata-schema.md +76 -0
- package/.agents/skills/laporan-generator/references/preset-schema.md +79 -0
- package/.agents/skills/laporan-generator/references/syntax-cheatsheet.md +122 -0
- package/.agents/skills/laporan-generator/references/template-guide.md +100 -0
- package/.agents/skills/laporan-generator/references/troubleshooting.md +105 -0
- package/.agents/skills/laporan-generator/resources/Makefile +90 -0
- package/.agents/skills/laporan-generator/resources/apa.csl +2273 -0
- package/.agents/skills/laporan-generator/resources/build-docx.sh +122 -0
- package/.agents/skills/laporan-generator/resources/build.sh +102 -0
- package/.agents/skills/laporan-generator/resources/chapters/bab1-pendahuluan.md +60 -0
- package/.agents/skills/laporan-generator/resources/chapters/bab2-tinjauan-pustaka.md +83 -0
- package/.agents/skills/laporan-generator/resources/chapters/bab3-metodologi.md +116 -0
- package/.agents/skills/laporan-generator/resources/chapters/bab4-hasil-dan-pembahasan.md +93 -0
- package/.agents/skills/laporan-generator/resources/chapters/bab5-penutup.md +27 -0
- package/.agents/skills/laporan-generator/resources/cover.md +50 -0
- package/.agents/skills/laporan-generator/resources/docx.lua +416 -0
- package/.agents/skills/laporan-generator/resources/laporan +464 -0
- package/.agents/skills/laporan-generator/resources/laporan.ps1 +552 -0
- package/.agents/skills/laporan-generator/resources/logo.jpg +0 -0
- package/.agents/skills/laporan-generator/resources/metadata.yml +35 -0
- package/.agents/skills/laporan-generator/resources/presets/itb-ta.yml +27 -0
- package/.agents/skills/laporan-generator/resources/presets/its-skripsi.yml +26 -0
- package/.agents/skills/laporan-generator/resources/presets/skripsi-4433.yml +26 -0
- package/.agents/skills/laporan-generator/resources/presets/standard.yml +26 -0
- package/.agents/skills/laporan-generator/resources/presets/ugm-skripsi.yml +26 -0
- package/.agents/skills/laporan-generator/resources/presets/ui-skripsi.yml +26 -0
- package/.agents/skills/laporan-generator/resources/presets/unpad-skripsi.yml +27 -0
- package/.agents/skills/laporan-generator/resources/reference.docx +0 -0
- package/.agents/skills/laporan-generator/resources/references.bib +115 -0
- package/.agents/skills/laporan-generator/resources/scripts/bundle.py +75 -0
- package/.agents/skills/laporan-generator/resources/scripts/docx-pagenum.py +192 -0
- package/.agents/skills/laporan-generator/resources/scripts/finalize-docx.py +291 -0
- package/.agents/skills/laporan-generator/resources/scripts/make-reference-docx.py +670 -0
- package/.agents/skills/laporan-generator/resources/scripts/report-doctor.py +211 -0
- package/.agents/skills/laporan-generator/resources/scripts/report-stats.py +149 -0
- package/.agents/skills/laporan-generator/resources/scripts/scan-preset.py +311 -0
- package/.agents/skills/laporan-generator/resources/scripts/setup-deps.ps1 +152 -0
- package/.agents/skills/laporan-generator/resources/scripts/setup-deps.sh +113 -0
- package/.agents/skills/laporan-generator/resources/scripts/test_scripts.py +128 -0
- package/.agents/skills/laporan-generator/resources/scripts/validate-preset.py +166 -0
- package/.agents/skills/laporan-generator/resources/template.typ +394 -0
- package/.agents/skills/laporan-generator/scripts/build.sh +78 -0
- package/.agents/skills/laporan-generator/scripts/bundle.py +75 -0
- package/.agents/skills/laporan-generator/scripts/docx-pagenum.py +192 -0
- package/.agents/skills/laporan-generator/scripts/finalize-docx.py +152 -0
- package/.agents/skills/laporan-generator/scripts/laporan +447 -0
- package/.agents/skills/laporan-generator/scripts/laporan.ps1 +529 -0
- package/.agents/skills/laporan-generator/scripts/make-reference-docx.py +630 -0
- package/.agents/skills/laporan-generator/scripts/report-doctor.py +211 -0
- package/.agents/skills/laporan-generator/scripts/report-stats.py +149 -0
- package/.agents/skills/laporan-generator/scripts/scan-preset.py +311 -0
- package/.agents/skills/laporan-generator/scripts/setup-deps.ps1 +152 -0
- package/.agents/skills/laporan-generator/scripts/setup-deps.sh +113 -0
- package/.agents/skills/laporan-generator/scripts/test_scripts.py +103 -0
- package/.agents/skills/laporan-generator/scripts/validate-preset.py +166 -0
- package/.agents/workflows/laporan-generator.md +8 -0
- package/LICENSE +21 -0
- package/Makefile +90 -0
- package/README.md +389 -0
- package/apa.csl +2273 -0
- package/bin/laporan-generator.js +71 -0
- package/build-docx.sh +122 -0
- package/build.sh +102 -0
- package/chapters/bab1-pendahuluan.md +60 -0
- package/chapters/bab2-tinjauan-pustaka.md +83 -0
- package/chapters/bab3-metodologi.md +116 -0
- package/chapters/bab4-hasil-dan-pembahasan.md +93 -0
- package/chapters/bab5-penutup.md +27 -0
- package/cover.md +50 -0
- package/docs/campus-guide.md +120 -0
- package/docs/metadata-schema.md +76 -0
- package/docs/preset-schema.md +79 -0
- package/docs/syntax-cheatsheet.md +122 -0
- package/docs/template-guide.md +100 -0
- package/docs/troubleshooting.md +105 -0
- package/docx.lua +416 -0
- package/laporan +464 -0
- package/laporan.ps1 +552 -0
- package/lib/init.js +118 -0
- package/lib/setup.js +33 -0
- package/lib/sync-hosts.js +194 -0
- package/lib/uninstall.js +123 -0
- package/logo.jpg +0 -0
- package/metadata.yml +35 -0
- package/package.json +65 -0
- package/presets/itb-ta.yml +27 -0
- package/presets/its-skripsi.yml +26 -0
- package/presets/skripsi-4433.yml +26 -0
- package/presets/standard.yml +26 -0
- package/presets/ugm-skripsi.yml +26 -0
- package/presets/ui-skripsi.yml +26 -0
- package/presets/unpad-skripsi.yml +27 -0
- package/reference.docx +0 -0
- package/references.bib +115 -0
- package/scripts/bundle.py +75 -0
- package/scripts/docx-pagenum.py +192 -0
- package/scripts/finalize-docx.py +291 -0
- package/scripts/make-reference-docx.py +670 -0
- package/scripts/report-doctor.py +211 -0
- package/scripts/report-stats.py +149 -0
- package/scripts/scan-preset.py +311 -0
- package/scripts/setup-deps.ps1 +152 -0
- package/scripts/setup-deps.sh +113 -0
- package/scripts/test_scripts.py +128 -0
- package/scripts/validate-preset.py +166 -0
- 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
|