@vyuhlabs/dxkit 2.4.3 → 2.4.5
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 +347 -0
- package/README.md +15 -11
- package/dist/analyzers/health.js +9 -9
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/licenses/gather.js +1 -1
- package/dist/analyzers/licenses/gather.js.map +1 -1
- package/dist/analyzers/quality/gather.js +2 -2
- package/dist/analyzers/quality/gather.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +11 -2
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/tests/import-graph.d.ts.map +1 -1
- package/dist/analyzers/tests/import-graph.js +5 -0
- package/dist/analyzers/tests/import-graph.js.map +1 -1
- package/dist/analyzers/tests/index.d.ts.map +1 -1
- package/dist/analyzers/tests/index.js +2 -0
- package/dist/analyzers/tests/index.js.map +1 -1
- package/dist/analyzers/tests/types.d.ts +12 -2
- package/dist/analyzers/tests/types.d.ts.map +1 -1
- package/dist/analyzers/tools/coverage.d.ts +1 -1
- package/dist/analyzers/tools/coverage.d.ts.map +1 -1
- package/dist/analyzers/tools/coverage.js.map +1 -1
- package/dist/analyzers/tools/jacoco.d.ts +76 -0
- package/dist/analyzers/tools/jacoco.d.ts.map +1 -0
- package/dist/analyzers/tools/jacoco.js +228 -0
- package/dist/analyzers/tools/jacoco.js.map +1 -0
- package/dist/analyzers/tools/jscpd.d.ts +8 -7
- package/dist/analyzers/tools/jscpd.d.ts.map +1 -1
- package/dist/analyzers/tools/jscpd.js +30 -13
- package/dist/analyzers/tools/jscpd.js.map +1 -1
- package/dist/analyzers/tools/osv-scanner-fix.d.ts +20 -0
- package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
- package/dist/analyzers/tools/osv-scanner-fix.js +45 -20
- package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
- package/dist/analyzers/tools/osv-scanner-maven.d.ts +42 -0
- package/dist/analyzers/tools/osv-scanner-maven.d.ts.map +1 -0
- package/dist/analyzers/tools/osv-scanner-maven.js +161 -0
- package/dist/analyzers/tools/osv-scanner-maven.js.map +1 -0
- package/dist/analyzers/tools/runner.d.ts +47 -0
- package/dist/analyzers/tools/runner.d.ts.map +1 -1
- package/dist/analyzers/tools/runner.js +79 -0
- package/dist/analyzers/tools/runner.js.map +1 -1
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
- package/dist/analyzers/tools/tool-registry.js +47 -0
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +36 -2
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/languages/capabilities/index.d.ts +21 -12
- package/dist/languages/capabilities/index.d.ts.map +1 -1
- package/dist/languages/capabilities/index.js +47 -13
- package/dist/languages/capabilities/index.js.map +1 -1
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +11 -1
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/java.d.ts +67 -0
- package/dist/languages/java.d.ts.map +1 -0
- package/dist/languages/java.js +419 -0
- package/dist/languages/java.js.map +1 -0
- package/dist/languages/kotlin.d.ts +52 -0
- package/dist/languages/kotlin.d.ts.map +1 -0
- package/dist/languages/kotlin.js +404 -0
- package/dist/languages/kotlin.js.map +1 -0
- package/dist/languages/types.d.ts +9 -1
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/tools-cli.d.ts +16 -1
- package/dist/tools-cli.d.ts.map +1 -1
- package/dist/tools-cli.js +69 -6
- package/dist/tools-cli.js.map +1 -1
- package/dist/types.d.ts +12 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/templates/.claude/rules/java.md +11 -0
- package/templates/.claude/rules/kotlin.md +11 -0
- package/templates/configs/java/README.md +6 -0
- package/templates/configs/kotlin/README.md +6 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.kotlin = void 0;
|
|
37
|
+
exports.mapDetektSeverity = mapDetektSeverity;
|
|
38
|
+
exports.parseDetektCheckstyleXml = parseDetektCheckstyleXml;
|
|
39
|
+
exports.extractKotlinImportsRaw = extractKotlinImportsRaw;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const jacoco_1 = require("../analyzers/tools/jacoco");
|
|
44
|
+
const osv_scanner_maven_1 = require("../analyzers/tools/osv-scanner-maven");
|
|
45
|
+
const exclusions_1 = require("../analyzers/tools/exclusions");
|
|
46
|
+
const runner_1 = require("../analyzers/tools/runner");
|
|
47
|
+
const tool_registry_1 = require("../analyzers/tools/tool-registry");
|
|
48
|
+
// ─── Detection ──────────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Walk the project tree (bounded depth) looking for a `.kt` or `.kts`
|
|
51
|
+
* source file. Catches Kotlin projects that haven't yet adopted Gradle
|
|
52
|
+
* (rare but possible for libraries vendored as plain `src/` trees) and
|
|
53
|
+
* mixed JVM monorepos where Kotlin sits beside Java/Scala.
|
|
54
|
+
*/
|
|
55
|
+
function hasKotlinSourceWithinDepth(cwd, maxDepth = 3) {
|
|
56
|
+
function search(dir, depth) {
|
|
57
|
+
if (depth > maxDepth)
|
|
58
|
+
return false;
|
|
59
|
+
let entries;
|
|
60
|
+
try {
|
|
61
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
for (const e of entries) {
|
|
67
|
+
if (e.name.startsWith('.') ||
|
|
68
|
+
['node_modules', 'build', '.gradle', 'target'].includes(e.name)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (e.isFile() && (e.name.endsWith('.kt') || e.name.endsWith('.kts')))
|
|
72
|
+
return true;
|
|
73
|
+
if (e.isDirectory() && search(path.join(dir, e.name), depth + 1))
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return search(cwd, 0);
|
|
79
|
+
}
|
|
80
|
+
function detectKotlin(cwd) {
|
|
81
|
+
return ((0, runner_1.fileExists)(cwd, 'build.gradle.kts') ||
|
|
82
|
+
(0, runner_1.fileExists)(cwd, 'settings.gradle.kts') ||
|
|
83
|
+
(0, runner_1.fileExists)(cwd, 'build.gradle') ||
|
|
84
|
+
(0, runner_1.fileExists)(cwd, 'settings.gradle') ||
|
|
85
|
+
(0, runner_1.fileExists)(cwd, 'gradlew') ||
|
|
86
|
+
hasKotlinSourceWithinDepth(cwd, 3));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Manifest gate for capability providers. detectKotlin() activates the
|
|
90
|
+
* pack on bare `.kt` source dirs too (no build manifest), but several
|
|
91
|
+
* capabilities (depVulns, coverage) need a build-tool manifest to do
|
|
92
|
+
* anything useful. This helper is the second-line check inside each
|
|
93
|
+
* gather function — independent of detect() so providers fail cleanly
|
|
94
|
+
* even if D010 (inactive-pack pollution) is later closed by stack-aware
|
|
95
|
+
* `providersFor()`.
|
|
96
|
+
*/
|
|
97
|
+
function hasKotlinBuildManifest(cwd) {
|
|
98
|
+
return ((0, runner_1.fileExists)(cwd, 'build.gradle.kts') ||
|
|
99
|
+
(0, runner_1.fileExists)(cwd, 'build.gradle') ||
|
|
100
|
+
(0, runner_1.fileExists)(cwd, 'settings.gradle.kts') ||
|
|
101
|
+
(0, runner_1.fileExists)(cwd, 'settings.gradle') ||
|
|
102
|
+
(0, runner_1.fileExists)(cwd, 'pom.xml') ||
|
|
103
|
+
(0, runner_1.fileExists)(cwd, 'gradle.lockfile'));
|
|
104
|
+
}
|
|
105
|
+
// ─── Lint (detekt) ──────────────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Map detekt's lowercased Severity enum to dxkit's four-tier scheme.
|
|
108
|
+
* detekt 1.23+ emits `error|warning|info` (the `dev.detekt.api.Severity`
|
|
109
|
+
* enum lowercased — see CheckstyleOutputReportSpec in detekt's repo).
|
|
110
|
+
*
|
|
111
|
+
* Tiering rationale (no source-of-truth from detekt — they don't tier):
|
|
112
|
+
* - error → high (detekt's authors classify as a real defect)
|
|
113
|
+
* - warning → medium (style/maintainability concerns)
|
|
114
|
+
* - info → low (informational signals)
|
|
115
|
+
* - unknown → medium (defensive default — never trust an empty string)
|
|
116
|
+
*
|
|
117
|
+
* detekt's older `Defect`/`Style`/`Maintainability`/etc. taxonomy was
|
|
118
|
+
* collapsed in 1.23; we only need to recognise the lowercased modern
|
|
119
|
+
* names. Any future taxonomy change shows up here as an unknown bucket
|
|
120
|
+
* rather than silently miscounting.
|
|
121
|
+
*/
|
|
122
|
+
function mapDetektSeverity(severity) {
|
|
123
|
+
const s = severity.toLowerCase();
|
|
124
|
+
if (s === 'error')
|
|
125
|
+
return 'high';
|
|
126
|
+
if (s === 'warning')
|
|
127
|
+
return 'medium';
|
|
128
|
+
if (s === 'info')
|
|
129
|
+
return 'low';
|
|
130
|
+
return 'medium';
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Pure parser for detekt's Checkstyle XML report. The format is fixed
|
|
134
|
+
* (detekt's CheckstyleOutputReport renders verbatim per its 1.23 spec):
|
|
135
|
+
*
|
|
136
|
+
* <?xml version="1.0" encoding="UTF-8"?>
|
|
137
|
+
* <checkstyle version="4.3">
|
|
138
|
+
* <file name="src/main/Sample1.kt">
|
|
139
|
+
* <TAB><error line="11" column="1" severity="error" message="..." source="detekt.style/MagicNumber" />
|
|
140
|
+
* ...
|
|
141
|
+
* </file>
|
|
142
|
+
* </checkstyle>
|
|
143
|
+
*
|
|
144
|
+
* We tally `<error severity="...">` attribute values; we don't need the
|
|
145
|
+
* full file/line index because the lint envelope only carries
|
|
146
|
+
* SeverityCounts. Future enrichment (per-finding paths) would extend
|
|
147
|
+
* the parser without breaking this signature.
|
|
148
|
+
*
|
|
149
|
+
* Exported for unit tests; consumed by `gatherKotlinLintResult`.
|
|
150
|
+
*/
|
|
151
|
+
function parseDetektCheckstyleXml(raw) {
|
|
152
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
153
|
+
// Match each <error ...> element's severity attribute. `severity="X"`
|
|
154
|
+
// is mandatory in detekt's renderer; we still default to 'medium' for
|
|
155
|
+
// forward compat with hypothetical future detekt versions.
|
|
156
|
+
const re = /<error\s+[^>]*severity="([^"]*)"/g;
|
|
157
|
+
let m;
|
|
158
|
+
while ((m = re.exec(raw)) !== null) {
|
|
159
|
+
counts[mapDetektSeverity(m[1])]++;
|
|
160
|
+
}
|
|
161
|
+
return counts;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Single source of truth for the kotlin pack's lint gathering.
|
|
165
|
+
* Consumed by `kotlinLintProvider` (capability dispatcher).
|
|
166
|
+
*
|
|
167
|
+
* detekt is invoked with `--input <cwd>` to scan the whole project, and
|
|
168
|
+
* `--report xml:<tmp>` to produce a parseable Checkstyle XML. Default
|
|
169
|
+
* config is implicit; we don't pass `--build-upon-default-config` because
|
|
170
|
+
* 1) it's the default since detekt 1.23, and 2) projects that ship a
|
|
171
|
+
* `detekt.yml` get their own config respected automatically.
|
|
172
|
+
*
|
|
173
|
+
* Exit code: detekt exits 1 when issues are found and 2 on internal
|
|
174
|
+
* errors. We tolerate any non-fatal exit by reading the XML regardless;
|
|
175
|
+
* a missing/unparseable XML is treated as `unavailable`.
|
|
176
|
+
*/
|
|
177
|
+
function gatherKotlinLintResult(cwd) {
|
|
178
|
+
if (!hasKotlinBuildManifest(cwd) && !hasKotlinSourceWithinDepth(cwd, 3)) {
|
|
179
|
+
return { kind: 'unavailable', reason: 'no kotlin source' };
|
|
180
|
+
}
|
|
181
|
+
const detekt = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS.detekt, cwd);
|
|
182
|
+
if (!detekt.available || !detekt.path) {
|
|
183
|
+
return { kind: 'unavailable', reason: 'not installed' };
|
|
184
|
+
}
|
|
185
|
+
// detekt v1.23 cli supports `--report xml:<path>` only — no stdout
|
|
186
|
+
// form. Use a process-unique temp file so concurrent dxkit runs don't
|
|
187
|
+
// race on the same path.
|
|
188
|
+
const tmpFile = path.join(os.tmpdir(), `dxkit-detekt-${process.pid}-${Date.now()}.xml`);
|
|
189
|
+
try {
|
|
190
|
+
(0, runner_1.run)(`${detekt.path} --input . --report xml:${tmpFile} 2>/dev/null`, cwd, 120000);
|
|
191
|
+
let raw;
|
|
192
|
+
try {
|
|
193
|
+
raw = fs.readFileSync(tmpFile, 'utf-8');
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return { kind: 'unavailable', reason: 'no detekt output' };
|
|
197
|
+
}
|
|
198
|
+
const counts = parseDetektCheckstyleXml(raw);
|
|
199
|
+
const envelope = { schemaVersion: 1, tool: 'detekt', counts };
|
|
200
|
+
return { kind: 'success', envelope };
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
try {
|
|
204
|
+
fs.unlinkSync(tmpFile);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
/* best-effort cleanup */
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const kotlinLintProvider = {
|
|
212
|
+
source: 'kotlin',
|
|
213
|
+
async gather(cwd) {
|
|
214
|
+
const outcome = gatherKotlinLintResult(cwd);
|
|
215
|
+
return outcome.kind === 'success' ? outcome.envelope : null;
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
// ─── Coverage (JaCoCo XML) ──────────────────────────────────────────────────
|
|
219
|
+
//
|
|
220
|
+
// Parser, finder, and gather glue all live in `src/analyzers/tools/jacoco.ts`
|
|
221
|
+
// — language-agnostic SSOT (CLAUDE.md rule #2). The kotlin pack just
|
|
222
|
+
// declares its provider and delegates. Java pack does the same.
|
|
223
|
+
const kotlinCoverageProvider = {
|
|
224
|
+
source: 'kotlin',
|
|
225
|
+
async gather(cwd) {
|
|
226
|
+
return (0, jacoco_1.gatherJaCoCoCoverageResult)(cwd);
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
// ─── DepVulns (osv-scanner against Maven manifests) ─────────────────────────
|
|
230
|
+
//
|
|
231
|
+
// Parser + gather glue live in `src/analyzers/tools/osv-scanner-maven.ts`
|
|
232
|
+
// — language-agnostic SSOT (CLAUDE.md rule #2). Both kotlin and java
|
|
233
|
+
// packs delegate. parseOsvScannerMavenFindings is exported there for
|
|
234
|
+
// unit tests.
|
|
235
|
+
const kotlinDepVulnsProvider = {
|
|
236
|
+
source: 'kotlin',
|
|
237
|
+
async gather(cwd) {
|
|
238
|
+
const outcome = await (0, osv_scanner_maven_1.gatherOsvScannerMavenDepVulnsResult)(cwd, 'kotlin');
|
|
239
|
+
return outcome.kind === 'success' ? outcome.envelope : null;
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
// ─── Imports (regex extraction, no resolver) ────────────────────────────────
|
|
243
|
+
/**
|
|
244
|
+
* Capture Kotlin import specifiers from source text. Handles both
|
|
245
|
+
* `import com.foo.Bar` (single) and `import com.foo.*` (wildcard) plus
|
|
246
|
+
* the `import com.foo.Bar as Baz` alias form. Comments are stripped
|
|
247
|
+
* conservatively — single-line `//` and inline `/* ... *\/`. Multi-line
|
|
248
|
+
* `/* ... *\/` blocks containing `import` statements are not extracted
|
|
249
|
+
* (acceptable: comment-out-import is intentional non-use).
|
|
250
|
+
*
|
|
251
|
+
* Exported for unit tests; consumed by `gatherKotlinImportsResult`.
|
|
252
|
+
*/
|
|
253
|
+
function extractKotlinImportsRaw(content) {
|
|
254
|
+
const out = [];
|
|
255
|
+
// Strip line comments first so `// import foo` doesn't false-match.
|
|
256
|
+
const stripped = content.replace(/\/\/[^\n]*/g, '');
|
|
257
|
+
// `import` must start a statement (preceded only by whitespace at line
|
|
258
|
+
// start). Trailing `as Alias` is captured but discarded.
|
|
259
|
+
const re = /^\s*import\s+([A-Za-z_][\w.*]*)/gm;
|
|
260
|
+
let m;
|
|
261
|
+
while ((m = re.exec(stripped)) !== null) {
|
|
262
|
+
out.push(m[1]);
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Enumerate `.kt` / `.kts` files under cwd and capture per-file imports.
|
|
268
|
+
* Kotlin packages don't 1:1 map to file paths (a package `com.foo` can
|
|
269
|
+
* span many files in many directories), so we don't produce `edges` —
|
|
270
|
+
* the resolution would be heuristic and is best left to graphify if
|
|
271
|
+
* downstream consumers need it. Mirrors the rust pack's choice.
|
|
272
|
+
*/
|
|
273
|
+
function gatherKotlinImportsResult(cwd) {
|
|
274
|
+
const excludes = (0, exclusions_1.getFindExcludeFlags)(cwd);
|
|
275
|
+
const raw = (0, runner_1.run)(`find . -type f \\( -name "*.kt" -o -name "*.kts" \\) ${excludes} 2>/dev/null`, cwd);
|
|
276
|
+
if (!raw)
|
|
277
|
+
return null;
|
|
278
|
+
const extracted = new Map();
|
|
279
|
+
for (const line of raw.split('\n')) {
|
|
280
|
+
const p = line.trim();
|
|
281
|
+
if (!p)
|
|
282
|
+
continue;
|
|
283
|
+
const rel = p.replace(/^\.\//, '');
|
|
284
|
+
let content;
|
|
285
|
+
try {
|
|
286
|
+
content = fs.readFileSync(path.join(cwd, rel), 'utf-8');
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
extracted.set(rel, extractKotlinImportsRaw(content));
|
|
292
|
+
}
|
|
293
|
+
if (extracted.size === 0)
|
|
294
|
+
return null;
|
|
295
|
+
return {
|
|
296
|
+
schemaVersion: 1,
|
|
297
|
+
tool: 'kotlin-imports',
|
|
298
|
+
sourceExtensions: ['.kt', '.kts'],
|
|
299
|
+
extracted,
|
|
300
|
+
edges: new Map(),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const kotlinImportsProvider = {
|
|
304
|
+
source: 'kotlin',
|
|
305
|
+
async gather(cwd) {
|
|
306
|
+
return gatherKotlinImportsResult(cwd);
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
// ─── Test framework (gradle dependency text scan) ───────────────────────────
|
|
310
|
+
/**
|
|
311
|
+
* Detect the test framework by scanning gradle build files for known
|
|
312
|
+
* dependency coordinates. Order of precedence: Kotest → Spek → JUnit
|
|
313
|
+
* (Kotest/Spek typically sit alongside JUnit, and the more specific
|
|
314
|
+
* framework is the "primary" runner).
|
|
315
|
+
*
|
|
316
|
+
* Returns null when no gradle file exists or no known runner is
|
|
317
|
+
* declared — a polyglot Maven-only Kotlin project would skip this
|
|
318
|
+
* cleanly (no false positive on `pom.xml` lookups, until a Kotlin/Maven
|
|
319
|
+
* customer surfaces).
|
|
320
|
+
*/
|
|
321
|
+
function gatherKotlinTestFrameworkResult(cwd) {
|
|
322
|
+
const gradleFiles = ['build.gradle.kts', 'build.gradle'];
|
|
323
|
+
let combinedText = '';
|
|
324
|
+
for (const rel of gradleFiles) {
|
|
325
|
+
if (!(0, runner_1.fileExists)(cwd, rel))
|
|
326
|
+
continue;
|
|
327
|
+
try {
|
|
328
|
+
combinedText += fs.readFileSync(path.join(cwd, rel), 'utf-8') + '\n';
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
/* ignore unreadable */
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (!combinedText)
|
|
335
|
+
return null;
|
|
336
|
+
if (combinedText.includes('io.kotest:')) {
|
|
337
|
+
return { schemaVersion: 1, tool: 'kotlin', name: 'kotest' };
|
|
338
|
+
}
|
|
339
|
+
if (combinedText.includes('org.spekframework:') || combinedText.includes('spek-')) {
|
|
340
|
+
return { schemaVersion: 1, tool: 'kotlin', name: 'spek' };
|
|
341
|
+
}
|
|
342
|
+
if (combinedText.includes('junit') || combinedText.includes('JUnit')) {
|
|
343
|
+
return { schemaVersion: 1, tool: 'kotlin', name: 'junit' };
|
|
344
|
+
}
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
const kotlinTestFrameworkProvider = {
|
|
348
|
+
source: 'kotlin',
|
|
349
|
+
async gather(cwd) {
|
|
350
|
+
return gatherKotlinTestFrameworkResult(cwd);
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
// ─── Pack export ────────────────────────────────────────────────────────────
|
|
354
|
+
exports.kotlin = {
|
|
355
|
+
id: 'kotlin',
|
|
356
|
+
displayName: 'Kotlin (Android)',
|
|
357
|
+
// `.kts` covers both Gradle build scripts and Kotlin scratch files; the
|
|
358
|
+
// dxkit analyzers treat them as first-class source so coverage and lint
|
|
359
|
+
// reach build logic too. Java files in mixed Kotlin/Java codebases are
|
|
360
|
+
// handled by the Java pack (when added) — not co-mingled here, to keep
|
|
361
|
+
// attribution clean.
|
|
362
|
+
sourceExtensions: ['.kt', '.kts'],
|
|
363
|
+
// JUnit-style (*Test/*Tests) plus Spek/Kotest's `*Spec.kt` convention.
|
|
364
|
+
testFilePatterns: ['*Test.kt', '*Tests.kt', '*Spec.kt'],
|
|
365
|
+
// `build` = Gradle build output (per-project + per-module),
|
|
366
|
+
// `.gradle` = Gradle daemon/cache state,
|
|
367
|
+
// `out` = IntelliJ IDE build output.
|
|
368
|
+
extraExcludes: ['build', '.gradle', 'out'],
|
|
369
|
+
detect: detectKotlin,
|
|
370
|
+
tools: ['detekt', 'osv-scanner'],
|
|
371
|
+
// Semgrep's Kotlin ruleset (`p/kotlin`) is sparse compared to Python/JS
|
|
372
|
+
// — skipping for now until coverage matures, mirroring the csharp pack.
|
|
373
|
+
semgrepRulesets: [],
|
|
374
|
+
capabilities: {
|
|
375
|
+
depVulns: kotlinDepVulnsProvider,
|
|
376
|
+
lint: kotlinLintProvider,
|
|
377
|
+
coverage: kotlinCoverageProvider,
|
|
378
|
+
imports: kotlinImportsProvider,
|
|
379
|
+
testFramework: kotlinTestFrameworkProvider,
|
|
380
|
+
// licenses: deliberately omitted. No canonical CLI license tool for
|
|
381
|
+
// Maven/Gradle equivalent to pip-licenses or cargo-license. Gradle
|
|
382
|
+
// plugins (jk1.dependency-license-report) require modifying user's
|
|
383
|
+
// build.gradle.kts which violates pack non-intrusiveness. Re-evaluate
|
|
384
|
+
// if a customer surfaces the need.
|
|
385
|
+
},
|
|
386
|
+
mapLintSeverity: mapDetektSeverity,
|
|
387
|
+
// ─── LP-recipe metadata ────────────────────────────────────────────────
|
|
388
|
+
permissions: ['Bash(./gradlew:*)', 'Bash(gradle:*)', 'Bash(detekt:*)'],
|
|
389
|
+
ruleFile: 'kotlin.md',
|
|
390
|
+
templateFiles: [],
|
|
391
|
+
cliBinaries: ['gradle', 'detekt'],
|
|
392
|
+
defaultVersion: '2.0.21',
|
|
393
|
+
projectYamlBlock: ({ config, enabled }) => [
|
|
394
|
+
` kotlin:`,
|
|
395
|
+
` enabled: ${enabled}`,
|
|
396
|
+
` version: "${config.versions.kotlin ?? ''}"`,
|
|
397
|
+
` quality:`,
|
|
398
|
+
` coverage: ${config.coverageThreshold}`,
|
|
399
|
+
` lint: true`,
|
|
400
|
+
` typecheck: true`,
|
|
401
|
+
` format: true`,
|
|
402
|
+
].join('\n'),
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=kotlin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kotlin.js","sourceRoot":"","sources":["../../src/languages/kotlin.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,15 @@ export interface LanguageSupport {
|
|
|
34
34
|
detect(cwd: string): boolean;
|
|
35
35
|
tools: string[];
|
|
36
36
|
semgrepRulesets: string[];
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Tier a lint rule code into a severity bucket. Accepts `string | null |
|
|
39
|
+
* undefined` because real lint output occasionally emits `ruleId: null`
|
|
40
|
+
* (eslint with rule-disabled diagnostics) or omits the field entirely
|
|
41
|
+
* (golangci-lint's "unknown linter" path). Implementations short-circuit
|
|
42
|
+
* to `'low'` for non-string input — both `mapEslintRuleSeverity` and the
|
|
43
|
+
* golangci-lint mapping rely on this contract for defensive parsing.
|
|
44
|
+
*/
|
|
45
|
+
mapLintSeverity?(code: string | null | undefined): LintSeverity;
|
|
38
46
|
/** Capability providers for the dispatcher channel. */
|
|
39
47
|
capabilities?: LanguagePackCapabilities;
|
|
40
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/languages/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACV,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,UAAU,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IAEpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/languages/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACV,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,UAAU,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IAEpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B;;;;;;;OAOG;IACH,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,CAAC;IAEhE,uDAAuD;IACvD,YAAY,CAAC,EAAE,wBAAwB,CAAC;IAExC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAEvD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAEvD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACjE;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
package/dist/tools-cli.d.ts
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import { DetectedStack } from './types';
|
|
2
|
+
export interface ToolsInstallOptions {
|
|
3
|
+
toolName?: string;
|
|
4
|
+
all?: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Decide which tool names to consider for install given the options.
|
|
8
|
+
* Pure function — does not touch the filesystem; testable in isolation.
|
|
9
|
+
*
|
|
10
|
+
* - toolName set: just that one (returns [] if name is unknown — caller
|
|
11
|
+
* surfaces an error)
|
|
12
|
+
* - all: every key in TOOL_DEFS, sorted for stable output
|
|
13
|
+
* - default: tools required for the current-project stack
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectToolNames(languages: DetectedStack['languages'], options?: ToolsInstallOptions): string[];
|
|
16
|
+
export declare function runToolsCommand(targetPath: string, subCommand: string | undefined, autoYes: boolean, options?: ToolsInstallOptions): Promise<void>;
|
|
2
17
|
//# sourceMappingURL=tools-cli.d.ts.map
|
package/dist/tools-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-cli.d.ts","sourceRoot":"","sources":["../src/tools-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools-cli.d.ts","sourceRoot":"","sources":["../src/tools-cli.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAWxC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,EACrC,OAAO,GAAE,mBAAwB,GAChC,MAAM,EAAE,CAQV;AAwOD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
package/dist/tools-cli.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.selectToolNames = selectToolNames;
|
|
36
37
|
exports.runToolsCommand = runToolsCommand;
|
|
37
38
|
/**
|
|
38
39
|
* CLI handler for `vyuh-dxkit tools` subcommand.
|
|
@@ -40,6 +41,17 @@ exports.runToolsCommand = runToolsCommand;
|
|
|
40
41
|
* Modes:
|
|
41
42
|
* - `vyuh-dxkit tools` → list status for required tools
|
|
42
43
|
* - `vyuh-dxkit tools install` → interactive install of missing tools
|
|
44
|
+
* for the current-project stack
|
|
45
|
+
* - `vyuh-dxkit tools install <name>` → install one named tool (any
|
|
46
|
+
* stack); useful for cross-stack dev
|
|
47
|
+
* work where you need a tool that
|
|
48
|
+
* your current project doesn't
|
|
49
|
+
* declare (e.g. installing
|
|
50
|
+
* `spotbugs` on a Node-only repo)
|
|
51
|
+
* - `vyuh-dxkit tools install --all` → enumerate every known tool in
|
|
52
|
+
* TOOL_DEFS and install missing
|
|
53
|
+
* ones; useful for setting up a
|
|
54
|
+
* cross-stack dev environment
|
|
43
55
|
* - `vyuh-dxkit tools install --yes` → install all missing, no prompts
|
|
44
56
|
*/
|
|
45
57
|
const readline = __importStar(require("readline/promises"));
|
|
@@ -48,6 +60,24 @@ const child_process_1 = require("child_process");
|
|
|
48
60
|
const detect_1 = require("./detect");
|
|
49
61
|
const logger = __importStar(require("./logger"));
|
|
50
62
|
const tool_registry_1 = require("./analyzers/tools/tool-registry");
|
|
63
|
+
/**
|
|
64
|
+
* Decide which tool names to consider for install given the options.
|
|
65
|
+
* Pure function — does not touch the filesystem; testable in isolation.
|
|
66
|
+
*
|
|
67
|
+
* - toolName set: just that one (returns [] if name is unknown — caller
|
|
68
|
+
* surfaces an error)
|
|
69
|
+
* - all: every key in TOOL_DEFS, sorted for stable output
|
|
70
|
+
* - default: tools required for the current-project stack
|
|
71
|
+
*/
|
|
72
|
+
function selectToolNames(languages, options = {}) {
|
|
73
|
+
if (options.toolName) {
|
|
74
|
+
return tool_registry_1.TOOL_DEFS[options.toolName] ? [options.toolName] : [];
|
|
75
|
+
}
|
|
76
|
+
if (options.all) {
|
|
77
|
+
return Object.keys(tool_registry_1.TOOL_DEFS).sort();
|
|
78
|
+
}
|
|
79
|
+
return (0, tool_registry_1.buildRequiredTools)(languages).map((r) => r.name);
|
|
80
|
+
}
|
|
51
81
|
const LAYER_ORDER = {
|
|
52
82
|
universal: 1,
|
|
53
83
|
language: 2,
|
|
@@ -134,14 +164,47 @@ function runInstallCmd(cmd) {
|
|
|
134
164
|
}
|
|
135
165
|
}
|
|
136
166
|
/** Interactive install of missing tools. */
|
|
137
|
-
async function runInstall(targetPath, autoYes) {
|
|
138
|
-
|
|
167
|
+
async function runInstall(targetPath, autoYes, options = {}) {
|
|
168
|
+
// Validate single-tool name early so we fail fast with a useful message.
|
|
169
|
+
if (options.toolName && !tool_registry_1.TOOL_DEFS[options.toolName]) {
|
|
170
|
+
logger.fail(`Unknown tool: ${options.toolName}`);
|
|
171
|
+
logger.info('Run `vyuh-dxkit tools list` to see available tools.');
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
// Default mode shows the full status table. Targeted modes skip it
|
|
175
|
+
// because the table would be either redundant (single tool) or huge
|
|
176
|
+
// (--all enumerates every TOOL_DEFS entry).
|
|
177
|
+
let statuses;
|
|
178
|
+
let modeLabel;
|
|
179
|
+
if (options.toolName || options.all) {
|
|
180
|
+
const stack = (0, detect_1.detect)(targetPath);
|
|
181
|
+
const names = selectToolNames(stack.languages, options);
|
|
182
|
+
statuses = names
|
|
183
|
+
.map((n) => {
|
|
184
|
+
const def = tool_registry_1.TOOL_DEFS[n];
|
|
185
|
+
return def ? (0, tool_registry_1.findTool)(def, targetPath) : null;
|
|
186
|
+
})
|
|
187
|
+
.filter((s) => s !== null);
|
|
188
|
+
modeLabel = options.toolName
|
|
189
|
+
? `Install ${options.toolName}`
|
|
190
|
+
: `Install all known tools (${statuses.length} candidates, missing only)`;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
statuses = showStatus(targetPath);
|
|
194
|
+
modeLabel = 'Install missing tools';
|
|
195
|
+
}
|
|
139
196
|
const missing = statuses.filter((s) => !s.available);
|
|
140
197
|
if (missing.length === 0) {
|
|
198
|
+
if (options.toolName) {
|
|
199
|
+
logger.success(`${options.toolName} is already installed.`);
|
|
200
|
+
}
|
|
201
|
+
else if (options.all) {
|
|
202
|
+
logger.success(`All ${statuses.length} known tools already installed.`);
|
|
203
|
+
}
|
|
141
204
|
return;
|
|
142
205
|
}
|
|
143
206
|
console.log('');
|
|
144
|
-
logger.header(
|
|
207
|
+
logger.header(modeLabel);
|
|
145
208
|
const rl = autoYes ? null : readline.createInterface({ input: process_1.stdin, output: process_1.stdout });
|
|
146
209
|
const results = [];
|
|
147
210
|
try {
|
|
@@ -221,17 +284,17 @@ async function runInstall(targetPath, autoYes) {
|
|
|
221
284
|
logger.dim('Run `vyuh-dxkit health` to use the newly installed tools.');
|
|
222
285
|
}
|
|
223
286
|
}
|
|
224
|
-
async function runToolsCommand(targetPath, subCommand, autoYes) {
|
|
287
|
+
async function runToolsCommand(targetPath, subCommand, autoYes, options = {}) {
|
|
225
288
|
if (!subCommand || subCommand === 'list' || subCommand === 'status') {
|
|
226
289
|
showStatus(targetPath);
|
|
227
290
|
return;
|
|
228
291
|
}
|
|
229
292
|
if (subCommand === 'install') {
|
|
230
|
-
await runInstall(targetPath, autoYes);
|
|
293
|
+
await runInstall(targetPath, autoYes, options);
|
|
231
294
|
return;
|
|
232
295
|
}
|
|
233
296
|
logger.fail(`Unknown tools subcommand: ${subCommand}`);
|
|
234
|
-
logger.info('Usage: vyuh-dxkit tools [list|install] [path]');
|
|
297
|
+
logger.info('Usage: vyuh-dxkit tools [list|install] [<tool-name>] [path] [--all] [--yes]');
|
|
235
298
|
process.exit(1);
|
|
236
299
|
}
|
|
237
300
|
//# sourceMappingURL=tools-cli.js.map
|
package/dist/tools-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-cli.js","sourceRoot":"","sources":["../src/tools-cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tools-cli.js","sourceRoot":"","sources":["../src/tools-cli.ts"],"names":[],"mappings":"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"}
|