diff --git a/docs/for-me-personal/DEBUG.md b/docs/for-me-personal/DEBUG.md index 054a2b2..63174dc 100644 --- a/docs/for-me-personal/DEBUG.md +++ b/docs/for-me-personal/DEBUG.md @@ -606,6 +606,49 @@ test satu pertanyaan. --- +## 12. `package-lock.json` Mencemari Statistik Snapshot + +**Tanggal:** 2026-06-12 + +**Status:** Selesai. + +### Gejala + +Tarball DevMap dipasang pada project Express sementara dengan source sekitar +dua baris, tetapi `devmap analyze` melaporkan 875 baris. + +### Akar Masalah + +Scanner hanya mengabaikan extension `.lock` dan nama yang berakhir dengan +`-lock.yaml`. File npm `package-lock.json` dan `npm-shrinkwrap.json` tidak cocok +dengan aturan tersebut sehingga ikut masuk `fileIndex`, fingerprint, dan +statistik line. + +### Solusi + +- Tambahkan allowlist nama lockfile package manager yang harus diabaikan: + `package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `yarn.lock`, + `bun.lock`, dan `bun.lockb`. +- Pertahankan package manager detection melalui pemeriksaan file langsung pada + project root. +- Tambahkan automated regression test untuk seluruh lockfile yang didukung. + +### Verifikasi + +- Automated analyzer test lulus untuk enam nama lockfile. +- Tarball dibangun ulang dan dipasang pada project sementara. +- Snapshot tidak memiliki `package-lock.json` di `fileIndex`. +- Project tetap terdeteksi memakai package manager npm. +- Statistik turun menjadi 3 file dan 9 baris untuk fixture E2E. + +### Pelajaran + +Deteksi package manager membutuhkan keberadaan lockfile, tetapi static scanner +tidak perlu membaca kontennya. Metadata project dan source analysis harus +memiliki aturan akses yang berbeda. + +--- + ## Checklist Saat Menambahkan Debug Baru Tambahkan catatan baru ketika: diff --git a/docs/for-me-personal/PROGRESS.md b/docs/for-me-personal/PROGRESS.md index d144531..8a32281 100644 --- a/docs/for-me-personal/PROGRESS.md +++ b/docs/for-me-personal/PROGRESS.md @@ -17,6 +17,26 @@ Terakhir diperbarui: 2026-06-12 - Automated test mencakup warning terminal, snapshot persistence, framework fallback, dan keberhasilan pembuatan snapshot. +### Tarball End-to-End + +- Tarball `devmap-0.1.0.tgz` berhasil dibuat dan hanya berisi `dist/`, + `package.json`, `README.md`, dan `LICENSE`. +- Tarball berhasil dipasang pada project Express sementara dengan npm. +- `devmap analyze`, `devmap ask`, dan `devmap doctor` berhasil dijalankan dari + package terpasang. +- `npm exec --package -- devmap --version` dan `--help` berhasil tanpa + global install. +- `devmap init` tanpa API key gagal secara aman dengan exit code `1`, pesan + actionable, dan tidak membuat config parsial. +- Verifikasi AI live belum dijalankan karena sesi testing tidak memiliki + `GROQ_API_KEY`. +- E2E menemukan `package-lock.json` ikut dipindai sebagai source. Filter scanner + sekarang mengabaikan lockfile npm, pnpm, Yarn, dan Bun. +- Snapshot E2E setelah perbaikan mendeteksi Express, npm, route `/health`, dan + tidak memasukkan `package-lock.json`. +- Kesiapan launch checklist PRD saat ini diperkirakan 17 dari 24 item, sekitar + 71%. Core implementation diperkirakan sekitar 85%. + ## Update 2026-06-11 ### Workflow Agent @@ -97,7 +117,7 @@ Terakhir diperbarui: 2026-06-12 - Availability selected model ikut diperiksa. - Snapshot dibedakan menjadi valid, missing, corrupt, dan unsupported schema. - API key dan raw stack trace tidak pernah ditampilkan. -- Automated test saat ini berjumlah 35 dan seluruhnya lulus. +- Automated test saat ini berjumlah 36 dan seluruhnya lulus. ### Distribusi npm diff --git a/docs/for-me-personal/TEST.md b/docs/for-me-personal/TEST.md index f6c7596..54a0cac 100644 --- a/docs/for-me-personal/TEST.md +++ b/docs/for-me-personal/TEST.md @@ -102,8 +102,8 @@ Saat ini test mencakup: Hasil minimum yang diharapkan: ```text -tests 34 -pass 34 +tests 36 +pass 36 fail 0 ``` @@ -144,8 +144,8 @@ npx -p node@20 node packages\cli\node_modules\tsx\dist\cli.mjs packages\cli\test Hasil minimum yang diharapkan untuk keduanya: ```text -tests 34 -pass 34 +tests 36 +pass 36 fail 0 ``` @@ -585,3 +585,38 @@ npm exec --yes --cache "$env:TEMP\devmap-help" --package $tarball -- devmap --he ``` Jangan menjalankan dua instalasi `npx` secara paralel dengan cache yang sama. + +### End-to-End Project Sementara + +Pasang tarball pada project sementara yang memiliki: + +- `package.json` dengan dependency Express; +- `src/server.ts` dengan satu route; +- `AGENTS.md` yang sudah memiliki isi. + +Jalankan binary dari `node_modules/.bin`: + +```powershell +devmap --version +devmap --help +devmap init +devmap analyze +devmap ask "where is the server entry point?" +devmap doctor +``` + +Tanpa `GROQ_API_KEY`, hasil yang diharapkan: + +- `init` exit `1` dengan pesan actionable dan tidak membuat config parsial; +- `analyze`, `ask`, dan `doctor` exit `0`; +- `ask` menampilkan static context; +- snapshot mendeteksi Express, npm, dan route project; +- lockfile package manager tidak masuk `fileIndex` atau statistik line; +- `AGENTS.md` yang sudah ada tidak berubah. + +Dengan `GROQ_API_KEY` valid, ulangi flow untuk memverifikasi: + +- `init` membuat config, `.gitignore`, dan `DEVMAP.md`; +- `analyze` menghasilkan AI architecture interpretation; +- `ask` menghasilkan jawaban AI dan token usage; +- `doctor` memvalidasi key dan model. diff --git a/packages/cli/src/analyzers/filterEngine.ts b/packages/cli/src/analyzers/filterEngine.ts index f566a35..f086426 100644 --- a/packages/cli/src/analyzers/filterEngine.ts +++ b/packages/cli/src/analyzers/filterEngine.ts @@ -25,17 +25,30 @@ const IGNORED_EXTENSIONS = new Set([ ".zip" ]); +const IGNORED_FILES = new Set([ + "package-lock.json", + "npm-shrinkwrap.json", + "pnpm-lock.yaml", + "yarn.lock", + "bun.lock", + "bun.lockb" +]); + export function shouldIgnorePath(path: string, isDirectory: boolean): boolean { const segments = path.split("/"); if (segments.some((segment) => IGNORED_DIRECTORIES.has(segment))) { return true; } + if (!isDirectory && IGNORED_FILES.has(segments.at(-1) ?? "")) { + return true; + } + if (path.startsWith(".env") || path.includes("/.env")) { return true; } - if (path.includes("public/assets/") || path.endsWith(".min.ts") || path.endsWith("-lock.yaml")) { + if (path.includes("public/assets/") || path.endsWith(".min.ts")) { return true; } diff --git a/packages/cli/test/analyzers.test.ts b/packages/cli/test/analyzers.test.ts index c1f18b7..ada93a0 100644 --- a/packages/cli/test/analyzers.test.ts +++ b/packages/cli/test/analyzers.test.ts @@ -6,6 +6,7 @@ import { fileURLToPath } from "node:url"; import test from "node:test"; import { buildDependencyGraph, countReferences } from "../src/analyzers/dependencyGraph.js"; import { scanFiles } from "../src/analyzers/fileScanner.js"; +import { shouldIgnorePath } from "../src/analyzers/filterEngine.js"; import { detectFramework } from "../src/analyzers/frameworkDetector.js"; import { createProjectMap } from "../src/analyzers/projectMap.js"; import { detectExternalServices } from "../src/analyzers/serviceDetector.js"; @@ -32,6 +33,19 @@ test("scanner ignores generated and secret paths", async () => { assert.ok(!paths.some((path) => path.startsWith(".env"))); }); +test("scanner ignores package manager lockfiles", () => { + for (const lockfile of [ + "package-lock.json", + "npm-shrinkwrap.json", + "pnpm-lock.yaml", + "yarn.lock", + "bun.lock", + "bun.lockb" + ]) { + assert.equal(shouldIgnorePath(lockfile, false), true, lockfile); + } +}); + test("framework detector recognizes Next.js and Express fixtures", async () => { const nextFiles = await scanFiles(nextFixture); const expressFiles = await scanFiles(expressFixture);