debtlens 0.1.1 → 0.2.0
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 +18 -0
- package/README.md +21 -9
- package/dist/cli/index.js +83 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/config/mergeConfig.js +1 -0
- package/dist/config/mergeConfig.js.map +1 -1
- package/dist/core/scan.js +33 -18
- package/dist/core/scan.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/detectors/duplicateLogic.js +3 -0
- package/dist/detectors/duplicateLogic.js.map +1 -1
- package/dist/detectors/effectComplexity.js +4 -3
- package/dist/detectors/effectComplexity.js.map +1 -1
- package/dist/reporters/sarifReporter.js +2 -2
- package/dist/reporters/sarifReporter.js.map +1 -1
- package/dist/utils/git.d.ts +6 -0
- package/dist/utils/git.js +39 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/packageInfo.d.ts +1 -0
- package/dist/utils/packageInfo.js +22 -0
- package/dist/utils/packageInfo.js.map +1 -0
- package/docs/good-first-issues.md +36 -34
- package/docs/rules.md +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All notable changes to DebtLens are documented here. This project adheres to
|
|
4
4
|
[Semantic Versioning](https://semver.org/).
|
|
5
5
|
|
|
6
|
+
## [0.2.0] - 2026-06-06
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- **`debtlens rules`** command to list built-in rule ids, default severities, and
|
|
10
|
+
descriptions in terminal or JSON format.
|
|
11
|
+
- **`--staged`** scan mode for pre-commit workflows. Staged scans read staged git blob
|
|
12
|
+
contents, so unstaged edits in the same file are not reported.
|
|
13
|
+
- `effect-complexity` now covers `useLayoutEffect` and `useInsertionEffect` in addition
|
|
14
|
+
to `useEffect`.
|
|
15
|
+
- `duplicate-logic` now emits an advisory warning when `duplicate-logic.maxSnippets`
|
|
16
|
+
caps comparison coverage. JSON reports include the same warning under
|
|
17
|
+
`summary.warnings`.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- CLI `--version` and SARIF `tool.driver.version` now share the package version from
|
|
21
|
+
`package.json`.
|
|
22
|
+
- Contributor issue docs now reflect completed issue status after the `0.2.0` batch.
|
|
23
|
+
|
|
6
24
|
## [0.1.1] - 2026-06-01
|
|
7
25
|
|
|
8
26
|
### Added
|
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ DebtLens gives maintainers and newer contributors a neutral, explainable report
|
|
|
59
59
|
| --- | --- | --- |
|
|
60
60
|
| `large-component` | React-style components with too many lines, hooks, or branch points | Medium |
|
|
61
61
|
| `state-sprawl` | Components/hooks with many local stateful hooks | Medium |
|
|
62
|
-
| `effect-complexity` | Long or overloaded
|
|
62
|
+
| `effect-complexity` | Long or overloaded React effect hooks | Medium |
|
|
63
63
|
| `duplicate-logic` | Near-duplicate functions/components using normalized AST/text similarity | Medium |
|
|
64
64
|
| `dead-abstraction` | Thin wrappers that add little behavior | Low |
|
|
65
65
|
| `prop-drilling` | Components that forward many props to children | Medium |
|
|
@@ -82,6 +82,7 @@ npx debtlens scan
|
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
debtlens init # write a starter debtlens.config.json (use --force to overwrite)
|
|
85
|
+
debtlens rules # list built-in rule ids and descriptions
|
|
85
86
|
debtlens scan [target]
|
|
86
87
|
```
|
|
87
88
|
|
|
@@ -100,10 +101,11 @@ Options:
|
|
|
100
101
|
--baseline <path> report only issues absent from this baseline file
|
|
101
102
|
--write-baseline [path] write current issues to a baseline file and exit
|
|
102
103
|
--changed [ref] scan only files changed vs HEAD (or vs <ref> if given)
|
|
104
|
+
--staged scan only files staged in git
|
|
103
105
|
--config <path> path to debtlens.config.json
|
|
104
106
|
--cwd <path> working directory
|
|
105
107
|
--no-color disable terminal color
|
|
106
|
-
-q, --quiet terminal only:
|
|
108
|
+
-q, --quiet terminal only: suppress per-finding detail
|
|
107
109
|
```
|
|
108
110
|
|
|
109
111
|
Examples:
|
|
@@ -130,10 +132,24 @@ debtlens scan --baseline debtlens-baseline.json --fail-on high
|
|
|
130
132
|
|
|
131
133
|
# Pull-request scan: only the files this branch changed vs main
|
|
132
134
|
debtlens scan --changed origin/main --fail-on high
|
|
135
|
+
|
|
136
|
+
# Pre-commit scan: only files currently staged in git
|
|
137
|
+
debtlens scan --staged --fail-on high
|
|
138
|
+
|
|
139
|
+
# List rule ids for config, CI, or --rules
|
|
140
|
+
debtlens rules
|
|
141
|
+
debtlens rules --format json
|
|
142
|
+
|
|
143
|
+
# Quiet terminal output: hide per-finding detail
|
|
144
|
+
debtlens scan --quiet
|
|
133
145
|
```
|
|
134
146
|
|
|
135
147
|
Baseline fingerprints are stable across line shifts, so moving existing code up or down does not resurface already-recorded debt — only genuinely new issues are reported.
|
|
136
148
|
|
|
149
|
+
When a scan reads zero files, DebtLens prints a stderr warning with likely causes such as include/exclude globs, the target path, `--cwd`, or an empty git file set from `--changed` / `--staged`. The warning is advisory and does not change the exit code for `--fail-on`.
|
|
150
|
+
|
|
151
|
+
When `duplicate-logic` reaches `duplicate-logic.maxSnippets`, DebtLens warns that duplicate comparisons were capped. JSON output includes the same advisory under `summary.warnings`.
|
|
152
|
+
|
|
137
153
|
## Configuration
|
|
138
154
|
|
|
139
155
|
Create `debtlens.config.json`:
|
|
@@ -212,6 +228,8 @@ jobs:
|
|
|
212
228
|
changed: origin/${{ github.base_ref }}
|
|
213
229
|
format: sarif
|
|
214
230
|
output: debtlens.sarif
|
|
231
|
+
thresholds: large-component.maxLines=300
|
|
232
|
+
quiet: true
|
|
215
233
|
fail-on: high
|
|
216
234
|
- uses: github/codeql-action/upload-sarif@v3
|
|
217
235
|
if: always()
|
|
@@ -219,7 +237,7 @@ jobs:
|
|
|
219
237
|
sarif_file: debtlens.sarif
|
|
220
238
|
```
|
|
221
239
|
|
|
222
|
-
Inputs: `target`, `min-severity`, `rules`, `fail-on`, `format`, `output`, `changed`, `baseline`, `config`, `working-directory`. Each maps to the matching `scan` flag. With `fail-on`, a qualifying issue fails the job (gating the merge); `if: always()` still uploads the SARIF so annotations appear even on a failing run.
|
|
240
|
+
Inputs: `target`, `min-severity`, `rules`, `fail-on`, `format`, `output`, `changed`, `baseline`, `config`, `write-baseline`, `thresholds`, `max-files`, `working-directory`, `quiet`. Each maps to the matching `scan` flag. `write-baseline` and `baseline` are mutually exclusive. With `fail-on`, a qualifying issue fails the job (gating the merge); `if: always()` still uploads the SARIF so annotations appear even on a failing run.
|
|
223
241
|
|
|
224
242
|
## Development
|
|
225
243
|
|
|
@@ -237,12 +255,6 @@ node dist/cli/index.js scan examples/react --min-severity info
|
|
|
237
255
|
|
|
238
256
|
DebtLens is currently a v0.1 proof-of-concept. The architecture is intentionally simple so maintainers can add rules quickly. The next milestones are documented in [`ROADMAP.md`](./ROADMAP.md), and starter contribution ideas are tracked in [`docs/good-first-issues.md`](./docs/good-first-issues.md).
|
|
239
257
|
|
|
240
|
-
## Positioning
|
|
241
|
-
|
|
242
|
-
DebtLens should be pitched as open-source maintainer infrastructure:
|
|
243
|
-
|
|
244
|
-
> AI-assisted development increases code throughput, but also increases review burden and architectural drift. DebtLens gives maintainers an explainable, open-source way to find maintainability debt before it ships.
|
|
245
|
-
|
|
246
258
|
## License
|
|
247
259
|
|
|
248
260
|
MIT
|
package/dist/cli/index.js
CHANGED
|
@@ -6,9 +6,10 @@ import { loadConfig } from "../config/loadConfig.js";
|
|
|
6
6
|
import { mergeConfig } from "../config/mergeConfig.js";
|
|
7
7
|
import { DEFAULT_BASELINE_FILENAME, applyBaseline, createBaseline, loadBaseline, writeBaseline } from "../core/baseline.js";
|
|
8
8
|
import { scan } from "../core/scan.js";
|
|
9
|
-
import { getChangedFiles } from "../utils/git.js";
|
|
9
|
+
import { getChangedFiles, getStagedFiles } from "../utils/git.js";
|
|
10
10
|
import { parseSeverity, severityRank } from "../core/severity.js";
|
|
11
|
-
import { detectorIds } from "../detectors/index.js";
|
|
11
|
+
import { allDetectors, detectorIds } from "../detectors/index.js";
|
|
12
|
+
import { packageVersion } from "../utils/packageInfo.js";
|
|
12
13
|
import { renderReport } from "../reporters/index.js";
|
|
13
14
|
import { runInit } from "./init.js";
|
|
14
15
|
import { parseCommaList, parseThresholds } from "./parseList.js";
|
|
@@ -16,7 +17,7 @@ const program = new Command();
|
|
|
16
17
|
program
|
|
17
18
|
.name("debtlens")
|
|
18
19
|
.description("Find maintainability debt common in fast-moving AI-assisted TypeScript and React codebases.")
|
|
19
|
-
.version(
|
|
20
|
+
.version(packageVersion);
|
|
20
21
|
program.command("scan")
|
|
21
22
|
.description("Scan a project, directory, or file for maintainability debt.")
|
|
22
23
|
.argument("[target]", "directory or file to scan", ".")
|
|
@@ -32,6 +33,7 @@ program.command("scan")
|
|
|
32
33
|
.option("--baseline <path>", "report only issues absent from this baseline file")
|
|
33
34
|
.option("--write-baseline [path]", "write current issues to a baseline file and exit")
|
|
34
35
|
.option("--changed [ref]", "scan only files changed vs HEAD (or vs <ref> if given)")
|
|
36
|
+
.option("--staged", "scan only files staged in git")
|
|
35
37
|
.option("--config <path>", "path to debtlens.config.json")
|
|
36
38
|
.option("--cwd <path>", "working directory", process.cwd())
|
|
37
39
|
.option("--no-color", "disable ANSI color in terminal output")
|
|
@@ -44,6 +46,10 @@ program.command("scan")
|
|
|
44
46
|
const minSeverity = parseSeverity(String(rawOptions.minSeverity ?? "low"), "low");
|
|
45
47
|
const failOn = rawOptions.failOn ? parseSeverity(String(rawOptions.failOn), "high") : undefined;
|
|
46
48
|
let changedFiles;
|
|
49
|
+
let fileContents;
|
|
50
|
+
if (rawOptions.staged === true && rawOptions.changed !== undefined) {
|
|
51
|
+
throw new Error("Use either --staged or --changed, not both.");
|
|
52
|
+
}
|
|
47
53
|
if (rawOptions.changed) {
|
|
48
54
|
const base = rawOptions.changed === true ? undefined : String(rawOptions.changed);
|
|
49
55
|
const changed = getChangedFiles(cwd, base);
|
|
@@ -54,6 +60,16 @@ program.command("scan")
|
|
|
54
60
|
changedFiles = changed.files;
|
|
55
61
|
}
|
|
56
62
|
}
|
|
63
|
+
else if (rawOptions.staged === true) {
|
|
64
|
+
const staged = getStagedFiles(cwd);
|
|
65
|
+
if (staged === null) {
|
|
66
|
+
process.stderr.write("DebtLens: --staged ignored (not a git repository).\n");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
changedFiles = staged.files;
|
|
70
|
+
fileContents = staged.contents;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
57
73
|
const options = mergeConfig(target, fileConfig, {
|
|
58
74
|
cwd,
|
|
59
75
|
include: parseCommaList(rawOptions.include),
|
|
@@ -63,11 +79,20 @@ program.command("scan")
|
|
|
63
79
|
minSeverity,
|
|
64
80
|
maxFiles: rawOptions.maxFiles,
|
|
65
81
|
changedFiles,
|
|
82
|
+
fileContents,
|
|
66
83
|
});
|
|
67
84
|
if (rawOptions.writeBaseline && rawOptions.baseline) {
|
|
68
85
|
throw new Error("Use either --write-baseline or --baseline, not both.");
|
|
69
86
|
}
|
|
70
87
|
const result = await scan(options);
|
|
88
|
+
if (result.summary.filesScanned === 0) {
|
|
89
|
+
process.stderr.write(buildZeroFilesScannedWarning(options.target, options.include, rawOptions.changed !== undefined || rawOptions.staged === true));
|
|
90
|
+
}
|
|
91
|
+
if (result.summary.warnings?.length) {
|
|
92
|
+
for (const warning of result.summary.warnings) {
|
|
93
|
+
process.stderr.write(`DebtLens warning: ${warning}\n`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
71
96
|
if (rawOptions.writeBaseline) {
|
|
72
97
|
const baselinePath = rawOptions.writeBaseline === true
|
|
73
98
|
? DEFAULT_BASELINE_FILENAME
|
|
@@ -98,6 +123,30 @@ program.command("scan")
|
|
|
98
123
|
process.exitCode = 1;
|
|
99
124
|
}
|
|
100
125
|
});
|
|
126
|
+
program.command("rules")
|
|
127
|
+
.description("List built-in DebtLens rule ids.")
|
|
128
|
+
.option("--format <format>", "terminal or json", "terminal")
|
|
129
|
+
.action((rawOptions) => {
|
|
130
|
+
try {
|
|
131
|
+
const format = parseRulesFormat(String(rawOptions.format ?? "terminal"));
|
|
132
|
+
const rules = allDetectors.map((detector) => ({
|
|
133
|
+
id: detector.id,
|
|
134
|
+
name: detector.name,
|
|
135
|
+
defaultSeverity: detector.defaultSeverity,
|
|
136
|
+
description: detector.description,
|
|
137
|
+
}));
|
|
138
|
+
if (format === "json") {
|
|
139
|
+
process.stdout.write(`${JSON.stringify({ rules }, null, 2)}\n`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
process.stdout.write(renderRulesTable(rules));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
146
|
+
process.stderr.write(`DebtLens failed: ${message}\n`);
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
101
150
|
program.command("init")
|
|
102
151
|
.description("Create a starter debtlens.config.json in the current directory.")
|
|
103
152
|
.option("--force", "overwrite an existing config file")
|
|
@@ -151,4 +200,35 @@ function parseFormat(value) {
|
|
|
151
200
|
return value;
|
|
152
201
|
throw new Error(`Invalid format "${value}". Expected terminal, json, markdown, or sarif.`);
|
|
153
202
|
}
|
|
203
|
+
function parseRulesFormat(value) {
|
|
204
|
+
if (value === "terminal" || value === "json")
|
|
205
|
+
return value;
|
|
206
|
+
throw new Error(`Invalid rules format "${value}". Expected terminal or json.`);
|
|
207
|
+
}
|
|
208
|
+
function renderRulesTable(rules) {
|
|
209
|
+
const idWidth = Math.max("Rule".length, ...rules.map((rule) => rule.id.length));
|
|
210
|
+
const severityWidth = Math.max("Severity".length, ...rules.map((rule) => rule.defaultSeverity.length));
|
|
211
|
+
const lines = [
|
|
212
|
+
`${"Rule".padEnd(idWidth)} ${"Severity".padEnd(severityWidth)} Description`,
|
|
213
|
+
`${"-".repeat(idWidth)} ${"-".repeat(severityWidth)} -----------`,
|
|
214
|
+
...rules.map((rule) => `${rule.id.padEnd(idWidth)} ${rule.defaultSeverity.padEnd(severityWidth)} ${rule.description}`),
|
|
215
|
+
];
|
|
216
|
+
return `${lines.join("\n")}\n`;
|
|
217
|
+
}
|
|
218
|
+
function buildZeroFilesScannedWarning(target, include, usedGitFileFilter) {
|
|
219
|
+
const hints = [
|
|
220
|
+
"check your include/exclude globs",
|
|
221
|
+
"verify the target path or --cwd",
|
|
222
|
+
];
|
|
223
|
+
if (usedGitFileFilter) {
|
|
224
|
+
hints.push("confirm the git file filter resolves to tracked files");
|
|
225
|
+
}
|
|
226
|
+
return [
|
|
227
|
+
"DebtLens warning: scanned 0 files.",
|
|
228
|
+
`Target: ${target}`,
|
|
229
|
+
`Include globs: ${include.join(", ")}`,
|
|
230
|
+
`Likely causes: ${hints.join("; ")}.`,
|
|
231
|
+
"",
|
|
232
|
+
].join("\n");
|
|
233
|
+
}
|
|
154
234
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5H,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ export function mergeConfig(target, fileConfig, cliOptions) {
|
|
|
25
25
|
...(fileConfig.propDrilling?.ignoreComponents ?? []),
|
|
26
26
|
],
|
|
27
27
|
changedFiles: cliOptions.changedFiles,
|
|
28
|
+
fileContents: cliOptions.fileContents,
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
//# sourceMappingURL=mergeConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeConfig.js","sourceRoot":"","sources":["../../src/config/mergeConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,UAA0B,EAAE,UAAsB;IAC5F,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO;QACtG,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,OAAO;YACxB,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;SAC9B;QACD,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,IAAI,aAAa,CAAC,WAAW;QAC1F,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;QACrE,UAAU,EAAE;YACV,GAAG,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;SACjC;QACD,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ;QAC9E,UAAU,EAAE,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;QAC7E,4BAA4B,EAAE;YAC5B,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,gBAAgB,IAAI,EAAE,CAAC;YACvD,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,gBAAgB,IAAI,EAAE,CAAC;SACrD;QACD,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"mergeConfig.js","sourceRoot":"","sources":["../../src/config/mergeConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,UAA0B,EAAE,UAAsB;IAC5F,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO;QACtG,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,OAAO;YACxB,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;SAC9B;QACD,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,IAAI,aAAa,CAAC,WAAW;QAC1F,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;QACrE,UAAU,EAAE;YACV,GAAG,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;SACjC;QACD,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ;QAC9E,UAAU,EAAE,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;QAC7E,4BAA4B,EAAE;YAC5B,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,gBAAgB,IAAI,EAAE,CAAC;YACvD,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,gBAAgB,IAAI,EAAE,CAAC;SACrD;QACD,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC;AACJ,CAAC"}
|
package/dist/core/scan.js
CHANGED
|
@@ -19,24 +19,32 @@ export async function scan(options) {
|
|
|
19
19
|
});
|
|
20
20
|
const files = [];
|
|
21
21
|
for (const absolutePath of filePaths) {
|
|
22
|
-
const
|
|
22
|
+
const contentOverride = getContentOverride(options, absolutePath);
|
|
23
|
+
const sourceFile = contentOverride === undefined
|
|
24
|
+
? project.addSourceFileAtPathIfExists(absolutePath)
|
|
25
|
+
: project.createSourceFile(absolutePath, contentOverride, { overwrite: true });
|
|
23
26
|
if (!sourceFile)
|
|
24
27
|
continue;
|
|
25
28
|
files.push({
|
|
26
29
|
absolutePath,
|
|
27
30
|
relativePath: relative(options.target, absolutePath).replaceAll("\\", "/"),
|
|
28
|
-
content: readFileSync(absolutePath, "utf8"),
|
|
31
|
+
content: contentOverride ?? readFileSync(absolutePath, "utf8"),
|
|
29
32
|
sourceFile,
|
|
30
33
|
});
|
|
31
34
|
}
|
|
32
35
|
const detectors = selectDetectors(options.rules);
|
|
33
36
|
const issues = [];
|
|
37
|
+
const warnings = [];
|
|
34
38
|
for (const detector of detectors) {
|
|
35
39
|
const detectorIssues = await detector.detect({
|
|
36
40
|
project,
|
|
37
41
|
files,
|
|
38
42
|
options,
|
|
39
43
|
getThreshold: (key, fallback) => getThreshold(options, key, fallback),
|
|
44
|
+
addWarning: (warning) => {
|
|
45
|
+
if (!warnings.includes(warning))
|
|
46
|
+
warnings.push(warning);
|
|
47
|
+
},
|
|
40
48
|
});
|
|
41
49
|
issues.push(...detectorIssues.filter((issue) => meetsMinSeverity(issue.severity, options.minSeverity)));
|
|
42
50
|
}
|
|
@@ -49,24 +57,26 @@ export async function scan(options) {
|
|
|
49
57
|
return byFile;
|
|
50
58
|
return (a.location?.startLine ?? 0) - (b.location?.startLine ?? 0);
|
|
51
59
|
});
|
|
60
|
+
const summary = {
|
|
61
|
+
totalIssues: issues.length,
|
|
62
|
+
bySeverity: {
|
|
63
|
+
info: issues.filter((issue) => issue.severity === "info").length,
|
|
64
|
+
low: issues.filter((issue) => issue.severity === "low").length,
|
|
65
|
+
medium: issues.filter((issue) => issue.severity === "medium").length,
|
|
66
|
+
high: issues.filter((issue) => issue.severity === "high").length,
|
|
67
|
+
},
|
|
68
|
+
byRule: issues.reduce((accumulator, issue) => {
|
|
69
|
+
accumulator[issue.ruleId] = (accumulator[issue.ruleId] ?? 0) + 1;
|
|
70
|
+
return accumulator;
|
|
71
|
+
}, {}),
|
|
72
|
+
filesScanned: files.length,
|
|
73
|
+
rulesRun: detectors.length,
|
|
74
|
+
elapsedMs: Date.now() - startedAt,
|
|
75
|
+
...(warnings.length ? { warnings } : {}),
|
|
76
|
+
};
|
|
52
77
|
return {
|
|
53
78
|
issues,
|
|
54
|
-
summary
|
|
55
|
-
totalIssues: issues.length,
|
|
56
|
-
bySeverity: {
|
|
57
|
-
info: issues.filter((issue) => issue.severity === "info").length,
|
|
58
|
-
low: issues.filter((issue) => issue.severity === "low").length,
|
|
59
|
-
medium: issues.filter((issue) => issue.severity === "medium").length,
|
|
60
|
-
high: issues.filter((issue) => issue.severity === "high").length,
|
|
61
|
-
},
|
|
62
|
-
byRule: issues.reduce((accumulator, issue) => {
|
|
63
|
-
accumulator[issue.ruleId] = (accumulator[issue.ruleId] ?? 0) + 1;
|
|
64
|
-
return accumulator;
|
|
65
|
-
}, {}),
|
|
66
|
-
filesScanned: files.length,
|
|
67
|
-
rulesRun: detectors.length,
|
|
68
|
-
elapsedMs: Date.now() - startedAt,
|
|
69
|
-
},
|
|
79
|
+
summary,
|
|
70
80
|
options: {
|
|
71
81
|
target: options.target,
|
|
72
82
|
include: options.include,
|
|
@@ -110,6 +120,11 @@ function canonicalize(path) {
|
|
|
110
120
|
return path;
|
|
111
121
|
}
|
|
112
122
|
}
|
|
123
|
+
function getContentOverride(options, absolutePath) {
|
|
124
|
+
if (!options.fileContents)
|
|
125
|
+
return undefined;
|
|
126
|
+
return options.fileContents[canonicalize(absolutePath)] ?? options.fileContents[absolutePath];
|
|
127
|
+
}
|
|
113
128
|
function selectDetectors(ruleIds) {
|
|
114
129
|
if (!ruleIds || ruleIds.length === 0) {
|
|
115
130
|
return allDetectors;
|
package/dist/core/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/core/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,eAAe,EAAE;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;YACxB,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,YAAY,EAAE,IAAI;SACnB;QACD,2BAA2B,EAAE,IAAI;KAClC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/core/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,eAAe,EAAE;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;YACxB,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,YAAY,EAAE,IAAI;SACnB;QACD,2BAA2B,EAAE,IAAI;KAClC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,eAAe,KAAK,SAAS;YAC9C,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,YAAY,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,KAAK,CAAC,IAAI,CAAC;YACT,YAAY;YACZ,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;YAC1E,OAAO,EAAE,eAAe,IAAI,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9D,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAC3C,OAAO;YACP,KAAK;YACL,OAAO;YACP,YAAY,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC;YACrE,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAChC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,UAAU,EAAE;YACV,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;YAChE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM;YAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM;YACpE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;SACjE;QACD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAyB,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YACnE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,WAAW,CAAC;QACrB,CAAC,EAAE,EAAE,CAAC;QACN,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,QAAQ,EAAE,SAAS,CAAC,MAAM;QAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QACjC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,OAAO;QACP,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAoB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC9B,kFAAkF;IAClF,0EAA0E;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY;QAClC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QACrE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QACpC,GAAG,EAAE,OAAO,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,OAAO,CAAC,OAAO;QACvB,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAoB,EAAE,YAAoB;IACpE,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,eAAe,CAAC,OAA6B;IACpD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC;IAE5G,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB,EAAE,GAAW,EAAE,QAAgB;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -55,6 +55,8 @@ export interface ScanOptions {
|
|
|
55
55
|
vocabulary?: Record<string, string[]>;
|
|
56
56
|
/** When set, only scan files whose absolute path is in this list (--changed mode). */
|
|
57
57
|
changedFiles?: string[];
|
|
58
|
+
/** Absolute file path -> source text override, used when scanning staged git blobs. */
|
|
59
|
+
fileContents?: Record<string, string>;
|
|
58
60
|
/** Prop-drilling rule configuration. */
|
|
59
61
|
propDrillingIgnoreComponents?: string[];
|
|
60
62
|
}
|
|
@@ -72,12 +74,14 @@ export interface CliOptions {
|
|
|
72
74
|
configPath?: string;
|
|
73
75
|
noColor?: boolean;
|
|
74
76
|
changedFiles?: string[];
|
|
77
|
+
fileContents?: Record<string, string>;
|
|
75
78
|
}
|
|
76
79
|
export interface DetectorContext {
|
|
77
80
|
project: Project;
|
|
78
81
|
files: SourceFileInfo[];
|
|
79
82
|
options: ScanOptions;
|
|
80
83
|
getThreshold: (key: string, fallback: number) => number;
|
|
84
|
+
addWarning: (warning: string) => void;
|
|
81
85
|
}
|
|
82
86
|
export interface Detector {
|
|
83
87
|
id: string;
|
|
@@ -94,6 +98,7 @@ export interface ScanSummary {
|
|
|
94
98
|
filesScanned: number;
|
|
95
99
|
rulesRun: number;
|
|
96
100
|
elapsedMs: number;
|
|
101
|
+
warnings?: string[];
|
|
97
102
|
}
|
|
98
103
|
export interface ScanResult {
|
|
99
104
|
issues: DebtIssue[];
|
|
@@ -37,6 +37,9 @@ export const duplicateLogicDetector = {
|
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
if (snippets.length > maxSnippets) {
|
|
41
|
+
context.addWarning(`duplicate-logic inspected ${maxSnippets} of ${snippets.length} eligible snippets because duplicate-logic.maxSnippets is capped.`);
|
|
42
|
+
}
|
|
40
43
|
const limited = snippets.slice(0, maxSnippets);
|
|
41
44
|
const seenPairs = new Set();
|
|
42
45
|
for (let i = 0; i < limited.length; i += 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicateLogic.js","sourceRoot":"","sources":["../../src/detectors/duplicateLogic.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"duplicateLogic.js","sourceRoot":"","sources":["../../src/detectors/duplicateLogic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Node, SyntaxKind } from "ts-morph";
|
|
2
2
|
import { createIssue } from "../utils/createIssue.js";
|
|
3
3
|
import { nodeLineSpan } from "../utils/lines.js";
|
|
4
|
+
const EFFECT_HOOKS = new Set(["useEffect", "useLayoutEffect", "useInsertionEffect"]);
|
|
4
5
|
export const effectComplexityDetector = {
|
|
5
6
|
id: "effect-complexity",
|
|
6
7
|
name: "Effect complexity",
|
|
7
|
-
description: "Flags
|
|
8
|
+
description: "Flags React effect hooks that are long, branchy, or overloaded with dependencies.",
|
|
8
9
|
defaultSeverity: "medium",
|
|
9
10
|
tags: ["react", "effects", "complexity"],
|
|
10
11
|
detect(context) {
|
|
@@ -19,7 +20,7 @@ export const effectComplexityDetector = {
|
|
|
19
20
|
: Node.isPropertyAccessExpression(expression)
|
|
20
21
|
? expression.getName()
|
|
21
22
|
: undefined;
|
|
22
|
-
if (expressionName
|
|
23
|
+
if (!expressionName || !EFFECT_HOOKS.has(expressionName))
|
|
23
24
|
continue;
|
|
24
25
|
const [callback, dependencies] = call.getArguments();
|
|
25
26
|
if (!callback)
|
|
@@ -47,7 +48,7 @@ export const effectComplexityDetector = {
|
|
|
47
48
|
confidence: 0.8,
|
|
48
49
|
file: file.relativePath,
|
|
49
50
|
location: { startLine: span.startLine, endLine: span.endLine },
|
|
50
|
-
message: `This
|
|
51
|
+
message: `This ${expressionName} spans ${span.lines} lines, has ${dependencyCount} dependencies, ${branchCount} branches, and ${callCount} nested calls.`,
|
|
51
52
|
evidence: [
|
|
52
53
|
`Lines: ${span.lines} / ${maxLines}`,
|
|
53
54
|
`Dependencies: ${dependencyCount} / ${maxDependencies}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectComplexity.js","sourceRoot":"","sources":["../../src/detectors/effectComplexity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAChD,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"effectComplexity.js","sourceRoot":"","sources":["../../src/detectors/effectComplexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allDetectors } from "../detectors/index.js";
|
|
2
|
-
|
|
2
|
+
import { packageVersion } from "../utils/packageInfo.js";
|
|
3
3
|
const INFORMATION_URI = "https://github.com/ColumbusLabs/debtlens";
|
|
4
4
|
function toSarifLevel(severity) {
|
|
5
5
|
switch (severity) {
|
|
@@ -64,7 +64,7 @@ export function renderSarif(result) {
|
|
|
64
64
|
driver: {
|
|
65
65
|
name: "DebtLens",
|
|
66
66
|
informationUri: INFORMATION_URI,
|
|
67
|
-
version:
|
|
67
|
+
version: packageVersion,
|
|
68
68
|
rules,
|
|
69
69
|
},
|
|
70
70
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarifReporter.js","sourceRoot":"","sources":["../../src/reporters/sarifReporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"sarifReporter.js","sourceRoot":"","sources":["../../src/reporters/sarifReporter.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare function isGitRepo(cwd: string): boolean;
|
|
|
2
2
|
export interface ChangedFiles {
|
|
3
3
|
root: string;
|
|
4
4
|
files: string[];
|
|
5
|
+
contents?: Record<string, string>;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
7
8
|
* Collect changed files as absolute paths. Returns `null` when `cwd` is not inside a
|
|
@@ -13,3 +14,8 @@ export interface ChangedFiles {
|
|
|
13
14
|
* - Deletions are excluded (`--diff-filter=d`) since deleted files cannot be scanned.
|
|
14
15
|
*/
|
|
15
16
|
export declare function getChangedFiles(cwd: string, base?: string): ChangedFiles | null;
|
|
17
|
+
/**
|
|
18
|
+
* Collect staged files as absolute paths for pre-commit scans. Returns `null` when
|
|
19
|
+
* `cwd` is not inside a git work tree, matching `getChangedFiles` graceful behavior.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getStagedFiles(cwd: string): ChangedFiles | null;
|
package/dist/utils/git.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
2
3
|
import { resolve } from "node:path";
|
|
3
4
|
function git(cwd, args) {
|
|
5
|
+
return gitRaw(cwd, args).trim();
|
|
6
|
+
}
|
|
7
|
+
function gitRaw(cwd, args) {
|
|
4
8
|
return execFileSync("git", args, {
|
|
5
9
|
cwd,
|
|
6
10
|
encoding: "utf8",
|
|
7
11
|
stdio: ["ignore", "pipe", "ignore"],
|
|
8
|
-
})
|
|
12
|
+
});
|
|
9
13
|
}
|
|
10
14
|
function gitSafe(cwd, args) {
|
|
11
15
|
try {
|
|
@@ -65,4 +69,38 @@ export function getChangedFiles(cwd, base) {
|
|
|
65
69
|
add(gitSafe(cwd, ["ls-files", "--others", "--exclude-standard"]));
|
|
66
70
|
return { root, files: [...relative].map((path) => resolve(root, path)) };
|
|
67
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Collect staged files as absolute paths for pre-commit scans. Returns `null` when
|
|
74
|
+
* `cwd` is not inside a git work tree, matching `getChangedFiles` graceful behavior.
|
|
75
|
+
*/
|
|
76
|
+
export function getStagedFiles(cwd) {
|
|
77
|
+
if (!isGitRepo(cwd))
|
|
78
|
+
return null;
|
|
79
|
+
let root;
|
|
80
|
+
try {
|
|
81
|
+
root = git(cwd, ["rev-parse", "--show-toplevel"]);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const output = git(cwd, ["diff", "--cached", "--name-only", "--diff-filter=d"]);
|
|
87
|
+
const relativePaths = output
|
|
88
|
+
.split("\n")
|
|
89
|
+
.map((line) => line.trim())
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
const files = relativePaths.map((path) => resolve(root, path));
|
|
92
|
+
const contents = Object.fromEntries(relativePaths.map((path) => {
|
|
93
|
+
const absolutePath = resolve(root, path);
|
|
94
|
+
return [canonicalize(absolutePath), gitRaw(cwd, ["show", `:${path}`])];
|
|
95
|
+
}));
|
|
96
|
+
return { root, files, contents };
|
|
97
|
+
}
|
|
98
|
+
function canonicalize(path) {
|
|
99
|
+
try {
|
|
100
|
+
return realpathSync.native(path);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return path;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
68
106
|
//# sourceMappingURL=git.js.map
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;KACpC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,MAAM,CAAC,GAAW,EAAE,IAAc;IACzC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;KACpC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,IAAc;IAC1C,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,KAAK,MAAM,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,IAAa;IACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,EAAE;QAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO;gBAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,+DAA+D;IAC/D,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAElE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,MAAM;SACzB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const packageVersion: string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
export const packageVersion = readPackageVersion();
|
|
3
|
+
function readPackageVersion() {
|
|
4
|
+
const candidates = [
|
|
5
|
+
new URL("../package.json", import.meta.url),
|
|
6
|
+
new URL("../../package.json", import.meta.url),
|
|
7
|
+
];
|
|
8
|
+
let lastError;
|
|
9
|
+
for (const candidate of candidates) {
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(readFileSync(candidate, "utf8"));
|
|
12
|
+
if (parsed.version)
|
|
13
|
+
return parsed.version;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
lastError = error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const message = lastError instanceof Error ? lastError.message : String(lastError);
|
|
20
|
+
throw new Error(`Could not read package.json version: ${message}`);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=packageInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageInfo.js","sourceRoot":"","sources":["../../src/utils/packageInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAMvC,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;AAEnD,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAAG;QACjB,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3C,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC;IACF,IAAI,SAAkB,CAAC;IAEvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAgB,CAAC;YAC1E,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -5,16 +5,18 @@ issue with acceptance criteria. See [`CONTRIBUTING.md`](../CONTRIBUTING.md) for
|
|
|
5
5
|
|
|
6
6
|
**Labels:** `good first issue` (general) · `good-first-rule` (detector/rule work)
|
|
7
7
|
|
|
8
|
+
Statuses reflect the current repository surface. **Done** means the GitHub issue is closed.
|
|
9
|
+
|
|
8
10
|
## Rules
|
|
9
11
|
|
|
10
|
-
| # | Task | Issue |
|
|
11
|
-
| --- | --- | --- |
|
|
12
|
-
| 1 | Make the `prop-drilling` host-component list configurable | [#1](https://github.com/ColumbusLabs/DebtLens/issues/1) |
|
|
13
|
-
| 2 | Teach `large-component` to recognize `memo`, `forwardRef`, and class components | [#2](https://github.com/ColumbusLabs/DebtLens/issues/2) |
|
|
14
|
-
| 3 | Reduce `naming-drift` false positives on domain-rich apps | [#3](https://github.com/ColumbusLabs/DebtLens/issues/3) |
|
|
15
|
-
| 4 | Configurable markers for `todo-comment` | [#4](https://github.com/ColumbusLabs/DebtLens/issues/4) |
|
|
16
|
-
| 15 | Extend `effect-complexity` to `useLayoutEffect` / `useInsertionEffect` | [#15](https://github.com/ColumbusLabs/DebtLens/issues/15) |
|
|
17
|
-
| 27 | Warn when `duplicate-logic` hits `maxSnippets` cap | [#27](https://github.com/ColumbusLabs/DebtLens/issues/27) |
|
|
12
|
+
| # | Task | Issue | Status |
|
|
13
|
+
| --- | --- | --- | --- |
|
|
14
|
+
| 1 | Make the `prop-drilling` host-component list configurable | [#1](https://github.com/ColumbusLabs/DebtLens/issues/1) | Open |
|
|
15
|
+
| 2 | Teach `large-component` to recognize `memo`, `forwardRef`, and class components | [#2](https://github.com/ColumbusLabs/DebtLens/issues/2) | Open |
|
|
16
|
+
| 3 | Reduce `naming-drift` false positives on domain-rich apps | [#3](https://github.com/ColumbusLabs/DebtLens/issues/3) | Open |
|
|
17
|
+
| 4 | Configurable markers for `todo-comment` | [#4](https://github.com/ColumbusLabs/DebtLens/issues/4) | Open |
|
|
18
|
+
| 15 | Extend `effect-complexity` to `useLayoutEffect` / `useInsertionEffect` | [#15](https://github.com/ColumbusLabs/DebtLens/issues/15) | **Done** |
|
|
19
|
+
| 27 | Warn when `duplicate-logic` hits `maxSnippets` cap | [#27](https://github.com/ColumbusLabs/DebtLens/issues/27) | **Done** |
|
|
18
20
|
|
|
19
21
|
### 1. Make the `prop-drilling` host-component list configurable — [#1](https://github.com/ColumbusLabs/DebtLens/issues/1)
|
|
20
22
|
|
|
@@ -49,25 +51,25 @@ Allow projects to add/replace the marker patterns
|
|
|
49
51
|
|
|
50
52
|
- Verify: a custom marker fires; a removed default does not.
|
|
51
53
|
|
|
52
|
-
### 15. Extend `effect-complexity` to layout/insertion effects — [#15](https://github.com/ColumbusLabs/DebtLens/issues/15)
|
|
54
|
+
### 15. Extend `effect-complexity` to layout/insertion effects — [#15](https://github.com/ColumbusLabs/DebtLens/issues/15) (closed)
|
|
53
55
|
|
|
54
56
|
- Touch: `src/detectors/effectComplexity.ts`, `tests/detectors/effectComplexity.test.ts`.
|
|
55
57
|
- Verify: long `useLayoutEffect` fires; small `useInsertionEffect` does not.
|
|
56
58
|
|
|
57
|
-
### 27. Warn when `duplicate-logic` truncates comparisons — [#27](https://github.com/ColumbusLabs/DebtLens/issues/27)
|
|
59
|
+
### 27. Warn when `duplicate-logic` truncates comparisons — [#27](https://github.com/ColumbusLabs/DebtLens/issues/27) (closed)
|
|
58
60
|
|
|
59
61
|
- Touch: `src/detectors/duplicateLogic.ts`.
|
|
60
62
|
- Verify: exceeding `maxSnippets` emits a single clear warning.
|
|
61
63
|
|
|
62
64
|
## Reporters & integrations
|
|
63
65
|
|
|
64
|
-
| # | Task | Issue |
|
|
65
|
-
| --- | --- | --- |
|
|
66
|
-
| 5 | Add `helpUri` to SARIF rules | [#5](https://github.com/ColumbusLabs/DebtLens/issues/5) |
|
|
67
|
-
| 6 | Snapshot test for the Markdown reporter | [#6](https://github.com/ColumbusLabs/DebtLens/issues/6) |
|
|
68
|
-
| 7 | Publish the config JSON schema to a stable URL | [#7](https://github.com/ColumbusLabs/DebtLens/issues/7) |
|
|
69
|
-
| 16 | JSON reporter contract test | [#16](https://github.com/ColumbusLabs/DebtLens/issues/16) |
|
|
70
|
-
| 22 | PR comment reporter for Markdown findings | [#22](https://github.com/ColumbusLabs/DebtLens/issues/22) |
|
|
66
|
+
| # | Task | Issue | Status |
|
|
67
|
+
| --- | --- | --- | --- |
|
|
68
|
+
| 5 | Add `helpUri` to SARIF rules | [#5](https://github.com/ColumbusLabs/DebtLens/issues/5) | Open |
|
|
69
|
+
| 6 | Snapshot test for the Markdown reporter | [#6](https://github.com/ColumbusLabs/DebtLens/issues/6) | Open |
|
|
70
|
+
| 7 | Publish the config JSON schema to a stable URL | [#7](https://github.com/ColumbusLabs/DebtLens/issues/7) | Open |
|
|
71
|
+
| 16 | JSON reporter contract test | [#16](https://github.com/ColumbusLabs/DebtLens/issues/16) | **Done** |
|
|
72
|
+
| 22 | PR comment reporter for Markdown findings | [#22](https://github.com/ColumbusLabs/DebtLens/issues/22) | Open |
|
|
71
73
|
|
|
72
74
|
### 5. Add `helpUri` to SARIF rules — [#5](https://github.com/ColumbusLabs/DebtLens/issues/5)
|
|
73
75
|
|
|
@@ -87,7 +89,7 @@ The schema is generated to `schema/debtlens.config.schema.json`
|
|
|
87
89
|
([`src/config/schema.ts`](../src/config/schema.ts)). Wire up hosting (e.g. GitHub Pages
|
|
88
90
|
or SchemaStore) and confirm the `$schema` URL in the `init` template resolves.
|
|
89
91
|
|
|
90
|
-
### 16. JSON reporter contract test — [#16](https://github.com/ColumbusLabs/DebtLens/issues/16)
|
|
92
|
+
### 16. JSON reporter contract test — [#16](https://github.com/ColumbusLabs/DebtLens/issues/16) (closed)
|
|
91
93
|
|
|
92
94
|
- Touch: `src/reporters/jsonReporter.ts`, new `tests/reporters/jsonReporter.test.ts`.
|
|
93
95
|
- Verify: parsed output includes stable `issues`, `summary`, `options` keys.
|
|
@@ -103,14 +105,14 @@ Format scan results for GitHub PR comments (roadmap v0.3). Larger than a single
|
|
|
103
105
|
| 8 | Summary-only `--quiet` output mode | [#8](https://github.com/ColumbusLabs/DebtLens/issues/8) | **Done** |
|
|
104
106
|
| 9 | Respect `.gitignore` when resolving files | [#9](https://github.com/ColumbusLabs/DebtLens/issues/9) | Open |
|
|
105
107
|
| 10 | False-positive guidance per rule in docs | [#10](https://github.com/ColumbusLabs/DebtLens/issues/10) | **Done** |
|
|
106
|
-
| 14 | Document `--quiet` in README and Action | [#14](https://github.com/ColumbusLabs/DebtLens/issues/14) |
|
|
107
|
-
| 17 | Integration test for `scan()` on `examples/react` | [#17](https://github.com/ColumbusLabs/DebtLens/issues/17) |
|
|
108
|
-
| 18 | Read CLI/SARIF version from `package.json` | [#18](https://github.com/ColumbusLabs/DebtLens/issues/18) |
|
|
109
|
-
| 19 | `debtlens rules` command | [#19](https://github.com/ColumbusLabs/DebtLens/issues/19) |
|
|
110
|
-
| 20 | Warn when scan resolves zero files | [#20](https://github.com/ColumbusLabs/DebtLens/issues/20) |
|
|
111
|
-
| 21 | `--staged` mode for pre-commit scans | [#21](https://github.com/ColumbusLabs/DebtLens/issues/21) |
|
|
112
|
-
| 24 | Action: `write-baseline`, `thresholds`, `max-files` | [#24](https://github.com/ColumbusLabs/DebtLens/issues/24) |
|
|
113
|
-
| 28 | CI smoke scan for RN and Next examples | [#28](https://github.com/ColumbusLabs/DebtLens/issues/28) |
|
|
108
|
+
| 14 | Document `--quiet` in README and Action | [#14](https://github.com/ColumbusLabs/DebtLens/issues/14) | **Done** |
|
|
109
|
+
| 17 | Integration test for `scan()` on `examples/react` | [#17](https://github.com/ColumbusLabs/DebtLens/issues/17) | **Done** |
|
|
110
|
+
| 18 | Read CLI/SARIF version from `package.json` | [#18](https://github.com/ColumbusLabs/DebtLens/issues/18) | **Done** |
|
|
111
|
+
| 19 | `debtlens rules` command | [#19](https://github.com/ColumbusLabs/DebtLens/issues/19) | **Done** |
|
|
112
|
+
| 20 | Warn when scan resolves zero files | [#20](https://github.com/ColumbusLabs/DebtLens/issues/20) | **Done** |
|
|
113
|
+
| 21 | `--staged` mode for pre-commit scans | [#21](https://github.com/ColumbusLabs/DebtLens/issues/21) | **Done** |
|
|
114
|
+
| 24 | Action: `write-baseline`, `thresholds`, `max-files` | [#24](https://github.com/ColumbusLabs/DebtLens/issues/24) | **Done** |
|
|
115
|
+
| 28 | CI smoke scan for RN and Next examples | [#28](https://github.com/ColumbusLabs/DebtLens/issues/28) | **Done** |
|
|
114
116
|
|
|
115
117
|
### 8. Add a summary-only / `--quiet` output mode — [#8](https://github.com/ColumbusLabs/DebtLens/issues/8) (closed)
|
|
116
118
|
|
|
@@ -128,35 +130,35 @@ Optionally skip files ignored by git during a scan, in addition to the configure
|
|
|
128
130
|
Expand [`docs/rules.md`](./rules.md) with a "When this is a false positive" note per
|
|
129
131
|
rule, mirroring the guards in the detector tests.
|
|
130
132
|
|
|
131
|
-
### 14. Document `--quiet` in README and GitHub Action — [#14](https://github.com/ColumbusLabs/DebtLens/issues/14)
|
|
133
|
+
### 14. Document `--quiet` in README and GitHub Action — [#14](https://github.com/ColumbusLabs/DebtLens/issues/14) (closed)
|
|
132
134
|
|
|
133
135
|
- Touch: `README.md`, `action.yml`.
|
|
134
136
|
|
|
135
|
-
### 17. Integration test for `scan()` — [#17](https://github.com/ColumbusLabs/DebtLens/issues/17)
|
|
137
|
+
### 17. Integration test for `scan()` — [#17](https://github.com/ColumbusLabs/DebtLens/issues/17) (closed)
|
|
136
138
|
|
|
137
139
|
- Touch: `tests/core/scan.test.ts`, `examples/react/`.
|
|
138
140
|
|
|
139
|
-
### 18. Single source of truth for version — [#18](https://github.com/ColumbusLabs/DebtLens/issues/18)
|
|
141
|
+
### 18. Single source of truth for version — [#18](https://github.com/ColumbusLabs/DebtLens/issues/18) (closed)
|
|
140
142
|
|
|
141
143
|
- Touch: `src/cli/index.ts`, `src/reporters/sarifReporter.ts`, `package.json`.
|
|
142
144
|
|
|
143
|
-
### 19. `debtlens rules` command — [#19](https://github.com/ColumbusLabs/DebtLens/issues/19)
|
|
145
|
+
### 19. `debtlens rules` command — [#19](https://github.com/ColumbusLabs/DebtLens/issues/19) (closed)
|
|
144
146
|
|
|
145
147
|
List rule ids, names, default severities, and descriptions.
|
|
146
148
|
|
|
147
|
-
### 20. Warn on zero files scanned — [#20](https://github.com/ColumbusLabs/DebtLens/issues/20)
|
|
149
|
+
### 20. Warn on zero files scanned — [#20](https://github.com/ColumbusLabs/DebtLens/issues/20) (closed)
|
|
148
150
|
|
|
149
151
|
- Touch: `src/core/scan.ts`, `src/cli/index.ts`.
|
|
150
152
|
|
|
151
|
-
### 21. `--staged` git mode — [#21](https://github.com/ColumbusLabs/DebtLens/issues/21)
|
|
153
|
+
### 21. `--staged` git mode — [#21](https://github.com/ColumbusLabs/DebtLens/issues/21) (closed)
|
|
152
154
|
|
|
153
155
|
- Touch: `src/utils/git.ts`, `src/cli/index.ts`.
|
|
154
156
|
|
|
155
|
-
### 24. GitHub Action input gaps — [#24](https://github.com/ColumbusLabs/DebtLens/issues/24)
|
|
157
|
+
### 24. GitHub Action input gaps — [#24](https://github.com/ColumbusLabs/DebtLens/issues/24) (closed)
|
|
156
158
|
|
|
157
159
|
Expose `write-baseline`, `thresholds`, and `max-files` in `action.yml`.
|
|
158
160
|
|
|
159
|
-
### 28. CI example coverage — [#28](https://github.com/ColumbusLabs/DebtLens/issues/28)
|
|
161
|
+
### 28. CI example coverage — [#28](https://github.com/ColumbusLabs/DebtLens/issues/28) (closed)
|
|
160
162
|
|
|
161
163
|
Scan `examples/react-native` and `examples/next` in `.github/workflows/ci.yml`.
|
|
162
164
|
|
package/docs/rules.md
CHANGED
|
@@ -50,7 +50,7 @@ When this is a false positive:
|
|
|
50
50
|
|
|
51
51
|
## `effect-complexity`
|
|
52
52
|
|
|
53
|
-
Flags long, branchy, or overloaded `useEffect` calls.
|
|
53
|
+
Flags long, branchy, or overloaded `useEffect`, `useLayoutEffect`, and `useInsertionEffect` calls.
|
|
54
54
|
|
|
55
55
|
Default thresholds:
|
|
56
56
|
|
|
@@ -69,7 +69,7 @@ Good fixes:
|
|
|
69
69
|
When this is a false positive:
|
|
70
70
|
|
|
71
71
|
- the callback is small and focused
|
|
72
|
-
- the array literal belongs to another API instead of
|
|
72
|
+
- the array literal belongs to another API instead of a React effect hook
|
|
73
73
|
|
|
74
74
|
## `duplicate-logic`
|
|
75
75
|
|
|
@@ -81,6 +81,8 @@ Default thresholds:
|
|
|
81
81
|
- `duplicate-logic.minLines`: 8
|
|
82
82
|
- `duplicate-logic.maxSnippets`: 450
|
|
83
83
|
|
|
84
|
+
When more eligible snippets are found than `duplicate-logic.maxSnippets`, DebtLens caps pairwise comparisons and emits an advisory warning instead of silently truncating the search space.
|
|
85
|
+
|
|
84
86
|
Why it matters: AI assistants can produce plausible variants of the same logic in multiple files. Duplicate implementations make bug fixes and behavior changes harder.
|
|
85
87
|
|
|
86
88
|
Good fixes:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "debtlens",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Find maintainability debt common in fast-moving AI-assisted TypeScript, React, React Native, Expo, and Next.js codebases.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/ColumbusLabs/DebtLens#readme",
|