Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions docs/for-me-personal/DEBUG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
22 changes: 21 additions & 1 deletion docs/for-me-personal/PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <tarball> -- 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
Expand Down Expand Up @@ -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

Expand Down
43 changes: 39 additions & 4 deletions docs/for-me-personal/TEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ Saat ini test mencakup:
Hasil minimum yang diharapkan:

```text
tests 34
pass 34
tests 36
pass 36
fail 0
```

Expand Down Expand Up @@ -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
```

Expand Down Expand Up @@ -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.
15 changes: 14 additions & 1 deletion packages/cli/src/analyzers/filterEngine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
14 changes: 14 additions & 0 deletions packages/cli/test/analyzers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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);
Expand Down
Loading