@vyuhlabs/dxkit 1.6.0 → 2.0.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 +126 -0
- package/README.md +3 -3
- package/dist/agents/extract.d.ts +25 -0
- package/dist/agents/extract.d.ts.map +1 -0
- package/dist/agents/extract.js +186 -0
- package/dist/agents/extract.js.map +1 -0
- package/dist/agents/schemas.d.ts +106 -0
- package/dist/agents/schemas.d.ts.map +1 -0
- package/dist/agents/schemas.js +86 -0
- package/dist/agents/schemas.js.map +1 -0
- package/dist/agents/session.d.ts +28 -0
- package/dist/agents/session.d.ts.map +1 -0
- package/dist/agents/session.js +223 -0
- package/dist/agents/session.js.map +1 -0
- package/dist/analyzers/developer/detailed.js +1 -1
- package/dist/analyzers/developer/detailed.js.map +1 -1
- package/dist/analyzers/dispatcher.d.ts +36 -0
- package/dist/analyzers/dispatcher.d.ts.map +1 -0
- package/dist/analyzers/dispatcher.js +62 -0
- package/dist/analyzers/dispatcher.js.map +1 -0
- package/dist/analyzers/docs/shallow.d.ts +3 -2
- package/dist/analyzers/docs/shallow.d.ts.map +1 -1
- package/dist/analyzers/docs/shallow.js +2 -2
- package/dist/analyzers/docs/shallow.js.map +1 -1
- package/dist/analyzers/dx/shallow.d.ts +3 -2
- package/dist/analyzers/dx/shallow.d.ts.map +1 -1
- package/dist/analyzers/dx/shallow.js +2 -2
- package/dist/analyzers/dx/shallow.js.map +1 -1
- package/dist/analyzers/health/actions.d.ts +3 -3
- package/dist/analyzers/health/actions.d.ts.map +1 -1
- package/dist/analyzers/health/actions.js +99 -52
- package/dist/analyzers/health/actions.js.map +1 -1
- package/dist/analyzers/health/detailed.d.ts.map +1 -1
- package/dist/analyzers/health/detailed.js +6 -2
- package/dist/analyzers/health/detailed.js.map +1 -1
- package/dist/analyzers/health.d.ts +0 -2
- package/dist/analyzers/health.d.ts.map +1 -1
- package/dist/analyzers/health.js +123 -72
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/maintainability/shallow.d.ts +3 -2
- package/dist/analyzers/maintainability/shallow.d.ts.map +1 -1
- package/dist/analyzers/maintainability/shallow.js +2 -2
- package/dist/analyzers/maintainability/shallow.js.map +1 -1
- package/dist/analyzers/quality/detailed.js +1 -1
- package/dist/analyzers/quality/detailed.js.map +1 -1
- package/dist/analyzers/quality/gather.d.ts +33 -4
- package/dist/analyzers/quality/gather.d.ts.map +1 -1
- package/dist/analyzers/quality/gather.js +81 -93
- package/dist/analyzers/quality/gather.js.map +1 -1
- package/dist/analyzers/quality/index.js +4 -4
- package/dist/analyzers/quality/index.js.map +1 -1
- package/dist/analyzers/quality/shallow.d.ts +3 -2
- package/dist/analyzers/quality/shallow.d.ts.map +1 -1
- package/dist/analyzers/quality/shallow.js +2 -2
- package/dist/analyzers/quality/shallow.js.map +1 -1
- package/dist/analyzers/scoring.d.ts +26 -9
- package/dist/analyzers/scoring.d.ts.map +1 -1
- package/dist/analyzers/scoring.js +83 -71
- package/dist/analyzers/scoring.js.map +1 -1
- package/dist/analyzers/security/detailed.js +1 -1
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts +28 -5
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +87 -135
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts +1 -1
- package/dist/analyzers/security/index.d.ts.map +1 -1
- package/dist/analyzers/security/index.js +27 -17
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/security/report.d.ts +6 -0
- package/dist/analyzers/security/report.d.ts.map +1 -0
- package/dist/analyzers/security/report.js +118 -0
- package/dist/analyzers/security/report.js.map +1 -0
- package/dist/analyzers/security/shallow.d.ts +3 -2
- package/dist/analyzers/security/shallow.d.ts.map +1 -1
- package/dist/analyzers/security/shallow.js +2 -2
- package/dist/analyzers/security/shallow.js.map +1 -1
- package/dist/analyzers/tests/detailed.js +1 -1
- package/dist/analyzers/tests/detailed.js.map +1 -1
- package/dist/analyzers/tests/import-graph.d.ts +8 -22
- package/dist/analyzers/tests/import-graph.d.ts.map +1 -1
- package/dist/analyzers/tests/import-graph.js +22 -189
- package/dist/analyzers/tests/import-graph.js.map +1 -1
- package/dist/analyzers/tests/index.d.ts +1 -1
- package/dist/analyzers/tests/index.d.ts.map +1 -1
- package/dist/analyzers/tests/index.js +3 -3
- package/dist/analyzers/tests/index.js.map +1 -1
- package/dist/analyzers/tests/shallow.d.ts +3 -2
- package/dist/analyzers/tests/shallow.d.ts.map +1 -1
- package/dist/analyzers/tests/shallow.js +2 -2
- package/dist/analyzers/tests/shallow.js.map +1 -1
- package/dist/analyzers/tools/coverage.d.ts +21 -11
- package/dist/analyzers/tools/coverage.d.ts.map +1 -1
- package/dist/analyzers/tools/coverage.js +32 -44
- package/dist/analyzers/tools/coverage.js.map +1 -1
- package/dist/analyzers/tools/dotnet.d.ts +8 -0
- package/dist/analyzers/tools/dotnet.d.ts.map +1 -0
- package/dist/analyzers/tools/dotnet.js +81 -0
- package/dist/analyzers/tools/dotnet.js.map +1 -0
- package/dist/analyzers/tools/gather-cache.d.ts +16 -0
- package/dist/analyzers/tools/gather-cache.d.ts.map +1 -0
- package/dist/analyzers/tools/gather-cache.js +126 -0
- package/dist/analyzers/tools/gather-cache.js.map +1 -0
- package/dist/analyzers/tools/generic.d.ts.map +1 -1
- package/dist/analyzers/tools/generic.js +6 -28
- package/dist/analyzers/tools/generic.js.map +1 -1
- package/dist/analyzers/tools/gitleaks.d.ts +28 -5
- package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
- package/dist/analyzers/tools/gitleaks.js +91 -37
- package/dist/analyzers/tools/gitleaks.js.map +1 -1
- package/dist/analyzers/tools/go.d.ts +8 -0
- package/dist/analyzers/tools/go.d.ts.map +1 -0
- package/dist/analyzers/tools/go.js +84 -0
- package/dist/analyzers/tools/go.js.map +1 -0
- package/dist/analyzers/tools/graphify.d.ts +31 -3
- package/dist/analyzers/tools/graphify.d.ts.map +1 -1
- package/dist/analyzers/tools/graphify.js +78 -36
- package/dist/analyzers/tools/graphify.js.map +1 -1
- package/dist/analyzers/tools/grep-secrets.d.ts +6 -0
- package/dist/analyzers/tools/grep-secrets.d.ts.map +1 -0
- package/dist/analyzers/tools/grep-secrets.js +124 -0
- package/dist/analyzers/tools/grep-secrets.js.map +1 -0
- package/dist/analyzers/tools/jscpd.d.ts +40 -0
- package/dist/analyzers/tools/jscpd.d.ts.map +1 -0
- package/dist/analyzers/tools/jscpd.js +96 -0
- package/dist/analyzers/tools/jscpd.js.map +1 -0
- package/dist/analyzers/tools/node.d.ts +8 -0
- package/dist/analyzers/tools/node.d.ts.map +1 -0
- package/dist/analyzers/tools/node.js +160 -0
- package/dist/analyzers/tools/node.js.map +1 -0
- package/dist/analyzers/tools/package-json.d.ts +6 -0
- package/dist/analyzers/tools/package-json.d.ts.map +1 -0
- package/dist/analyzers/tools/package-json.js +67 -0
- package/dist/analyzers/tools/package-json.js.map +1 -0
- package/dist/analyzers/tools/parallel.d.ts +22 -5
- package/dist/analyzers/tools/parallel.d.ts.map +1 -1
- package/dist/analyzers/tools/parallel.js +26 -185
- package/dist/analyzers/tools/parallel.js.map +1 -1
- package/dist/analyzers/tools/paths.d.ts +21 -0
- package/dist/analyzers/tools/paths.d.ts.map +1 -0
- package/dist/analyzers/tools/paths.js +62 -0
- package/dist/analyzers/tools/paths.js.map +1 -0
- package/dist/analyzers/tools/python.d.ts +8 -0
- package/dist/analyzers/tools/python.d.ts.map +1 -0
- package/dist/analyzers/tools/python.js +81 -0
- package/dist/analyzers/tools/python.js.map +1 -0
- package/dist/analyzers/tools/rust.d.ts +8 -0
- package/dist/analyzers/tools/rust.d.ts.map +1 -0
- package/dist/analyzers/tools/rust.js +86 -0
- package/dist/analyzers/tools/rust.js.map +1 -0
- package/dist/analyzers/tools/semgrep.d.ts +39 -0
- package/dist/analyzers/tools/semgrep.d.ts.map +1 -0
- package/dist/analyzers/tools/semgrep.js +129 -0
- package/dist/analyzers/tools/semgrep.js.map +1 -0
- package/dist/analyzers/tools/tool-registry.d.ts +0 -41
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
- package/dist/analyzers/tools/tool-registry.js +0 -87
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/analyzers/types.d.ts +42 -30
- package/dist/analyzers/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -8
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +55 -14
- package/dist/constants.js.map +1 -1
- package/dist/languages/capabilities/descriptors.d.ts +74 -0
- package/dist/languages/capabilities/descriptors.d.ts.map +1 -0
- package/dist/languages/capabilities/descriptors.js +250 -0
- package/dist/languages/capabilities/descriptors.js.map +1 -0
- package/dist/languages/capabilities/global.d.ts +43 -0
- package/dist/languages/capabilities/global.d.ts.map +1 -0
- package/dist/languages/capabilities/global.js +48 -0
- package/dist/languages/capabilities/global.js.map +1 -0
- package/dist/languages/capabilities/index.d.ts +31 -0
- package/dist/languages/capabilities/index.d.ts.map +1 -0
- package/dist/languages/capabilities/index.js +56 -0
- package/dist/languages/capabilities/index.js.map +1 -0
- package/dist/languages/capabilities/provider.d.ts +16 -0
- package/dist/languages/capabilities/provider.d.ts.map +1 -0
- package/dist/languages/capabilities/provider.js +12 -0
- package/dist/languages/capabilities/provider.js.map +1 -0
- package/dist/languages/capabilities/types.d.ts +226 -0
- package/dist/languages/capabilities/types.d.ts.map +1 -0
- package/dist/languages/capabilities/types.js +23 -0
- package/dist/languages/capabilities/types.js.map +1 -0
- package/dist/languages/csharp.d.ts +8 -0
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +203 -103
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts +13 -7
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +277 -183
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/python.d.ts +14 -0
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +276 -169
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/rust.d.ts +8 -0
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +218 -131
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/types.d.ts +16 -15
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript.d.ts +12 -11
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +256 -161
- package/dist/languages/typescript.js.map +1 -1
- package/package.json +1 -1
- package/templates/.ai/templates/session-checkpoint-template.md +97 -0
|
@@ -0,0 +1,160 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/analyzers/tools/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/package-json.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAcxE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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.gatherPackageJsonMetrics = gatherPackageJsonMetrics;
|
|
37
|
+
/**
|
|
38
|
+
* `package.json`-derived metrics — the two TypeScript-only signals that
|
|
39
|
+
* don't fit the capability model (every capability is language-agnostic
|
|
40
|
+
* by design; npm scripts and Node engine pins are Node-specific by
|
|
41
|
+
* definition).
|
|
42
|
+
*
|
|
43
|
+
* Phase 10e.C.5 extracted these from `typescript.ts:gatherMetrics` when
|
|
44
|
+
* the legacy Layer 1 channel was retired. The helper replaces the prior
|
|
45
|
+
* `node -e "require('./package.json')..."` subprocess pair with a single
|
|
46
|
+
* `fs.readFileSync` + `JSON.parse`.
|
|
47
|
+
*
|
|
48
|
+
* Absent or unparseable `package.json` returns the zero / null pair —
|
|
49
|
+
* the scoring dimensions treat that as "no scripts" / "no engine pinned"
|
|
50
|
+
* rather than as a distinct missing-data state.
|
|
51
|
+
*/
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
function gatherPackageJsonMetrics(cwd) {
|
|
55
|
+
try {
|
|
56
|
+
const raw = fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8');
|
|
57
|
+
const pkg = JSON.parse(raw);
|
|
58
|
+
return {
|
|
59
|
+
npmScriptsCount: pkg.scripts ? Object.keys(pkg.scripts).length : 0,
|
|
60
|
+
nodeEngineVersion: pkg.engines?.node ?? null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return { npmScriptsCount: 0, nodeEngineVersion: null };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=package-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/analyzers/tools/package-json.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,4DAcC;AArCD;;;;;;;;;;;;;;GAcG;AACH,uCAAyB;AACzB,2CAA6B;AAO7B,SAAgB,wBAAwB,CAAC,GAAW;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAGzB,CAAC;QACF,OAAO;YACL,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAClE,iBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;SAC7C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
import { HealthMetrics } from '../types';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Layer 2 orchestrator — populates the non-capability slice of
|
|
3
|
+
* `HealthMetrics` (cloc-derived `sourceFiles` / `totalLines` /
|
|
4
|
+
* `clocLanguages`) and contributes tool-availability strings to
|
|
5
|
+
* `toolsUsed` / `toolsUnavailable` for gitleaks and graphify.
|
|
6
|
+
*
|
|
7
|
+
* Phase 10e.C.7 narrowed `HealthMetrics` to drop every capability-owned
|
|
8
|
+
* field; the secret findings and structural stats that this file used to
|
|
9
|
+
* reshape now live exclusively under `HealthReport.capabilities`. What
|
|
10
|
+
* remains is the tool-name surface users see in reports.
|
|
11
|
+
*
|
|
12
|
+
* Phase 10e.C.3 replaced the prior child-process + bash orchestration
|
|
13
|
+
* with direct in-process calls to the memoized outcome helpers
|
|
14
|
+
* (`gatherGitleaksResult`, `gatherGraphifyResult`); the capability
|
|
15
|
+
* dispatcher's later `SECRETS` / `STRUCTURAL` calls in
|
|
16
|
+
* `gatherCapabilityReport` hit cached outcomes, so each tool runs
|
|
17
|
+
* exactly once per analyzer run.
|
|
18
|
+
*
|
|
19
|
+
* Keeps the sync signature — callers in `analyzers/health.ts` wrap with
|
|
20
|
+
* `timed()`, not `timedAsync()`. Tool-name strings are byte-identical to
|
|
21
|
+
* pre-C.7, including the exact `toolsUnavailable` phrasings.
|
|
6
22
|
*/
|
|
7
|
-
|
|
23
|
+
import { HealthMetrics } from '../types';
|
|
24
|
+
export declare function gatherLayer2Parallel(cwd: string, _verbose?: boolean): Partial<HealthMetrics>;
|
|
8
25
|
//# sourceMappingURL=parallel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/parallel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/parallel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC1F"}
|
|
@@ -1,195 +1,36 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.gatherLayer2Parallel = gatherLayer2Parallel;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const fs = __importStar(require("fs"));
|
|
48
|
-
const path = __importStar(require("path"));
|
|
49
|
-
const os = __importStar(require("os"));
|
|
50
|
-
const child_process_1 = require("child_process");
|
|
51
|
-
/**
|
|
52
|
-
* Run cloc + gitleaks + graphify gather functions in parallel child processes.
|
|
53
|
-
* Each child calls the real gather function from the existing tool module.
|
|
54
|
-
* Falls back to sequential on low memory (<1GB free).
|
|
55
|
-
*/
|
|
56
|
-
function gatherLayer2Parallel(cwd, verbose = false) {
|
|
57
|
-
const dxkitDist = path.resolve(__dirname, '..');
|
|
58
|
-
const tasks = [
|
|
59
|
-
{
|
|
60
|
-
name: 'cloc',
|
|
61
|
-
modulePath: './cloc',
|
|
62
|
-
functionName: 'gatherClocMetrics',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: 'gitleaks',
|
|
66
|
-
modulePath: './gitleaks',
|
|
67
|
-
functionName: 'gatherGitleaksMetrics',
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
name: 'graphify',
|
|
71
|
-
modulePath: './graphify',
|
|
72
|
-
functionName: 'gatherGraphifyMetrics',
|
|
73
|
-
},
|
|
74
|
-
];
|
|
75
|
-
// Check available memory — fall back to sequential if <1GB free
|
|
76
|
-
const freeMem = os.freemem();
|
|
77
|
-
const useParallel = freeMem >= 1024 * 1024 * 1024;
|
|
78
|
-
if (verbose && !useParallel) {
|
|
79
|
-
console.error(` [parallel] Low memory (${Math.round(freeMem / 1024 / 1024)}MB free), running sequentially`);
|
|
80
|
-
}
|
|
81
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'dxkit-l2-'));
|
|
82
|
-
const startTime = Date.now();
|
|
83
|
-
if (useParallel) {
|
|
84
|
-
runTasksParallel(tasks, cwd, dxkitDist, tmpDir, verbose);
|
|
4
|
+
const cloc_1 = require("./cloc");
|
|
5
|
+
const gitleaks_1 = require("./gitleaks");
|
|
6
|
+
const graphify_1 = require("./graphify");
|
|
7
|
+
function gatherLayer2Parallel(cwd, _verbose = false) {
|
|
8
|
+
const clocPartial = (0, cloc_1.gatherClocMetrics)(cwd);
|
|
9
|
+
const toolsUsed = [...(clocPartial.toolsUsed ?? [])];
|
|
10
|
+
const toolsUnavailable = [...(clocPartial.toolsUnavailable ?? [])];
|
|
11
|
+
const gitleaks = (0, gitleaks_1.gatherGitleaksResult)(cwd);
|
|
12
|
+
if (gitleaks.kind === 'success') {
|
|
13
|
+
toolsUsed.push('gitleaks');
|
|
85
14
|
}
|
|
86
15
|
else {
|
|
87
|
-
|
|
16
|
+
// `not installed` renders as bare `gitleaks`, every other failure
|
|
17
|
+
// mode carries its reason as a parenthetical — byte-identical to
|
|
18
|
+
// the pre-C.7 string the report surfaces.
|
|
19
|
+
toolsUnavailable.push(gitleaks.reason === 'not installed' ? 'gitleaks' : `gitleaks (${gitleaks.reason})`);
|
|
88
20
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
21
|
+
const graphify = (0, graphify_1.gatherGraphifyResult)(cwd);
|
|
22
|
+
if (graphify.kind === 'success') {
|
|
23
|
+
toolsUsed.push('graphify');
|
|
92
24
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
25
|
+
else {
|
|
26
|
+
toolsUnavailable.push(`graphify (${graphify.reason})`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
sourceFiles: clocPartial.sourceFiles,
|
|
30
|
+
totalLines: clocPartial.totalLines,
|
|
31
|
+
clocLanguages: clocPartial.clocLanguages,
|
|
32
|
+
toolsUsed,
|
|
33
|
+
toolsUnavailable,
|
|
97
34
|
};
|
|
98
|
-
for (let i = 0; i < tasks.length; i++) {
|
|
99
|
-
const resultFile = path.join(tmpDir, `${tasks[i].name}.json`);
|
|
100
|
-
try {
|
|
101
|
-
const raw = fs.readFileSync(resultFile, 'utf-8');
|
|
102
|
-
const partial = JSON.parse(raw);
|
|
103
|
-
// Merge arrays
|
|
104
|
-
if (partial.toolsUsed) {
|
|
105
|
-
merged.toolsUsed.push(...partial.toolsUsed);
|
|
106
|
-
delete partial.toolsUsed;
|
|
107
|
-
}
|
|
108
|
-
if (partial.toolsUnavailable) {
|
|
109
|
-
merged.toolsUnavailable.push(...partial.toolsUnavailable);
|
|
110
|
-
delete partial.toolsUnavailable;
|
|
111
|
-
}
|
|
112
|
-
// Merge non-null values
|
|
113
|
-
for (const [k, v] of Object.entries(partial)) {
|
|
114
|
-
if (v !== null && v !== undefined) {
|
|
115
|
-
merged[k] = v;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
// Tool didn't produce output — skip
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// Cleanup
|
|
124
|
-
try {
|
|
125
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
/* ignore */
|
|
129
|
-
}
|
|
130
|
-
return merged;
|
|
131
|
-
}
|
|
132
|
-
/** Build the Node.js script that calls a gather function and writes result to file. */
|
|
133
|
-
function buildWorkerScript(task, cwd, resultFile) {
|
|
134
|
-
// The child process requires the SAME compiled module and calls the SAME function.
|
|
135
|
-
// No duplication — it's literally require('<abs-path>/tools/cloc').gatherClocMetrics(cwd).
|
|
136
|
-
// Use __dirname at build time to resolve the absolute path to dist/analyzers/.
|
|
137
|
-
const absModulePath = path.resolve(__dirname, task.modulePath);
|
|
138
|
-
return `
|
|
139
|
-
try {
|
|
140
|
-
var mod = require('${absModulePath.replace(/\\/g, '/')}');
|
|
141
|
-
var result = mod.${task.functionName}('${cwd.replace(/'/g, "\\'")}');
|
|
142
|
-
require('fs').writeFileSync('${resultFile}', JSON.stringify(result));
|
|
143
|
-
} catch (e) {
|
|
144
|
-
require('fs').writeFileSync('${resultFile}', JSON.stringify({
|
|
145
|
-
toolsUnavailable: ['${task.name} (child process error: ' + (e.message || '').slice(0, 100) + ')']
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
148
|
-
`;
|
|
149
|
-
}
|
|
150
|
-
function runTasksParallel(tasks, cwd, dxkitDist, tmpDir, _verbose) {
|
|
151
|
-
// Write each task as a standalone Node script file, then run all via bash `&` + `wait`.
|
|
152
|
-
// This gives true OS-level parallelism without poll overhead.
|
|
153
|
-
const scriptPaths = [];
|
|
154
|
-
for (const task of tasks) {
|
|
155
|
-
const resultFile = path.join(tmpDir, `${task.name}.json`);
|
|
156
|
-
const workerScript = buildWorkerScript(task, cwd, resultFile);
|
|
157
|
-
const scriptPath = path.join(tmpDir, `${task.name}.js`);
|
|
158
|
-
fs.writeFileSync(scriptPath, workerScript);
|
|
159
|
-
scriptPaths.push(scriptPath);
|
|
160
|
-
}
|
|
161
|
-
// Bash script that backgrounds all node processes and waits
|
|
162
|
-
const bashLines = scriptPaths.map((sp) => `node '${sp}' &`);
|
|
163
|
-
bashLines.push('wait');
|
|
164
|
-
const bashScript = path.join(tmpDir, 'run-parallel.sh');
|
|
165
|
-
fs.writeFileSync(bashScript, '#!/bin/bash\n' + bashLines.join('\n') + '\n');
|
|
166
|
-
fs.chmodSync(bashScript, 0o755);
|
|
167
|
-
try {
|
|
168
|
-
(0, child_process_1.execSync)(bashScript, {
|
|
169
|
-
cwd: dxkitDist,
|
|
170
|
-
stdio: 'ignore',
|
|
171
|
-
timeout: 300000,
|
|
172
|
-
env: process.env,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
catch {
|
|
176
|
-
// Timeout or error — still try to read whatever completed
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
function runTasksSequential(tasks, cwd, dxkitDist, tmpDir) {
|
|
180
|
-
for (const task of tasks) {
|
|
181
|
-
const resultFile = path.join(tmpDir, `${task.name}.json`);
|
|
182
|
-
const script = buildWorkerScript(task, cwd, resultFile);
|
|
183
|
-
try {
|
|
184
|
-
(0, child_process_1.execSync)(`node -e '${script.replace(/'/g, "'\\''")}'`, {
|
|
185
|
-
cwd: dxkitDist,
|
|
186
|
-
stdio: 'ignore',
|
|
187
|
-
timeout: 180000,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
/* continue with next tool */
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
35
|
}
|
|
195
36
|
//# sourceMappingURL=parallel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../src/analyzers/tools/parallel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../src/analyzers/tools/parallel.ts"],"names":[],"mappings":";;AA2BA,oDAgCC;AApCD,iCAA2C;AAC3C,yCAAkD;AAClD,yCAAkD;AAElD,SAAgB,oBAAoB,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK;IAChE,MAAM,WAAW,GAAG,IAAA,wBAAiB,EAAC,GAAG,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAa,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAa,CAAC,GAAG,CAAC,WAAW,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,IAAA,+BAAoB,EAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,kEAAkE;QAClE,iEAAiE;QACjE,0CAA0C;QAC1C,gBAAgB,CAAC,IAAI,CACnB,QAAQ,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,+BAAoB,EAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,gBAAgB,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,SAAS;QACT,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path normalization helpers shared across tool wrappers.
|
|
3
|
+
*
|
|
4
|
+
* Every tool that shells out and parses a JSON report (gitleaks, semgrep,
|
|
5
|
+
* jscpd, graphify, ...) ends up with file paths whose shape depends on
|
|
6
|
+
* the tool and the cwd it was invoked with. Instead of each wrapper
|
|
7
|
+
* inventing its own `.replace(cwd, '')` slicing — which silently
|
|
8
|
+
* corrupts filenames when `cwd === '.'` (the literal `.` in `.env` is
|
|
9
|
+
* treated as the cwd match and stripped) — they go through
|
|
10
|
+
* `toProjectRelative` here.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Normalize a tool-reported path to a POSIX project-relative string.
|
|
14
|
+
*
|
|
15
|
+
* Handles: absolute paths, paths relative to cwd, cwd passed as `.` or
|
|
16
|
+
* with a trailing slash, filenames with literal leading dots (`.env`,
|
|
17
|
+
* `.dxkit-suppressions.json`). Uses `path.relative` on resolved
|
|
18
|
+
* absolute forms so there's no string munging to go wrong.
|
|
19
|
+
*/
|
|
20
|
+
export declare function toProjectRelative(cwd: string, fileFromTool: string): string;
|
|
21
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAI3E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Path normalization helpers shared across tool wrappers.
|
|
4
|
+
*
|
|
5
|
+
* Every tool that shells out and parses a JSON report (gitleaks, semgrep,
|
|
6
|
+
* jscpd, graphify, ...) ends up with file paths whose shape depends on
|
|
7
|
+
* the tool and the cwd it was invoked with. Instead of each wrapper
|
|
8
|
+
* inventing its own `.replace(cwd, '')` slicing — which silently
|
|
9
|
+
* corrupts filenames when `cwd === '.'` (the literal `.` in `.env` is
|
|
10
|
+
* treated as the cwd match and stripped) — they go through
|
|
11
|
+
* `toProjectRelative` here.
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.toProjectRelative = toProjectRelative;
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
/**
|
|
50
|
+
* Normalize a tool-reported path to a POSIX project-relative string.
|
|
51
|
+
*
|
|
52
|
+
* Handles: absolute paths, paths relative to cwd, cwd passed as `.` or
|
|
53
|
+
* with a trailing slash, filenames with literal leading dots (`.env`,
|
|
54
|
+
* `.dxkit-suppressions.json`). Uses `path.relative` on resolved
|
|
55
|
+
* absolute forms so there's no string munging to go wrong.
|
|
56
|
+
*/
|
|
57
|
+
function toProjectRelative(cwd, fileFromTool) {
|
|
58
|
+
const absCwd = path.resolve(cwd);
|
|
59
|
+
const absFile = path.isAbsolute(fileFromTool) ? fileFromTool : path.resolve(absCwd, fileFromTool);
|
|
60
|
+
return path.relative(absCwd, absFile).split(path.sep).join('/');
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/analyzers/tools/paths.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,8CAIC;AAdD,2CAA6B;AAE7B;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,YAAoB;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClG,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|