@vyuhlabs/dxkit 2.0.1 → 2.1.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 +131 -0
- package/README.md +21 -15
- package/dist/analyzers/bom/detailed.d.ts +26 -0
- package/dist/analyzers/bom/detailed.d.ts.map +1 -0
- package/dist/analyzers/bom/detailed.js +227 -0
- package/dist/analyzers/bom/detailed.js.map +1 -0
- package/dist/analyzers/bom/gather.d.ts +52 -0
- package/dist/analyzers/bom/gather.d.ts.map +1 -0
- package/dist/analyzers/bom/gather.js +183 -0
- package/dist/analyzers/bom/gather.js.map +1 -0
- package/dist/analyzers/bom/index.d.ts +23 -0
- package/dist/analyzers/bom/index.d.ts.map +1 -0
- package/dist/analyzers/bom/index.js +183 -0
- package/dist/analyzers/bom/index.js.map +1 -0
- package/dist/analyzers/bom/types.d.ts +71 -0
- package/dist/analyzers/bom/types.d.ts.map +1 -0
- package/dist/analyzers/bom/types.js +3 -0
- package/dist/analyzers/bom/types.js.map +1 -0
- package/dist/analyzers/licenses/detailed.d.ts +30 -0
- package/dist/analyzers/licenses/detailed.d.ts.map +1 -0
- package/dist/analyzers/licenses/detailed.js +194 -0
- package/dist/analyzers/licenses/detailed.js.map +1 -0
- package/dist/analyzers/licenses/gather.d.ts +15 -0
- package/dist/analyzers/licenses/gather.d.ts.map +1 -0
- package/dist/analyzers/licenses/gather.js +24 -0
- package/dist/analyzers/licenses/gather.js.map +1 -0
- package/dist/analyzers/licenses/index.d.ts +21 -0
- package/dist/analyzers/licenses/index.d.ts.map +1 -0
- package/dist/analyzers/licenses/index.js +146 -0
- package/dist/analyzers/licenses/index.js.map +1 -0
- package/dist/analyzers/licenses/types.d.ts +30 -0
- package/dist/analyzers/licenses/types.d.ts.map +1 -0
- package/dist/analyzers/licenses/types.js +13 -0
- package/dist/analyzers/licenses/types.js.map +1 -0
- package/dist/analyzers/security/detailed.d.ts +0 -3
- package/dist/analyzers/security/detailed.d.ts.map +1 -1
- package/dist/analyzers/security/detailed.js +37 -6
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +2 -0
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts.map +1 -1
- package/dist/analyzers/security/index.js +53 -14
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/security/types.d.ts +5 -0
- package/dist/analyzers/security/types.d.ts.map +1 -1
- package/dist/analyzers/security/types.js +0 -3
- package/dist/analyzers/security/types.js.map +1 -1
- package/dist/analyzers/tools/osv.d.ts +49 -5
- package/dist/analyzers/tools/osv.d.ts.map +1 -1
- package/dist/analyzers/tools/osv.js +99 -17
- package/dist/analyzers/tools/osv.js.map +1 -1
- package/dist/analyzers/tools/runner.d.ts +11 -0
- package/dist/analyzers/tools/runner.d.ts.map +1 -1
- package/dist/analyzers/tools/runner.js +54 -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 +77 -0
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/analyzers/xlsx/bom.d.ts +27 -0
- package/dist/analyzers/xlsx/bom.d.ts.map +1 -0
- package/dist/analyzers/xlsx/bom.js +131 -0
- package/dist/analyzers/xlsx/bom.js.map +1 -0
- package/dist/analyzers/xlsx/index.d.ts +27 -0
- package/dist/analyzers/xlsx/index.d.ts.map +1 -0
- package/dist/analyzers/xlsx/index.js +92 -0
- package/dist/analyzers/xlsx/index.js.map +1 -0
- package/dist/analyzers/xlsx/licenses.d.ts +40 -0
- package/dist/analyzers/xlsx/licenses.d.ts.map +1 -0
- package/dist/analyzers/xlsx/licenses.js +140 -0
- package/dist/analyzers/xlsx/licenses.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +178 -1
- package/dist/cli.js.map +1 -1
- package/dist/languages/capabilities/descriptors.d.ts +4 -1
- package/dist/languages/capabilities/descriptors.d.ts.map +1 -1
- package/dist/languages/capabilities/descriptors.js +20 -1
- package/dist/languages/capabilities/descriptors.js.map +1 -1
- package/dist/languages/capabilities/types.d.ts +59 -3
- package/dist/languages/capabilities/types.d.ts.map +1 -1
- package/dist/languages/csharp.d.ts +13 -0
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +228 -33
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +211 -26
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +187 -11
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/rust.d.ts +13 -0
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +195 -29
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/types.d.ts +2 -1
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +252 -1
- package/dist/languages/typescript.js.map +1 -1
- package/package.json +7 -2
- package/dist/agents/extract.d.ts +0 -25
- package/dist/agents/extract.d.ts.map +0 -1
- package/dist/agents/extract.js +0 -186
- package/dist/agents/extract.js.map +0 -1
- package/dist/agents/schemas.d.ts +0 -106
- package/dist/agents/schemas.d.ts.map +0 -1
- package/dist/agents/schemas.js +0 -86
- package/dist/agents/schemas.js.map +0 -1
- package/dist/agents/session.d.ts +0 -28
- package/dist/agents/session.d.ts.map +0 -1
- package/dist/agents/session.js +0 -223
- package/dist/agents/session.js.map +0 -1
- package/dist/analyzers/index.d.ts +0 -3
- package/dist/analyzers/index.d.ts.map +0 -1
- package/dist/analyzers/index.js +0 -6
- package/dist/analyzers/index.js.map +0 -1
- package/dist/analyzers/security/report.d.ts +0 -6
- package/dist/analyzers/security/report.d.ts.map +0 -1
- package/dist/analyzers/security/report.js +0 -118
- package/dist/analyzers/security/report.js.map +0 -1
- package/dist/analyzers/tools/dotnet.d.ts +0 -8
- package/dist/analyzers/tools/dotnet.d.ts.map +0 -1
- package/dist/analyzers/tools/dotnet.js +0 -81
- package/dist/analyzers/tools/dotnet.js.map +0 -1
- package/dist/analyzers/tools/gather-cache.d.ts +0 -16
- package/dist/analyzers/tools/gather-cache.d.ts.map +0 -1
- package/dist/analyzers/tools/gather-cache.js +0 -126
- package/dist/analyzers/tools/gather-cache.js.map +0 -1
- package/dist/analyzers/tools/go.d.ts +0 -8
- package/dist/analyzers/tools/go.d.ts.map +0 -1
- package/dist/analyzers/tools/go.js +0 -84
- package/dist/analyzers/tools/go.js.map +0 -1
- package/dist/analyzers/tools/node.d.ts +0 -8
- package/dist/analyzers/tools/node.d.ts.map +0 -1
- package/dist/analyzers/tools/node.js +0 -160
- package/dist/analyzers/tools/node.js.map +0 -1
- package/dist/analyzers/tools/python.d.ts +0 -8
- package/dist/analyzers/tools/python.d.ts.map +0 -1
- package/dist/analyzers/tools/python.js +0 -81
- package/dist/analyzers/tools/python.js.map +0 -1
- package/dist/analyzers/tools/rust.d.ts +0 -8
- package/dist/analyzers/tools/rust.d.ts.map +0 -1
- package/dist/analyzers/tools/rust.js +0 -86
- package/dist/analyzers/tools/rust.js.map +0 -1
- package/templates/.ai/templates/session-checkpoint-template.md +0 -97
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gatherDotnetMetrics = gatherDotnetMetrics;
|
|
4
|
-
const runner_1 = require("./runner");
|
|
5
|
-
const tool_registry_1 = require("./tool-registry");
|
|
6
|
-
/** Gather .NET-specific metrics. */
|
|
7
|
-
function gatherDotnetMetrics(cwd) {
|
|
8
|
-
const metrics = {
|
|
9
|
-
toolsUsed: [],
|
|
10
|
-
toolsUnavailable: [],
|
|
11
|
-
};
|
|
12
|
-
// dotnet format (lint/formatting check)
|
|
13
|
-
const dotnet = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS['dotnet-format'], cwd);
|
|
14
|
-
if (dotnet.available) {
|
|
15
|
-
const exitCode = (0, runner_1.runExitCode)('dotnet format --verify-no-changes 2>/dev/null', cwd, 120000);
|
|
16
|
-
if (exitCode === 0) {
|
|
17
|
-
metrics.lintErrors = 0;
|
|
18
|
-
metrics.lintWarnings = 0;
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
// Count format violations from output
|
|
22
|
-
const raw = (0, runner_1.run)('dotnet format --verify-no-changes 2>&1', cwd, 120000);
|
|
23
|
-
const violations = raw ? raw.split('\n').filter((l) => l.includes('Formatted')).length : 1;
|
|
24
|
-
metrics.lintErrors = violations;
|
|
25
|
-
metrics.lintWarnings = 0;
|
|
26
|
-
}
|
|
27
|
-
metrics.lintTool = 'dotnet-format';
|
|
28
|
-
metrics.toolsUsed.push('dotnet-format');
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
metrics.toolsUnavailable.push('dotnet-format');
|
|
32
|
-
}
|
|
33
|
-
// dotnet list package --vulnerable
|
|
34
|
-
if (dotnet.available) {
|
|
35
|
-
const raw = (0, runner_1.run)('dotnet list package --vulnerable --format json 2>/dev/null', cwd, 120000);
|
|
36
|
-
if (raw) {
|
|
37
|
-
try {
|
|
38
|
-
const data = JSON.parse(raw);
|
|
39
|
-
let critical = 0, high = 0, medium = 0, low = 0;
|
|
40
|
-
for (const proj of data.projects || []) {
|
|
41
|
-
for (const fw of proj.frameworks || []) {
|
|
42
|
-
for (const pkg of fw.topLevelPackages || []) {
|
|
43
|
-
for (const adv of pkg.advisories || []) {
|
|
44
|
-
const sev = adv.severity?.toLowerCase();
|
|
45
|
-
if (sev === 'critical')
|
|
46
|
-
critical++;
|
|
47
|
-
else if (sev === 'high')
|
|
48
|
-
high++;
|
|
49
|
-
else if (sev === 'moderate' || sev === 'medium')
|
|
50
|
-
medium++;
|
|
51
|
-
else
|
|
52
|
-
low++;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (critical + high + medium + low > 0) {
|
|
58
|
-
metrics.depVulnCritical = critical;
|
|
59
|
-
metrics.depVulnHigh = high;
|
|
60
|
-
metrics.depVulnMedium = medium;
|
|
61
|
-
metrics.depVulnLow = low;
|
|
62
|
-
metrics.depAuditTool = 'dotnet-vulnerable';
|
|
63
|
-
metrics.toolsUsed.push('dotnet-vulnerable');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// --format json not supported in older SDKs — try text parsing
|
|
68
|
-
metrics.toolsUnavailable.push('dotnet-vulnerable (parse error)');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// Test framework detection
|
|
73
|
-
if ((0, runner_1.fileExists)(cwd, '*.csproj')) {
|
|
74
|
-
const csproj = (0, runner_1.run)("find . -name '*.csproj' -exec grep -l 'xunit\\|nunit\\|MSTest' {} \\; 2>/dev/null | head -1", cwd);
|
|
75
|
-
if (csproj) {
|
|
76
|
-
metrics.testFramework = 'dotnet-test';
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return metrics;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=dotnet.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../../src/analyzers/tools/dotnet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare class GatherCache {
|
|
2
|
-
private cacheDir;
|
|
3
|
-
private commitSha;
|
|
4
|
-
private memory;
|
|
5
|
-
constructor(targetRepo: string);
|
|
6
|
-
/**
|
|
7
|
-
* Get cached result or compute and cache it.
|
|
8
|
-
* Checks in-memory first (same process), then file cache (cross-process).
|
|
9
|
-
*/
|
|
10
|
-
getOrCompute<T>(toolName: string, compute: () => T): T;
|
|
11
|
-
/** Check if a tool has a cached result. */
|
|
12
|
-
has(toolName: string): boolean;
|
|
13
|
-
/** Remove cached entries for a tool from different commits. */
|
|
14
|
-
private cleanStale;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=gather-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gather-cache.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/gather-cache.ts"],"names":[],"mappings":"AAoBA,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAA8B;gBAEhC,UAAU,EAAE,MAAM;IAK9B;;;OAGG;IACH,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;IAsCtD,2CAA2C;IAC3C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAO9B,+DAA+D;IAC/D,OAAO,CAAC,UAAU;CAYnB"}
|
|
@@ -1,126 +0,0 @@
|
|
|
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.GatherCache = void 0;
|
|
37
|
-
/**
|
|
38
|
-
* Gather cache — file-based memoization for tool outputs.
|
|
39
|
-
*
|
|
40
|
-
* Solves: tools running multiple times when user runs health + vulnerabilities + quality.
|
|
41
|
-
* Each tool's output is cached per commitSha in `.ai/cache/` (gitignored).
|
|
42
|
-
*
|
|
43
|
-
* Cache key: {toolName}-{commitSha}.json
|
|
44
|
-
* Invalidation: automatic — if HEAD changes, the commitSha changes, cache misses.
|
|
45
|
-
* Cleanup: stale entries (different commitSha) are deleted on write.
|
|
46
|
-
*
|
|
47
|
-
* Usage:
|
|
48
|
-
* const result = cache.getOrCompute('cloc', cwd, () => gatherClocMetrics(cwd));
|
|
49
|
-
*
|
|
50
|
-
* The cache is optional. Gather functions work without it (backward compatible).
|
|
51
|
-
* Passing a GatherCache instance enables memoization across multiple analyzers.
|
|
52
|
-
*/
|
|
53
|
-
const fs = __importStar(require("fs"));
|
|
54
|
-
const path = __importStar(require("path"));
|
|
55
|
-
const runner_1 = require("./runner");
|
|
56
|
-
class GatherCache {
|
|
57
|
-
cacheDir;
|
|
58
|
-
commitSha;
|
|
59
|
-
memory = new Map();
|
|
60
|
-
constructor(targetRepo) {
|
|
61
|
-
this.cacheDir = path.join(targetRepo, '.ai', 'cache');
|
|
62
|
-
this.commitSha = (0, runner_1.run)('git rev-parse --short HEAD 2>/dev/null', targetRepo) || 'unknown';
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Get cached result or compute and cache it.
|
|
66
|
-
* Checks in-memory first (same process), then file cache (cross-process).
|
|
67
|
-
*/
|
|
68
|
-
getOrCompute(toolName, compute) {
|
|
69
|
-
const key = `${toolName}-${this.commitSha}`;
|
|
70
|
-
// 1. In-memory cache (same process, same session)
|
|
71
|
-
if (this.memory.has(key)) {
|
|
72
|
-
return this.memory.get(key);
|
|
73
|
-
}
|
|
74
|
-
// 2. File cache (cross-process, e.g., health then vulnerabilities)
|
|
75
|
-
const filePath = path.join(this.cacheDir, `${key}.json`);
|
|
76
|
-
try {
|
|
77
|
-
if (fs.existsSync(filePath)) {
|
|
78
|
-
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
79
|
-
const result = JSON.parse(raw);
|
|
80
|
-
this.memory.set(key, result);
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// Cache read failed — compute fresh
|
|
86
|
-
}
|
|
87
|
-
// 3. Compute, cache, return
|
|
88
|
-
const result = compute();
|
|
89
|
-
this.memory.set(key, result);
|
|
90
|
-
// Write to file cache
|
|
91
|
-
try {
|
|
92
|
-
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
93
|
-
// Clean stale entries (different commitSha) for this tool
|
|
94
|
-
this.cleanStale(toolName);
|
|
95
|
-
fs.writeFileSync(filePath, JSON.stringify(result));
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// Cache write failed — non-fatal
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
|
-
/** Check if a tool has a cached result. */
|
|
103
|
-
has(toolName) {
|
|
104
|
-
const key = `${toolName}-${this.commitSha}`;
|
|
105
|
-
if (this.memory.has(key))
|
|
106
|
-
return true;
|
|
107
|
-
const filePath = path.join(this.cacheDir, `${key}.json`);
|
|
108
|
-
return fs.existsSync(filePath);
|
|
109
|
-
}
|
|
110
|
-
/** Remove cached entries for a tool from different commits. */
|
|
111
|
-
cleanStale(toolName) {
|
|
112
|
-
try {
|
|
113
|
-
const files = fs.readdirSync(this.cacheDir);
|
|
114
|
-
for (const file of files) {
|
|
115
|
-
if (file.startsWith(`${toolName}-`) && !file.includes(this.commitSha)) {
|
|
116
|
-
fs.unlinkSync(path.join(this.cacheDir, file));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
// Non-fatal
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
exports.GatherCache = GatherCache;
|
|
126
|
-
//# sourceMappingURL=gather-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gather-cache.js","sourceRoot":"","sources":["../../../src/analyzers/tools/gather-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Go tool runner — golangci-lint, govulncheck.
|
|
3
|
-
* Layer 1: language-specific tools for Go projects.
|
|
4
|
-
*/
|
|
5
|
-
import { HealthMetrics } from '../types';
|
|
6
|
-
/** Gather Go-specific metrics. */
|
|
7
|
-
export declare function gatherGoMetrics(cwd: string): Partial<HealthMetrics>;
|
|
8
|
-
//# sourceMappingURL=go.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/go.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAazC,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwEnE"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gatherGoMetrics = gatherGoMetrics;
|
|
4
|
-
const runner_1 = require("./runner");
|
|
5
|
-
const tool_registry_1 = require("./tool-registry");
|
|
6
|
-
/** Gather Go-specific metrics. */
|
|
7
|
-
function gatherGoMetrics(cwd) {
|
|
8
|
-
const metrics = {
|
|
9
|
-
toolsUsed: [],
|
|
10
|
-
toolsUnavailable: [],
|
|
11
|
-
};
|
|
12
|
-
// golangci-lint
|
|
13
|
-
const lint = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS['golangci-lint'], cwd);
|
|
14
|
-
if (lint.available && lint.path) {
|
|
15
|
-
const raw = (0, runner_1.run)(`${lint.path} run --out-format json ./... 2>/dev/null`, cwd, 120000);
|
|
16
|
-
if (raw) {
|
|
17
|
-
try {
|
|
18
|
-
const data = JSON.parse(raw);
|
|
19
|
-
const issues = data.Issues || [];
|
|
20
|
-
const errors = issues.filter((i) => i.Severity === 'error').length;
|
|
21
|
-
const warnings = issues.length - errors;
|
|
22
|
-
metrics.lintErrors = errors;
|
|
23
|
-
metrics.lintWarnings = warnings;
|
|
24
|
-
metrics.lintTool = 'golangci-lint';
|
|
25
|
-
metrics.toolsUsed.push('golangci-lint');
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
metrics.toolsUnavailable.push('golangci-lint (parse error)');
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
// Empty = no issues
|
|
33
|
-
metrics.lintErrors = 0;
|
|
34
|
-
metrics.lintWarnings = 0;
|
|
35
|
-
metrics.lintTool = 'golangci-lint';
|
|
36
|
-
metrics.toolsUsed.push('golangci-lint');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
metrics.toolsUnavailable.push('golangci-lint');
|
|
41
|
-
}
|
|
42
|
-
// govulncheck
|
|
43
|
-
const vuln = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS.govulncheck, cwd);
|
|
44
|
-
if (vuln.available && vuln.path) {
|
|
45
|
-
const raw = (0, runner_1.run)(`${vuln.path} -json ./... 2>/dev/null`, cwd, 120000);
|
|
46
|
-
if (raw) {
|
|
47
|
-
try {
|
|
48
|
-
// govulncheck JSON is newline-delimited JSON objects
|
|
49
|
-
let vulnCount = 0;
|
|
50
|
-
for (const line of raw.split('\n')) {
|
|
51
|
-
if (!line.trim())
|
|
52
|
-
continue;
|
|
53
|
-
try {
|
|
54
|
-
const obj = JSON.parse(line);
|
|
55
|
-
if (obj.finding)
|
|
56
|
-
vulnCount++;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
/* skip non-JSON lines */
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// govulncheck doesn't provide severity breakdown — count all as high
|
|
63
|
-
metrics.depVulnHigh = vulnCount;
|
|
64
|
-
metrics.depVulnCritical = 0;
|
|
65
|
-
metrics.depVulnMedium = 0;
|
|
66
|
-
metrics.depVulnLow = 0;
|
|
67
|
-
metrics.depAuditTool = 'govulncheck';
|
|
68
|
-
metrics.toolsUsed.push('govulncheck');
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
metrics.toolsUnavailable.push('govulncheck (parse error)');
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
metrics.toolsUnavailable.push('govulncheck');
|
|
77
|
-
}
|
|
78
|
-
// Test framework detection
|
|
79
|
-
if ((0, runner_1.fileExists)(cwd, 'go.mod')) {
|
|
80
|
-
metrics.testFramework = 'go-test';
|
|
81
|
-
}
|
|
82
|
-
return metrics;
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=go.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/analyzers/tools/go.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Node.js tool runner -- eslint, npm audit, test runners.
|
|
3
|
-
* Layer 1 (project tools) + Layer 2 (optional tools).
|
|
4
|
-
*/
|
|
5
|
-
import { HealthMetrics } from '../types';
|
|
6
|
-
/** Gather Node.js-specific metrics. */
|
|
7
|
-
export declare function gatherNodeMetrics(cwd: string): Partial<HealthMetrics>;
|
|
8
|
-
//# sourceMappingURL=node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiBzC,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwFrE"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gatherNodeMetrics = gatherNodeMetrics;
|
|
4
|
-
const runner_1 = require("./runner");
|
|
5
|
-
/** Gather Node.js-specific metrics. */
|
|
6
|
-
function gatherNodeMetrics(cwd) {
|
|
7
|
-
const metrics = {
|
|
8
|
-
toolsUsed: [],
|
|
9
|
-
toolsUnavailable: [],
|
|
10
|
-
};
|
|
11
|
-
// ESLint — pick the right binary and config format, skip gracefully if mismatched
|
|
12
|
-
const eslintStatus = runEslint(cwd);
|
|
13
|
-
if (eslintStatus.ran) {
|
|
14
|
-
metrics.lintErrors = eslintStatus.errors;
|
|
15
|
-
metrics.lintWarnings = eslintStatus.warnings;
|
|
16
|
-
metrics.lintTool = 'eslint';
|
|
17
|
-
metrics.toolsUsed.push('eslint');
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
metrics.toolsUnavailable.push(`eslint (${eslintStatus.reason})`);
|
|
21
|
-
}
|
|
22
|
-
// npm audit -- handles both v1 and v2+ formats
|
|
23
|
-
// npm audit may exit non-zero when vulnerabilities exist, so use run() which catches errors
|
|
24
|
-
// Don't redirect stderr to /dev/null — some versions write JSON to stderr
|
|
25
|
-
const auditRaw = (0, runner_1.run)('npm audit --json 2>&1', cwd, 60000);
|
|
26
|
-
if (auditRaw) {
|
|
27
|
-
try {
|
|
28
|
-
const auditData = JSON.parse(auditRaw);
|
|
29
|
-
let critical = 0, high = 0, medium = 0, low = 0;
|
|
30
|
-
if (auditData.metadata?.vulnerabilities) {
|
|
31
|
-
const v = auditData.metadata.vulnerabilities;
|
|
32
|
-
critical = v.critical || 0;
|
|
33
|
-
high = v.high || 0;
|
|
34
|
-
medium = v.moderate || 0;
|
|
35
|
-
low = v.low || 0;
|
|
36
|
-
}
|
|
37
|
-
else if (auditData.vulnerabilities) {
|
|
38
|
-
for (const v of Object.values(auditData.vulnerabilities)) {
|
|
39
|
-
if (v.severity === 'critical')
|
|
40
|
-
critical++;
|
|
41
|
-
else if (v.severity === 'high')
|
|
42
|
-
high++;
|
|
43
|
-
else if (v.severity === 'moderate')
|
|
44
|
-
medium++;
|
|
45
|
-
else if (v.severity === 'low')
|
|
46
|
-
low++;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
metrics.depVulnCritical = critical;
|
|
50
|
-
metrics.depVulnHigh = high;
|
|
51
|
-
metrics.depVulnMedium = medium;
|
|
52
|
-
metrics.depVulnLow = low;
|
|
53
|
-
metrics.depAuditTool = 'npm-audit';
|
|
54
|
-
metrics.toolsUsed.push('npm-audit');
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
metrics.toolsUnavailable.push('npm-audit (parse error)');
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
metrics.toolsUnavailable.push('npm-audit');
|
|
62
|
-
}
|
|
63
|
-
// Test runner detection (detect framework but don't run tests -- too slow for health audit)
|
|
64
|
-
const testScript = (0, runner_1.run)("node -e \"const p=require('./package.json'); console.log(p.scripts?.test || '')\" 2>/dev/null", cwd);
|
|
65
|
-
if (testScript && testScript !== 'echo "Error: no test specified" && exit 1') {
|
|
66
|
-
let framework = 'unknown';
|
|
67
|
-
if (testScript.includes('vitest'))
|
|
68
|
-
framework = 'vitest';
|
|
69
|
-
else if (testScript.includes('jest'))
|
|
70
|
-
framework = 'jest';
|
|
71
|
-
else if (testScript.includes('mocha') || testScript.includes('lb-mocha'))
|
|
72
|
-
framework = 'mocha';
|
|
73
|
-
else if (testScript.includes('ava'))
|
|
74
|
-
framework = 'ava';
|
|
75
|
-
else if (testScript.includes('tap'))
|
|
76
|
-
framework = 'tap';
|
|
77
|
-
metrics.testFramework = framework;
|
|
78
|
-
}
|
|
79
|
-
// npm scripts count
|
|
80
|
-
const scriptsOutput = (0, runner_1.run)('node -e "const p=require(\'./package.json\'); console.log(Object.keys(p.scripts||{}).length)" 2>/dev/null', cwd);
|
|
81
|
-
metrics.npmScriptsCount = parseInt(scriptsOutput) || 0;
|
|
82
|
-
// Node engine
|
|
83
|
-
const engineOutput = (0, runner_1.run)("node -e \"const p=require('./package.json'); console.log(p.engines?.node || '')\" 2>/dev/null", cwd);
|
|
84
|
-
if (engineOutput) {
|
|
85
|
-
metrics.nodeEngineVersion = engineOutput;
|
|
86
|
-
}
|
|
87
|
-
return metrics;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Run eslint with config-aware binary selection and graceful failure.
|
|
91
|
-
*
|
|
92
|
-
* Compatibility matrix:
|
|
93
|
-
* - ESLint v9+: needs eslint.config.{js,mjs,cjs,ts} (flat config)
|
|
94
|
-
* - ESLint v8: needs .eslintrc.{js,json,yml,yaml,cjs}
|
|
95
|
-
* - LoopBack projects: use lb-eslint binary with embedded config
|
|
96
|
-
*/
|
|
97
|
-
function runEslint(cwd) {
|
|
98
|
-
// Prefer lb-eslint if present (LoopBack embeds its own config)
|
|
99
|
-
const lbEslintPath = 'node_modules/.bin/lb-eslint';
|
|
100
|
-
const eslintPath = 'node_modules/.bin/eslint';
|
|
101
|
-
const hasLbEslint = (0, runner_1.fileExists)(cwd, lbEslintPath);
|
|
102
|
-
const hasEslint = (0, runner_1.fileExists)(cwd, eslintPath);
|
|
103
|
-
if (!hasLbEslint && !hasEslint) {
|
|
104
|
-
return { ran: false, errors: 0, warnings: 0, reason: 'not installed' };
|
|
105
|
-
}
|
|
106
|
-
// Detect config format
|
|
107
|
-
const hasFlatConfig = (0, runner_1.fileExists)(cwd, 'eslint.config.js', 'eslint.config.mjs', 'eslint.config.cjs', 'eslint.config.ts');
|
|
108
|
-
const hasLegacyConfig = (0, runner_1.fileExists)(cwd, '.eslintrc', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yml', '.eslintrc.yaml', '.eslintrc.cjs');
|
|
109
|
-
// Get eslint version to check compatibility
|
|
110
|
-
const binToCheck = hasEslint ? `./${eslintPath}` : `./${lbEslintPath}`;
|
|
111
|
-
const versionOutput = (0, runner_1.run)(`${binToCheck} --version 2>/dev/null`, cwd);
|
|
112
|
-
const majorMatch = versionOutput.match(/v?(\d+)/);
|
|
113
|
-
const major = majorMatch ? parseInt(majorMatch[1]) : 0;
|
|
114
|
-
// Config compatibility check
|
|
115
|
-
if (major >= 9 && !hasFlatConfig) {
|
|
116
|
-
// v9+ needs flat config
|
|
117
|
-
if (hasLbEslint) {
|
|
118
|
-
// lb-eslint may provide its own config; try it
|
|
119
|
-
// (fall through to actual run)
|
|
120
|
-
}
|
|
121
|
-
else if (hasLegacyConfig) {
|
|
122
|
-
return {
|
|
123
|
-
ran: false,
|
|
124
|
-
errors: 0,
|
|
125
|
-
warnings: 0,
|
|
126
|
-
reason: `v${major} but project uses legacy .eslintrc`,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
return {
|
|
131
|
-
ran: false,
|
|
132
|
-
errors: 0,
|
|
133
|
-
warnings: 0,
|
|
134
|
-
reason: 'no eslint config found',
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Prefer lb-eslint first if available, then standard eslint
|
|
139
|
-
const bins = hasLbEslint ? [`./${lbEslintPath}`, `./${eslintPath}`] : [`./${eslintPath}`];
|
|
140
|
-
for (const bin of bins) {
|
|
141
|
-
if (!(0, runner_1.fileExists)(cwd, bin.replace('./', '')))
|
|
142
|
-
continue;
|
|
143
|
-
const result = (0, runner_1.runJSON)(`${bin} . --format json 2>/dev/null`, cwd, 120000);
|
|
144
|
-
if (result && Array.isArray(result)) {
|
|
145
|
-
let errors = 0;
|
|
146
|
-
let warnings = 0;
|
|
147
|
-
for (const file of result) {
|
|
148
|
-
for (const msg of file.messages || []) {
|
|
149
|
-
if (msg.severity === 2)
|
|
150
|
-
errors++;
|
|
151
|
-
else
|
|
152
|
-
warnings++;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return { ran: true, errors, warnings, reason: '' };
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return { ran: false, errors: 0, warnings: 0, reason: 'config error' };
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=node.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/analyzers/tools/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Python tool runner — ruff (lint), pip-audit (deps).
|
|
3
|
-
* Layer 1: language-specific tools for Python projects.
|
|
4
|
-
*/
|
|
5
|
-
import { HealthMetrics } from '../types';
|
|
6
|
-
/** Gather Python-specific metrics. */
|
|
7
|
-
export declare function gatherPythonMetrics(cwd: string): Partial<HealthMetrics>;
|
|
8
|
-
//# sourceMappingURL=python.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAUzC,sCAAsC;AACtC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0EvE"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gatherPythonMetrics = gatherPythonMetrics;
|
|
4
|
-
const runner_1 = require("./runner");
|
|
5
|
-
const tool_registry_1 = require("./tool-registry");
|
|
6
|
-
/** Gather Python-specific metrics. */
|
|
7
|
-
function gatherPythonMetrics(cwd) {
|
|
8
|
-
const metrics = {
|
|
9
|
-
toolsUsed: [],
|
|
10
|
-
toolsUnavailable: [],
|
|
11
|
-
};
|
|
12
|
-
// ruff (lint)
|
|
13
|
-
const ruff = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS.ruff, cwd);
|
|
14
|
-
if (ruff.available && ruff.path) {
|
|
15
|
-
const raw = (0, runner_1.run)(`${ruff.path} check . --output-format json 2>/dev/null`, cwd, 60000);
|
|
16
|
-
if (raw) {
|
|
17
|
-
try {
|
|
18
|
-
const results = JSON.parse(raw);
|
|
19
|
-
if (Array.isArray(results)) {
|
|
20
|
-
// ruff doesn't distinguish error/warning by default — all are errors
|
|
21
|
-
metrics.lintErrors = results.length;
|
|
22
|
-
metrics.lintWarnings = 0;
|
|
23
|
-
metrics.lintTool = 'ruff';
|
|
24
|
-
metrics.toolsUsed.push('ruff');
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
metrics.toolsUnavailable.push('ruff (parse error)');
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
// Empty output = no errors
|
|
33
|
-
metrics.lintErrors = 0;
|
|
34
|
-
metrics.lintWarnings = 0;
|
|
35
|
-
metrics.lintTool = 'ruff';
|
|
36
|
-
metrics.toolsUsed.push('ruff');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
metrics.toolsUnavailable.push('ruff');
|
|
41
|
-
}
|
|
42
|
-
// pip-audit (dependency vulnerabilities)
|
|
43
|
-
const pipAudit = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS['pip-audit'], cwd);
|
|
44
|
-
if (pipAudit.available && pipAudit.path) {
|
|
45
|
-
const raw = (0, runner_1.run)(`${pipAudit.path} --format json 2>/dev/null`, cwd, 120000);
|
|
46
|
-
if (raw) {
|
|
47
|
-
try {
|
|
48
|
-
const data = JSON.parse(raw);
|
|
49
|
-
let medium = 0;
|
|
50
|
-
for (const dep of data.dependencies || []) {
|
|
51
|
-
// pip-audit doesn't provide severity — count all as medium
|
|
52
|
-
medium += (dep.vulns || []).length;
|
|
53
|
-
}
|
|
54
|
-
const critical = 0;
|
|
55
|
-
const high = 0;
|
|
56
|
-
const low = 0;
|
|
57
|
-
metrics.depVulnCritical = critical;
|
|
58
|
-
metrics.depVulnHigh = high;
|
|
59
|
-
metrics.depVulnMedium = medium;
|
|
60
|
-
metrics.depVulnLow = low;
|
|
61
|
-
metrics.depAuditTool = 'pip-audit';
|
|
62
|
-
metrics.toolsUsed.push('pip-audit');
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
metrics.toolsUnavailable.push('pip-audit (parse error)');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
metrics.toolsUnavailable.push('pip-audit');
|
|
71
|
-
}
|
|
72
|
-
// Test framework detection (don't run tests — just detect)
|
|
73
|
-
if ((0, runner_1.fileExists)(cwd, 'pytest.ini', 'conftest.py') || (0, runner_1.fileExists)(cwd, 'pyproject.toml')) {
|
|
74
|
-
const pyproject = (0, runner_1.run)('cat pyproject.toml 2>/dev/null', cwd);
|
|
75
|
-
if (pyproject?.includes('[tool.pytest') || (0, runner_1.fileExists)(cwd, 'pytest.ini', 'conftest.py')) {
|
|
76
|
-
metrics.testFramework = 'pytest';
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return metrics;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=python.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/analyzers/tools/python.ts"],"names":[],"mappings":";;AAeA,kDA0EC;AApFD,qCAA2C;AAC3C,mDAAsD;AAQtD,sCAAsC;AACtC,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAA2B;QACtC,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,cAAc;IACd,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,yBAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAA,YAAG,EAAC,GAAG,IAAI,CAAC,IAAI,2CAA2C,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;gBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,qEAAqE;oBACrE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;oBACpC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;oBACzB,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC;oBAC1B,OAAO,CAAC,SAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,gBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;YACzB,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC;YAC1B,OAAO,CAAC,SAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,gBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,IAAA,wBAAQ,EAAC,yBAAS,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAA,YAAG,EAAC,GAAG,QAAQ,CAAC,IAAI,4BAA4B,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAE1B,CAAC;gBACF,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;oBAC1C,2DAA2D;oBAC3D,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrC,CAAC;gBACD,MAAM,QAAQ,GAAG,CAAC,CAAC;gBACnB,MAAM,IAAI,GAAG,CAAC,CAAC;gBACf,MAAM,GAAG,GAAG,CAAC,CAAC;gBACd,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC;gBACnC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC;gBAC/B,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC;gBACzB,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC;gBACnC,OAAO,CAAC,SAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,gBAAiB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,gBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAA,mBAAU,EAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,IAAI,IAAA,mBAAU,EAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACtF,MAAM,SAAS,GAAG,IAAA,YAAG,EAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAA,mBAAU,EAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rust tool runner — clippy, cargo-audit.
|
|
3
|
-
* Layer 1: language-specific tools for Rust projects.
|
|
4
|
-
*/
|
|
5
|
-
import { HealthMetrics } from '../types';
|
|
6
|
-
/** Gather Rust-specific metrics. */
|
|
7
|
-
export declare function gatherRustMetrics(cwd: string): Partial<HealthMetrics>;
|
|
8
|
-
//# sourceMappingURL=rust.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/rust.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoBzC,oCAAoC;AACpC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0ErE"}
|