Skip to content

Commit 2531e4f

Browse files
authored
Merge pull request #4 from itsflaid/codex/render-ai-markdown
Render AI markdown cleanly in the terminal
2 parents 5b84b7a + a1d5483 commit 2531e4f

10 files changed

Lines changed: 358 additions & 52 deletions

File tree

docs/for-me-personal/DEBUG.md

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -606,46 +606,45 @@ test satu pertanyaan.
606606

607607
---
608608

609-
## 12. `package-lock.json` Mencemari Statistik Snapshot
609+
## 12. Jawaban AI Menampilkan Markdown Mentah di Terminal
610610

611611
**Tanggal:** 2026-06-12
612612

613613
**Status:** Selesai.
614614

615615
### Gejala
616616

617-
Tarball DevMap dipasang pada project Express sementara dengan source sekitar
618-
dua baris, tetapi `devmap analyze` melaporkan 875 baris.
617+
Jawaban `devmap ask` menampilkan marker seperti `**bold**`, backtick, dan table
618+
pipe secara literal. Tabel lebar terpotong oleh terminal dan sulit dipindai.
619619

620620
### Akar Masalah
621621

622-
Scanner hanya mengabaikan extension `.lock` dan nama yang berakhir dengan
623-
`-lock.yaml`. File npm `package-lock.json` dan `npm-shrinkwrap.json` tidak cocok
624-
dengan aturan tersebut sehingga ikut masuk `fileIndex`, fingerprint, dan
625-
statistik line.
622+
Konten AI langsung dikirim ke `output.codeBlock()`. Helper tersebut cocok untuk
623+
source preview, tetapi tidak memahami struktur Markdown yang dihasilkan model.
626624

627625
### Solusi
628626

629-
- Tambahkan allowlist nama lockfile package manager yang harus diabaikan:
630-
`package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `yarn.lock`,
631-
`bun.lock`, dan `bun.lockb`.
632-
- Pertahankan package manager detection melalui pemeriksaan file langsung pada
633-
project root.
634-
- Tambahkan automated regression test untuk seluruh lockfile yang didukung.
627+
- Tambahkan pure utility `renderTerminalMarkdown()`.
628+
- Render heading, prose, list, fenced code, dan inline formatting.
629+
- Ubah Markdown table menjadi record vertikal.
630+
- Bungkus text berdasarkan lebar terminal.
631+
- Gunakan renderer hanya untuk jawaban AI `ask` dan interpretation `analyze`.
632+
- Pertahankan `codeBlock()` untuk static source context.
635633

636634
### Verifikasi
637635

638-
- Automated analyzer test lulus untuk enam nama lockfile.
639-
- Tarball dibangun ulang dan dipasang pada project sementara.
640-
- Snapshot tidak memiliki `package-lock.json` di `fileIndex`.
641-
- Project tetap terdeteksi memakai package manager npm.
642-
- Statistik turun menjadi 3 file dan 9 baris untuk fixture E2E.
636+
- Unit test mencakup heading, inline marker, list, table, wrapping, dan code
637+
fence.
638+
- Integration test memastikan output `ask` dan cached `analyze` tidak
639+
menampilkan marker Markdown mentah.
640+
- Preview manual dengan contoh database menghasilkan blok `users` dan `rooms`
641+
yang terbaca tanpa table pipe.
643642

644643
### Pelajaran
645644

646-
Deteksi package manager membutuhkan keberadaan lockfile, tetapi static scanner
647-
tidak perlu membaca kontennya. Metadata project dan source analysis harus
648-
memiliki aturan akses yang berbeda.
645+
AI response dan source preview adalah dua jenis output berbeda. AI response
646+
memerlukan semantic rendering, sedangkan source code harus dipertahankan
647+
literal.
649648

650649
---
651650

docs/for-me-personal/PROGRESS.md

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,22 @@ Terakhir diperbarui: 2026-06-12
1717
- Automated test mencakup warning terminal, snapshot persistence, framework
1818
fallback, dan keberhasilan pembuatan snapshot.
1919

20-
### Tarball End-to-End
21-
22-
- Tarball `devmap-0.1.0.tgz` berhasil dibuat dan hanya berisi `dist/`,
23-
`package.json`, `README.md`, dan `LICENSE`.
24-
- Tarball berhasil dipasang pada project Express sementara dengan npm.
25-
- `devmap analyze`, `devmap ask`, dan `devmap doctor` berhasil dijalankan dari
26-
package terpasang.
27-
- `npm exec --package <tarball> -- devmap --version` dan `--help` berhasil tanpa
28-
global install.
29-
- `devmap init` tanpa API key gagal secara aman dengan exit code `1`, pesan
30-
actionable, dan tidak membuat config parsial.
31-
- Verifikasi AI live belum dijalankan karena sesi testing tidak memiliki
32-
`GROQ_API_KEY`.
33-
- E2E menemukan `package-lock.json` ikut dipindai sebagai source. Filter scanner
34-
sekarang mengabaikan lockfile npm, pnpm, Yarn, dan Bun.
35-
- Snapshot E2E setelah perbaikan mendeteksi Express, npm, route `/health`, dan
36-
tidak memasukkan `package-lock.json`.
37-
- Kesiapan launch checklist PRD saat ini diperkirakan 17 dari 24 item, sekitar
38-
71%. Core implementation diperkirakan sekitar 85%.
20+
### Terminal Markdown Rendering
21+
22+
- Jawaban AI dari `devmap ask` dan architecture interpretation dari
23+
`devmap analyze` sekarang dirender sebagai output terminal yang terstruktur.
24+
- Heading memakai accent aqua dan separator.
25+
- Marker Markdown inline seperti bold, italic, strikethrough, link, dan
26+
backtick tidak lagi tampil mentah.
27+
- Ordered dan unordered list mempertahankan indentasi yang mudah dipindai.
28+
- Markdown table diubah menjadi record vertikal agar tetap terbaca pada
29+
terminal sempit.
30+
- Prose dibungkus berdasarkan `process.stdout.columns` dengan minimum width
31+
yang aman.
32+
- Fenced code tetap ditampilkan sebagai source block dan static context tidak
33+
diproses sebagai Markdown.
34+
- Automated test mencakup heading, inline formatting, list, table, wrapping,
35+
fenced code, serta integrasi `ask` dan cached `analyze`.
3936

4037
## Update 2026-06-11
4138

@@ -117,7 +114,7 @@ Terakhir diperbarui: 2026-06-12
117114
- Availability selected model ikut diperiksa.
118115
- Snapshot dibedakan menjadi valid, missing, corrupt, dan unsupported schema.
119116
- API key dan raw stack trace tidak pernah ditampilkan.
120-
- Automated test saat ini berjumlah 36 dan seluruhnya lulus.
117+
- Automated test saat ini berjumlah 38 dan seluruhnya lulus.
121118

122119
### Distribusi npm
123120

docs/for-me-personal/TEST.md

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ Saat ini test mencakup:
102102
Hasil minimum yang diharapkan:
103103

104104
```text
105-
tests 36
106-
pass 36
105+
tests 38
106+
pass 38
107107
fail 0
108108
```
109109

@@ -144,11 +144,42 @@ npx -p node@20 node packages\cli\node_modules\tsx\dist\cli.mjs packages\cli\test
144144
Hasil minimum yang diharapkan untuk keduanya:
145145

146146
```text
147-
tests 36
148-
pass 36
147+
tests 38
148+
pass 38
149149
fail 0
150150
```
151151

152+
## Testing Terminal Markdown Renderer
153+
154+
Jalankan unit dan integration test terkait:
155+
156+
```powershell
157+
pnpm --filter devmap exec tsx --test test/markdown-terminal.test.ts test/ask-command.test.ts test/analyze-ai.test.ts
158+
```
159+
160+
Pastikan:
161+
162+
- heading tidak menampilkan marker `##`;
163+
- bold, italic, dan inline code tidak menampilkan marker Markdown mentah;
164+
- ordered dan unordered list tetap memiliki indentasi;
165+
- table diubah menjadi blok vertikal tanpa karakter pipe;
166+
- prose dibungkus sesuai lebar terminal;
167+
- fenced code tetap terbaca sebagai code block;
168+
- jawaban `ask` dan architecture `analyze` memakai renderer;
169+
- static source context tetap ditampilkan literal.
170+
171+
Manual test dengan AI live:
172+
173+
```powershell
174+
devmap ask "Jelaskan struktur database dalam tabel dan alur utama aplikasi"
175+
```
176+
177+
Hasil yang diharapkan:
178+
179+
- tidak ada `**bold**`, backtick, atau table pipe mentah;
180+
- tabel tetap terbaca pada terminal VS Code yang sempit;
181+
- output tidak melewati lebar terminal secara berlebihan.
182+
152183
## Testing AI Client Tanpa API Call
153184

154185
Automated test AI memakai fake `fetch` dan mock `AiClient`, sehingga tidak

packages/cli/src/commands/analyze.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async function printOrGenerateInterpretation(
112112
): Promise<void> {
113113
if (snapshot.ai && !options.fresh) {
114114
output.section("Architecture");
115-
output.codeBlock(snapshot.ai.architecture);
115+
output.markdown(snapshot.ai.architecture);
116116
output.note(formatAiMetadata(snapshot.ai.model, snapshot.ai.usage, true));
117117
return;
118118
}
@@ -154,7 +154,7 @@ async function printOrGenerateInterpretation(
154154

155155
await saveSnapshot(projectRoot, updatedSnapshot);
156156
output.section("Architecture");
157-
output.codeBlock(interpretation.content);
157+
output.markdown(interpretation.content);
158158
output.note(formatAiMetadata(
159159
interpretation.model,
160160
interpretation.usage,

packages/cli/src/commands/ask.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export async function askCommand(
8787
});
8888

8989
output.section("Answer");
90-
output.codeBlock(answer.content);
90+
output.markdown(answer.content);
9191
output.note(formatUsage(answer.model, answer.usage));
9292
} catch (error) {
9393
if (!(error instanceof DevmapError)) {

0 commit comments

Comments
 (0)