dev-diagnosis-cli 0.1.2 → 0.1.3
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/CHANGELOG.md +10 -0
- package/README.md +2 -2
- package/lib/context.mjs +25 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.3 — unreleased
|
|
4
|
+
|
|
5
|
+
- Fix: nested build-output directories are reported by their full path
|
|
6
|
+
from the repo root (`packages/foo/dist/`) instead of a bare `dist/` —
|
|
7
|
+
the bare entry only matches top-level output, so `--fix` on a repo
|
|
8
|
+
whose build output lives in a subdirectory wrote an `.aiignore`
|
|
9
|
+
entry the next scan ignored, and the scan kept failing after the
|
|
10
|
+
fix. Files under one build directory are also rolled up into a
|
|
11
|
+
single row instead of one row per file. (53 tests.)
|
|
12
|
+
|
|
3
13
|
## 0.1.2 — 2026-11-11
|
|
4
14
|
|
|
5
15
|
- New: `context --fix` (and `all --fix`) writes the `.aiignore`
|
package/README.md
CHANGED
|
@@ -92,7 +92,7 @@ The demo repo is intentionally noisy, so `all` exits 1: the context and flakes c
|
|
|
92
92
|
|
|
93
93
|
### `context` — what an AI agent should not read
|
|
94
94
|
|
|
95
|
-
Walks the repo (skipping `.git`, `node_modules` and other hidden directories) and classifies every file: build output, large files over 1 MB, lockfiles, logs, binary payloads, secret-like files and environment templates. It prints a 0–100 score, the bytes lost per category, the noisy files, the files worth a look before sharing, and the `.aiignore` entries that would fix it. Files the repo's `.aiignore` already lists are excluded from the scan entirely — they are what the agent will not be handed, so they are not noise any more. `context --fix` writes the suggestions into `.aiignore` for you; `--json` includes the fix outcome in the output.
|
|
95
|
+
Walks the repo (skipping `.git`, `node_modules` and other hidden directories) and classifies every file: build output, large files over 1 MB, lockfiles, logs, binary payloads, secret-like files and environment templates. It prints a 0–100 score, the bytes lost per category, the noisy files, the files worth a look before sharing, and the `.aiignore` entries that would fix it. Build-output directories are reported by their full path from the repo root (`packages/foo/dist/`, not a bare `dist/`) and rolled up into one row per directory, so the entry `--fix` writes matches nested build output too. Files the repo's `.aiignore` already lists are excluded from the scan entirely — they are what the agent will not be handed, so they are not noise any more. `context --fix` writes the suggestions into `.aiignore` for you; `--json` includes the fix outcome in the output.
|
|
96
96
|
|
|
97
97
|
The score is the *noise-only* part of ai-context-doctor's score: 100 minus the category-weighted share of noise bytes (build 40, large 25, lockfile 20, log 15). The full ai-context-doctor score also weighs context volume, one file dominating, file sprawl and binary payloads, so its composite number reads lower on the same repo. The file classification itself is the same.
|
|
98
98
|
|
|
@@ -111,7 +111,7 @@ Reads JUnit XML across CI runs — each subdirectory of `<junit-dir>` is one run
|
|
|
111
111
|
## Development
|
|
112
112
|
|
|
113
113
|
```sh
|
|
114
|
-
npm test # node:test, no extra dependencies —
|
|
114
|
+
npm test # node:test, no extra dependencies — 53 tests
|
|
115
115
|
npm run example # run the CLI against the demo fixture
|
|
116
116
|
```
|
|
117
117
|
|
package/lib/context.mjs
CHANGED
|
@@ -96,9 +96,15 @@ export function classifyPath(relativePath, size = 0) {
|
|
|
96
96
|
const parts = normalized.split('/');
|
|
97
97
|
const basename = parts[parts.length - 1];
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
// A noise directory is reported by its full path from the repo root
|
|
100
|
+
// (packages/foo/dist/), not just its name: two build directories in
|
|
101
|
+
// different parts of the tree would otherwise print the same label,
|
|
102
|
+
// and the .aiignore entry --fix writes has to match the whole path —
|
|
103
|
+
// a bare dist/ only ignores top-level build output.
|
|
104
|
+
for (let i = 0; i < parts.length - 1; i += 1) {
|
|
105
|
+
if (NOISE_DIRS.has(parts[i])) {
|
|
106
|
+
const dir = `${parts.slice(0, i + 1).join('/')}/`;
|
|
107
|
+
return { noise: { label: dir, reason: NOISE_DIRS.get(parts[i]) }, suggestion: dir };
|
|
102
108
|
}
|
|
103
109
|
}
|
|
104
110
|
if (LOCKFILES.has(basename)) {
|
|
@@ -239,12 +245,27 @@ export function scanDirectory(root, options = {}) {
|
|
|
239
245
|
walk(absolute, absolute, files, state);
|
|
240
246
|
|
|
241
247
|
const noise = [];
|
|
248
|
+
// One row per build-output directory, not one row per file inside it:
|
|
249
|
+
// a dist/ with hundreds of files would otherwise flood the noise list
|
|
250
|
+
// (and the score uses the summed bytes either way).
|
|
251
|
+
const dirNoise = new Map();
|
|
242
252
|
const review = [];
|
|
243
253
|
const suggestions = new Set();
|
|
244
254
|
for (const file of files) {
|
|
245
255
|
const result = classifyPath(file.relativePath, file.size);
|
|
246
256
|
if (result.noise) {
|
|
247
|
-
|
|
257
|
+
const item = { ...result.noise, bytes: file.size, path: file.relativePath.split(path.sep).join('/') };
|
|
258
|
+
if (item.label.endsWith('/')) {
|
|
259
|
+
const existing = dirNoise.get(item.label);
|
|
260
|
+
if (existing) existing.bytes += file.size;
|
|
261
|
+
else {
|
|
262
|
+
const aggregated = { label: item.label, reason: item.reason, bytes: file.size, path: item.label };
|
|
263
|
+
dirNoise.set(item.label, aggregated);
|
|
264
|
+
noise.push(aggregated);
|
|
265
|
+
}
|
|
266
|
+
} else {
|
|
267
|
+
noise.push(item);
|
|
268
|
+
}
|
|
248
269
|
if (result.suggestion) suggestions.add(result.suggestion);
|
|
249
270
|
} else if (result.review) {
|
|
250
271
|
review.push({ ...result.review, bytes: file.size, path: file.relativePath.split(path.sep).join('/') });
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"author":"WJDdidi-1","bin":{"dev-diagnosis":"bin/dev-diagnosis.js"},"bugs":{"url":"https://github.com/WJDdidi-1/dev-doctor/issues"},"description":"One offline CLI that diagnoses a repo the way four small tools do: context noise for AI agents, missing CLI commands, build-cache value, and flaky tests.","engines":{"node":">=18"},"files":["bin/","lib/","examples/","README.md","LICENSE","CHANGELOG.md"],"homepage":"https://github.com/WJDdidi-1/dev-doctor#readme","keywords":["cli","diagnostics","ai-coding","context","build-cache","flaky-tests","path","developer-tools","offline"],"license":"Apache-2.0","name":"dev-diagnosis-cli","repository":{"type":"git","url":"git+https://github.com/WJDdidi-1/dev-doctor.git"},"scripts":{"example":"node examples/demo.mjs","test":"node --test"},"type":"module","version":"0.1.
|
|
1
|
+
{"author":"WJDdidi-1","bin":{"dev-diagnosis":"bin/dev-diagnosis.js"},"bugs":{"url":"https://github.com/WJDdidi-1/dev-doctor/issues"},"description":"One offline CLI that diagnoses a repo the way four small tools do: context noise for AI agents, missing CLI commands, build-cache value, and flaky tests.","engines":{"node":">=18"},"files":["bin/","lib/","examples/","README.md","LICENSE","CHANGELOG.md"],"homepage":"https://github.com/WJDdidi-1/dev-doctor#readme","keywords":["cli","diagnostics","ai-coding","context","build-cache","flaky-tests","path","developer-tools","offline"],"license":"Apache-2.0","name":"dev-diagnosis-cli","repository":{"type":"git","url":"git+https://github.com/WJDdidi-1/dev-doctor.git"},"scripts":{"example":"node examples/demo.mjs","test":"node --test"},"type":"module","version":"0.1.3"}
|