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
package/lib/setup.js ADDED
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const path = require('path');
4
+ const { spawnSync } = require('child_process');
5
+
6
+ function run(argv = []) {
7
+ const isWin = process.platform === 'win32';
8
+ const packageRoot = path.join(__dirname, '..');
9
+
10
+ if (argv.includes('--docker')) {
11
+ console.log('Menjalankan verifikasi lingkungan Docker...');
12
+ spawnSync('docker', ['run', '--rm', '-v', `${process.cwd()}:/workspace`, 'muadzhdz/laporan-generator', '--help'], { stdio: 'inherit' });
13
+ return;
14
+ }
15
+
16
+ if (argv.includes('--nix')) {
17
+ console.log('Menjalankan via Nix Flake...');
18
+ spawnSync('nix', ['develop', '--command', './test.sh'], { stdio: 'inherit' });
19
+ return;
20
+ }
21
+
22
+ if (isWin) {
23
+ const psScript = path.join(packageRoot, 'scripts/setup-deps.ps1');
24
+ const proc = spawnSync('powershell', ['-ExecutionPolicy', 'Bypass', '-File', psScript], { stdio: 'inherit' });
25
+ process.exit(proc.status || 0);
26
+ } else {
27
+ const shScript = path.join(packageRoot, 'scripts/setup-deps.sh');
28
+ const proc = spawnSync('bash', [shScript], { stdio: 'inherit' });
29
+ process.exit(proc.status || 0);
30
+ }
31
+ }
32
+
33
+ module.exports = { run };
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+ const { removeRecursiveSync, parseJsonc } = require('./uninstall');
7
+
8
+ function copyRecursiveSync(src, dest) {
9
+ if (!fs.existsSync(src)) return;
10
+ const stats = fs.statSync(src);
11
+ if (stats.isDirectory()) {
12
+ if (!fs.existsSync(dest)) {
13
+ fs.mkdirSync(dest, { recursive: true });
14
+ }
15
+ fs.readdirSync(src).forEach((childItemName) => {
16
+ copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
17
+ });
18
+ } else {
19
+ fs.copyFileSync(src, dest);
20
+ }
21
+ }
22
+
23
+ function run(argv = []) {
24
+ const home = os.homedir();
25
+ const packageRoot = path.join(__dirname, '..');
26
+ const skillGeneratorSource = path.join(packageRoot, '.agents/skills/laporan-generator');
27
+ const workflowSource = path.join(packageRoot, '.agents/workflows/laporan-generator.md');
28
+
29
+ console.log('\n==========================================================');
30
+ console.log(' LAPORAN GENERATOR - AI AGENT SKILLS SYNCHRONIZER ');
31
+ console.log('==========================================================\n');
32
+
33
+ // Bersihkan alias lama/duplikat 'laporan' agar tidak dobel dengan 'laporan-generator'
34
+ const legacyDuplicates = [
35
+ path.join(home, '.agents/skills/laporan'),
36
+ path.join(home, '.gemini/config/skills/laporan'),
37
+ path.join(home, '.claude/skills/laporan'),
38
+ path.join(home, '.grok/skills/laporan'),
39
+ path.join(home, '.config/opencode/skills/laporan'),
40
+ path.join(process.cwd(), '.agents/skills/laporan'),
41
+ path.join(home, '.kiro/agents/laporan.json'),
42
+ path.join(home, '.agents/workflows/laporan.md'),
43
+ path.join(process.cwd(), '.agents/workflows/laporan.md'),
44
+ path.join(home, '.claude/commands/laporan.md')
45
+ ];
46
+ for (const legacy of legacyDuplicates) {
47
+ if (fs.existsSync(legacy)) {
48
+ removeRecursiveSync(legacy);
49
+ }
50
+ }
51
+
52
+ const targets = [
53
+ {
54
+ name: 'Global Agents (~/.agents/skills/)',
55
+ skillsDir: path.join(home, '.agents/skills')
56
+ },
57
+ {
58
+ name: 'Antigravity CLI (~/.gemini/config/skills/)',
59
+ skillsDir: path.join(home, '.gemini/config/skills')
60
+ },
61
+ {
62
+ name: 'Claude Code (~/.claude/skills/)',
63
+ skillsDir: path.join(home, '.claude/skills')
64
+ },
65
+ {
66
+ name: 'Grok CLI (~/.grok/skills/)',
67
+ skillsDir: path.join(home, '.grok/skills')
68
+ },
69
+ {
70
+ name: 'OpenCode (~/.config/opencode/skills/)',
71
+ skillsDir: path.join(home, '.config/opencode/skills')
72
+ },
73
+ {
74
+ name: 'Local Project Workspace (.agents/skills/)',
75
+ skillsDir: path.join(process.cwd(), '.agents/skills')
76
+ }
77
+ ];
78
+
79
+ let installedCount = 0;
80
+
81
+ for (const target of targets) {
82
+ try {
83
+ const destGen = path.join(target.skillsDir, 'laporan-generator');
84
+ copyRecursiveSync(skillGeneratorSource, destGen);
85
+ console.log(` ✔ [INSTALLED] ${target.name} (with full templates & resources)`);
86
+ installedCount++;
87
+ } catch (err) {
88
+ console.log(` ✖ [SKIP] ${target.name}: ${err.message}`);
89
+ }
90
+ }
91
+
92
+ // Daftarkan Slash Command ke OpenCode (~/.config/opencode/opencode.jsonc)
93
+ const opencodeConfigPath = path.join(home, '.config/opencode/opencode.jsonc');
94
+ try {
95
+ let opencodeConfig = {};
96
+ if (fs.existsSync(opencodeConfigPath)) {
97
+ const raw = fs.readFileSync(opencodeConfigPath, 'utf8');
98
+ try {
99
+ opencodeConfig = parseJsonc(raw);
100
+ } catch (_) {
101
+ opencodeConfig = {};
102
+ }
103
+ }
104
+ opencodeConfig['$schema'] = 'https://opencode.ai/config.json';
105
+ if (!opencodeConfig.command) {
106
+ opencodeConfig.command = {};
107
+ }
108
+ // Hapus command 'laporan' jika ada duplikat sebelumnya
109
+ delete opencodeConfig.command['laporan'];
110
+
111
+ opencodeConfig.command['laporan-generator'] = {
112
+ description: "Universal Academic Report & Thesis Generator",
113
+ template: "Gunakan skill laporan-generator untuk membuat atau mengompilasi dokumen laporan/skripsi akademik: $ARGUMENTS"
114
+ };
115
+
116
+ if (!opencodeConfig.skills) {
117
+ opencodeConfig.skills = {};
118
+ }
119
+ const skillPaths = new Set(opencodeConfig.skills.paths || []);
120
+ skillPaths.add(path.join(home, '.agents/skills'));
121
+ skillPaths.add(path.join(home, '.config/opencode/skills'));
122
+ opencodeConfig.skills.paths = Array.from(skillPaths);
123
+
124
+ const opencodeDir = path.dirname(opencodeConfigPath);
125
+ if (!fs.existsSync(opencodeDir)) {
126
+ fs.mkdirSync(opencodeDir, { recursive: true });
127
+ }
128
+ fs.writeFileSync(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2), 'utf8');
129
+ console.log(` ✔ [OPENCODE] Registered /laporan-generator command -> ~/.config/opencode/opencode.jsonc`);
130
+ } catch (err) {
131
+ console.log(` ✖ [OPENCODE SKIP] ${err.message}`);
132
+ }
133
+
134
+ // Daftarkan Custom Agent ke Kiro CLI (~/.kiro/agents/laporan-generator.json)
135
+ const kiroAgentsDir = path.join(home, '.kiro/agents');
136
+ try {
137
+ if (!fs.existsSync(kiroAgentsDir)) {
138
+ fs.mkdirSync(kiroAgentsDir, { recursive: true });
139
+ }
140
+ const kiroPrompt = [
141
+ "You are an expert academic writing assistant powered by Laporan Generator.",
142
+ "",
143
+ "CRITICAL INSTRUCTION: DO NOT write raw Typst code from scratch or create standalone .typ files (such as laporan.typ). DO NOT import @preview/ieee or external packages.",
144
+ "",
145
+ "Always follow the Modular Markdown Architecture:",
146
+ "1. Scaffolding: If the workspace lacks templates, copy all files from ~/.agents/skills/laporan-generator/resources/* into the project directory (or run: npx laporan-generator init).",
147
+ "2. Metadata: Edit metadata.yml to set title, author, institution, faculty, department, year, and campus preset (standard, skripsi-4433, itb-ta, ui-skripsi, ugm-skripsi, its-skripsi).",
148
+ "3. Content: Write chapters in pure standard Markdown inside chapters/ (bab1-pendahuluan.md, bab2-tinjauan-pustaka.md, bab3-metodologi.md, bab4-hasil-dan-pembahasan.md, bab5-penutup.md).",
149
+ "4. Citations: Add BibTeX entries to references.bib and cite in Markdown using [@citekey].",
150
+ "5. Compilation: Run './laporan build' (or 'bash build.sh && make docx') to compile both PDF and Word DOCX simultaneously.",
151
+ "6. Audit: Run './laporan doctor' to audit document health."
152
+ ].join("\n");
153
+
154
+ const kiroConfig = {
155
+ name: "laporan-generator",
156
+ description: "Universal Academic Report & Thesis Generator using bundled Typst & DOCX templates",
157
+ prompt: kiroPrompt,
158
+ tools: ["read", "write", "shell", "grep", "glob"],
159
+ allowedTools: ["read", "write", "shell", "grep", "glob"]
160
+ };
161
+ fs.writeFileSync(
162
+ path.join(kiroAgentsDir, 'laporan-generator.json'),
163
+ JSON.stringify(kiroConfig, null, 2),
164
+ 'utf8'
165
+ );
166
+ console.log(` ✔ [KIRO AGENT] Registered agent: "laporan-generator" -> ~/.kiro/agents/`);
167
+ } catch (err) {
168
+ console.log(` ✖ [KIRO SKIP] ${err.message}`);
169
+ }
170
+
171
+ // Daftarkan Slash Commands / Workflows (Hanya satu /laporan-generator)
172
+ const workflowDestinations = [
173
+ path.join(home, '.agents/workflows'),
174
+ path.join(process.cwd(), '.agents/workflows'),
175
+ path.join(home, '.claude/commands')
176
+ ];
177
+
178
+ for (const wDir of workflowDestinations) {
179
+ try {
180
+ if (!fs.existsSync(wDir)) {
181
+ fs.mkdirSync(wDir, { recursive: true });
182
+ }
183
+ fs.copyFileSync(workflowSource, path.join(wDir, 'laporan-generator.md'));
184
+ console.log(` ✔ [SLASH COMMAND] /laporan-generator -> ${wDir}`);
185
+ } catch (_) {}
186
+ }
187
+
188
+ console.log('\n==========================================================');
189
+ console.log(`✨ Sukses! Skill dan template /laporan-generator berhasil disinkronkan.`);
190
+ console.log('Seluruh AI Agent (OpenCode, Kiro, Antigravity, Claude) kini siap digunakan!');
191
+ console.log('==========================================================\n');
192
+ }
193
+
194
+ module.exports = { run };
@@ -0,0 +1,123 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ function removeRecursiveSync(targetPath) {
8
+ if (!fs.existsSync(targetPath)) return;
9
+ try {
10
+ const stats = fs.statSync(targetPath);
11
+ if (stats.isDirectory()) {
12
+ fs.readdirSync(targetPath).forEach((child) => {
13
+ removeRecursiveSync(path.join(targetPath, child));
14
+ });
15
+ fs.rmdirSync(targetPath);
16
+ } else {
17
+ fs.unlinkSync(targetPath);
18
+ }
19
+ } catch (err) {
20
+ // ignore
21
+ }
22
+ }
23
+
24
+ function parseJsonc(content) {
25
+ const clean = content
26
+ .replace(/^\s*\/\/.*$/gm, '')
27
+ .replace(/\/\*[\s\S]*?\*\//g, '')
28
+ .trim();
29
+ return JSON.parse(clean);
30
+ }
31
+
32
+ function run(argv = []) {
33
+ const home = os.homedir();
34
+
35
+ console.log('\n==========================================================');
36
+ console.log(' LAPORAN GENERATOR - PEMBERSIHAN & UNINSTALL SKILLS ');
37
+ console.log('==========================================================\n');
38
+
39
+ // 1. Hapus dari skills direktori (baik laporan-generator maupun alias laporan)
40
+ const skillDirs = [
41
+ path.join(home, '.agents/skills/laporan-generator'),
42
+ path.join(home, '.agents/skills/laporan'),
43
+ path.join(home, '.gemini/config/skills/laporan-generator'),
44
+ path.join(home, '.gemini/config/skills/laporan'),
45
+ path.join(home, '.claude/skills/laporan-generator'),
46
+ path.join(home, '.claude/skills/laporan'),
47
+ path.join(home, '.grok/skills/laporan-generator'),
48
+ path.join(home, '.grok/skills/laporan'),
49
+ path.join(home, '.config/opencode/skills/laporan-generator'),
50
+ path.join(home, '.config/opencode/skills/laporan')
51
+ ];
52
+
53
+ for (const sDir of skillDirs) {
54
+ if (fs.existsSync(sDir)) {
55
+ removeRecursiveSync(sDir);
56
+ console.log(` ✔ [REMOVED] Skill: ${sDir}`);
57
+ }
58
+ }
59
+
60
+ // 2. Hapus Kiro CLI agents
61
+ const kiroAgents = [
62
+ path.join(home, '.kiro/agents/laporan-generator.json'),
63
+ path.join(home, '.kiro/agents/laporan.json')
64
+ ];
65
+ for (const kAgent of kiroAgents) {
66
+ if (fs.existsSync(kAgent)) {
67
+ removeRecursiveSync(kAgent);
68
+ console.log(` ✔ [REMOVED] Kiro Agent: ${kAgent}`);
69
+ }
70
+ }
71
+
72
+ // 3. Hapus Workflows & Slash Commands
73
+ const workflowFiles = [
74
+ path.join(home, '.agents/workflows/laporan-generator.md'),
75
+ path.join(home, '.agents/workflows/laporan.md'),
76
+ path.join(home, '.claude/commands/laporan-generator.md'),
77
+ path.join(home, '.claude/commands/laporan.md')
78
+ ];
79
+ for (const wFile of workflowFiles) {
80
+ if (fs.existsSync(wFile)) {
81
+ removeRecursiveSync(wFile);
82
+ console.log(` ✔ [REMOVED] Command / Workflow: ${wFile}`);
83
+ }
84
+ }
85
+
86
+ // 4. Bersihkan OpenCode config (~/.config/opencode/opencode.jsonc)
87
+ const opencodeConfigPath = path.join(home, '.config/opencode/opencode.jsonc');
88
+ if (fs.existsSync(opencodeConfigPath)) {
89
+ try {
90
+ const raw = fs.readFileSync(opencodeConfigPath, 'utf8');
91
+ let opencodeConfig = parseJsonc(raw);
92
+ let modified = false;
93
+
94
+ if (opencodeConfig.command) {
95
+ if (opencodeConfig.command['laporan']) {
96
+ delete opencodeConfig.command['laporan'];
97
+ modified = true;
98
+ }
99
+ if (opencodeConfig.command['laporan-generator']) {
100
+ delete opencodeConfig.command['laporan-generator'];
101
+ modified = true;
102
+ }
103
+ if (Object.keys(opencodeConfig.command).length === 0) {
104
+ delete opencodeConfig.command;
105
+ }
106
+ modified = true;
107
+ }
108
+
109
+ if (modified) {
110
+ fs.writeFileSync(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2), 'utf8');
111
+ console.log(` ✔ [CLEANED] OpenCode config (~/.config/opencode/opencode.jsonc)`);
112
+ }
113
+ } catch (err) {
114
+ console.log(` ✖ [OPENCODE CLEAN ERROR] ${err.message}`);
115
+ }
116
+ }
117
+
118
+ console.log('\n==========================================================');
119
+ console.log('✨ Uninstall selesai! Seluruh integrasi AI agent telah dibersihkan.');
120
+ console.log('==========================================================\n');
121
+ }
122
+
123
+ module.exports = { run, removeRecursiveSync, parseJsonc };
package/logo.jpg ADDED
Binary file
package/metadata.yml ADDED
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: "Otomatisasi Pembuatan Dokumen Laporan Akademik Menggunakan Pandoc, Typst, dan Markdown"
3
+ subtitle: "Laporan Dokumentasi Pipeline dan Arsitektur Multi-Engine"
4
+ author:
5
+ - name: "Nama Mahasiswa 1"
6
+ nim: "101234567"
7
+ - name: "Nama Mahasiswa 2"
8
+ nim: "101234568"
9
+ - name: "Nama Mahasiswa 3"
10
+ nim: "101234569"
11
+ lecturer: "Dr. Nama Dosen Pengampu, M.Kom."
12
+ lecturer_label: "Dosen Pengampu:"
13
+ course: "Proyek Perangkat Lunak"
14
+ institution: "Universitas Example"
15
+ faculty: "Program Studi Informatika"
16
+ year: "2026/2027"
17
+ date: "Agustus 2026"
18
+ abstract_id: |
19
+ Laporan ini membahas perancangan dan implementasi pipeline otomatisasi pembuatan dokumen akademik modern menggunakan Markdown, Pandoc, Typst, Lua Filter, dan multi-pass DOCX engine. Pipeline ini memungkinkan penulisan konten laporan dalam format Markdown yang secara otomatis dikonversi menjadi dokumen PDF berkualitas percetakan berbasis Typst serta dokumen Microsoft Word (.docx) berstruktur formal lengkap dengan penomoran bab, tabel, gambar, dan halaman otomatis yang mematuhi standar karya ilmiah perguruan tinggi di Indonesia.
20
+ keywords_id:
21
+ - Otomatisasi Dokumen
22
+ - Pandoc
23
+ - Typst
24
+ - OpenXML
25
+ - Rekayasa Perangkat Lunak
26
+ abstract_en: |
27
+ This report presents the design and implementation of a modern academic document automation pipeline utilizing Markdown, Pandoc, Typst, Lua Filters, and a multi-pass DOCX engine. This pipeline facilitates authoring scholarly reports in plain Markdown, seamlessly generating both print-quality Typst-based PDF documents and formally structured Microsoft Word (.docx) files. The generated outputs feature automated chapter, table, figure, and dual-pagination numbering compliant with standardized higher education guidelines.
28
+ keywords_en:
29
+ - Document Automation
30
+ - Pandoc
31
+ - Typst
32
+ - OpenXML
33
+ - Software Engineering
34
+ preset: "standard"
35
+ ...
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "laporan-generator",
3
+ "version": "2.6.1",
4
+ "description": "Universal Academic Report & Thesis Generator with Multi-Host AI Agent Skills (Antigravity, Claude, Grok)",
5
+ "main": "bin/laporan-generator.js",
6
+ "bin": {
7
+ "laporan-generator": "bin/laporan-generator.js",
8
+ "laporan": "bin/laporan-generator.js"
9
+ },
10
+ "files": [
11
+ "bin/",
12
+ "lib/",
13
+ ".agents/",
14
+ "presets/",
15
+ "scripts/",
16
+ "chapters/",
17
+ "template.typ",
18
+ "reference.docx",
19
+ "docx.lua",
20
+ "references.bib",
21
+ "apa.csl",
22
+ "metadata.yml",
23
+ "cover.md",
24
+ "logo.jpg",
25
+ "Makefile",
26
+ "build.sh",
27
+ "build-docx.sh",
28
+ "laporan",
29
+ "laporan.ps1",
30
+ "docs/",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "scripts": {
35
+ "test": "./test.sh",
36
+ "doctor": "node bin/laporan-generator.js doctor",
37
+ "sync-hosts": "node bin/laporan-generator.js sync-hosts",
38
+ "setup": "node bin/laporan-generator.js setup"
39
+ },
40
+ "keywords": [
41
+ "typst",
42
+ "pandoc",
43
+ "academic-reports",
44
+ "thesis-generator",
45
+ "skripsi",
46
+ "ai-agents",
47
+ "antigravity",
48
+ "antigravity-cli",
49
+ "claude-code",
50
+ "skills"
51
+ ],
52
+ "author": "Mu'adz Hudzaifah <muadzhudzaifah511@gmail.com>",
53
+ "license": "MIT",
54
+ "engines": {
55
+ "node": ">=18"
56
+ },
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/muadzhdz/laporan-generator.git"
60
+ },
61
+ "bugs": {
62
+ "url": "https://github.com/muadzhdz/laporan-generator/issues"
63
+ },
64
+ "homepage": "https://github.com/muadzhdz/laporan-generator#readme"
65
+ }
@@ -0,0 +1,27 @@
1
+ # Preset: Institut Teknologi Bandung (ITB)
2
+ preset_id: "itb-ta"
3
+ name: "Institut Teknologi Bandung (ITB)"
4
+ description: "Format Tugas Akhir / Tesis sesuai Pedoman Penulisan Karya Ilmiah ITB (Margin 4-4-3-3, Cover Minimalis)."
5
+
6
+ # Margin halaman (Standar ITB: Kiri 4cm, Atas 4cm, Bawah 3cm, Kanan 3cm)
7
+ margin_top: 4cm
8
+ margin_bottom: 3cm
9
+ margin_left: 4cm
10
+ margin_right: 3cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover (ITB standar sampul depan tidak mencantumkan nama dosen pembimbing)
25
+ cover_show_lecturer: false
26
+ cover_hide_lecturer: true
27
+ cover_logo_width: 4.5cm
@@ -0,0 +1,26 @@
1
+ # Preset: Institut Teknologi Sepuluh Nopember (ITS)
2
+ preset_id: "its-skripsi"
3
+ name: "Institut Teknologi Sepuluh Nopember (ITS)"
4
+ description: "Format Tugas Akhir & Skripsi Institut Teknologi Sepuluh Nopember (Margin 4-4-3-3, Standard Academic)."
5
+
6
+ # Margin halaman (Standar ITS: Kiri 4cm, Atas 4cm, Bawah 3cm, Kanan 3cm)
7
+ margin_top: 4cm
8
+ margin_bottom: 3cm
9
+ margin_left: 4cm
10
+ margin_right: 3cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover
25
+ cover_show_lecturer: true
26
+ cover_logo_width: 4.2cm
@@ -0,0 +1,26 @@
1
+ # Preset: Skripsi Tradisional (Margin 4-4-3-3)
2
+ preset_id: "skripsi-4433"
3
+ name: "Skripsi Tradisional (4-4-3-3)"
4
+ description: "Format skripsi/tesis jilid tebal (hardcover) dengan margin kiri ekstra 4cm untuk area jilid."
5
+
6
+ # Margin halaman
7
+ margin_top: 4cm
8
+ margin_bottom: 3cm
9
+ margin_left: 4cm
10
+ margin_right: 3cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover
25
+ cover_show_lecturer: true
26
+ cover_logo_width: 4cm
@@ -0,0 +1,26 @@
1
+ # Preset: Standar Modern
2
+ preset_id: "standard"
3
+ name: "Standar Modern"
4
+ description: "Format standar modern untuk laporan proyek, tugas kuliah, praktikum, dan makalah."
5
+
6
+ # Margin halaman
7
+ margin_top: 2cm
8
+ margin_bottom: 3cm
9
+ margin_left: 2.5cm
10
+ margin_right: 2.5cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover
25
+ cover_show_lecturer: true
26
+ cover_logo_width: 4cm
@@ -0,0 +1,26 @@
1
+ # Preset: Universitas Gadjah Mada (UGM)
2
+ preset_id: "ugm-skripsi"
3
+ name: "Universitas Gadjah Mada (UGM)"
4
+ description: "Format Skripsi / Laporan Tugas Akhir Universitas Gadjah Mada (Margin 4-4-3-3, Full Academic Cover)."
5
+
6
+ # Margin halaman (Standar UGM: Kiri 4cm, Atas 4cm, Bawah 3cm, Kanan 3cm)
7
+ margin_top: 4cm
8
+ margin_bottom: 3cm
9
+ margin_left: 4cm
10
+ margin_right: 3cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover
25
+ cover_show_lecturer: true
26
+ cover_logo_width: 4cm
@@ -0,0 +1,26 @@
1
+ # Preset: Universitas Indonesia (UI)
2
+ preset_id: "ui-skripsi"
3
+ name: "Universitas Indonesia (UI)"
4
+ description: "Format Tugas Akhir & Skripsi sesuai Pedoman Penulisan Karya Ilmiah Universitas Indonesia."
5
+
6
+ # Margin halaman (Standar UI: Top 2.5cm / 2cm, Left 2.5cm, Bottom 2.5cm / 3cm, Right 2.5cm)
7
+ margin_top: 2.5cm
8
+ margin_bottom: 2.5cm
9
+ margin_left: 2.5cm
10
+ margin_right: 2.5cm
11
+
12
+ # Tipografi
13
+ font_family: "Libertinus Serif"
14
+ font_size: 12pt
15
+ line_spacing: 0.75em
16
+ first_line_indent: 1.25cm
17
+
18
+ # Penomoran Heading
19
+ heading_chapter_prefix: "BAB "
20
+ heading_chapter_num_format: "roman"
21
+ heading_sub_dot: true
22
+ heading_subsub_dot: false
23
+
24
+ # Pengaturan Cover
25
+ cover_show_lecturer: true
26
+ cover_logo_width: 4cm
@@ -0,0 +1,27 @@
1
+ # Preset: UNIVERSITAS PADJADJARAN
2
+ # Dihasilkan secara otomatis oleh scan-preset.py
3
+ preset_id: "unpad-skripsi"
4
+ name: "UNIVERSITAS PADJADJARAN"
5
+ description: "Format otomatis hasil pemindaian pedoman akademik UNIVERSITAS PADJADJARAN."
6
+
7
+ # 1. Geometri & Margin Halaman
8
+ margin_top: 4cm
9
+ margin_bottom: 3cm
10
+ margin_left: 4cm
11
+ margin_right: 3cm
12
+
13
+ # 2. Tipografi & Spasi
14
+ font_family: "Libertinus Serif"
15
+ font_size: 12pt
16
+ line_spacing: 0.75em
17
+ first_line_indent: 1.25cm
18
+
19
+ # 3. Penomoran Heading
20
+ heading_chapter_prefix: "BAB "
21
+ heading_chapter_num_format: "roman"
22
+ heading_sub_dot: true
23
+ heading_subsub_dot: false
24
+
25
+ # 4. Pengaturan Halaman Sampul
26
+ cover_show_lecturer: true
27
+ cover_logo_width: 4cm
package/reference.docx ADDED
Binary file