@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.
Files changed (211) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +3 -3
  3. package/dist/agents/extract.d.ts +25 -0
  4. package/dist/agents/extract.d.ts.map +1 -0
  5. package/dist/agents/extract.js +186 -0
  6. package/dist/agents/extract.js.map +1 -0
  7. package/dist/agents/schemas.d.ts +106 -0
  8. package/dist/agents/schemas.d.ts.map +1 -0
  9. package/dist/agents/schemas.js +86 -0
  10. package/dist/agents/schemas.js.map +1 -0
  11. package/dist/agents/session.d.ts +28 -0
  12. package/dist/agents/session.d.ts.map +1 -0
  13. package/dist/agents/session.js +223 -0
  14. package/dist/agents/session.js.map +1 -0
  15. package/dist/analyzers/developer/detailed.js +1 -1
  16. package/dist/analyzers/developer/detailed.js.map +1 -1
  17. package/dist/analyzers/dispatcher.d.ts +36 -0
  18. package/dist/analyzers/dispatcher.d.ts.map +1 -0
  19. package/dist/analyzers/dispatcher.js +62 -0
  20. package/dist/analyzers/dispatcher.js.map +1 -0
  21. package/dist/analyzers/docs/shallow.d.ts +3 -2
  22. package/dist/analyzers/docs/shallow.d.ts.map +1 -1
  23. package/dist/analyzers/docs/shallow.js +2 -2
  24. package/dist/analyzers/docs/shallow.js.map +1 -1
  25. package/dist/analyzers/dx/shallow.d.ts +3 -2
  26. package/dist/analyzers/dx/shallow.d.ts.map +1 -1
  27. package/dist/analyzers/dx/shallow.js +2 -2
  28. package/dist/analyzers/dx/shallow.js.map +1 -1
  29. package/dist/analyzers/health/actions.d.ts +3 -3
  30. package/dist/analyzers/health/actions.d.ts.map +1 -1
  31. package/dist/analyzers/health/actions.js +99 -52
  32. package/dist/analyzers/health/actions.js.map +1 -1
  33. package/dist/analyzers/health/detailed.d.ts.map +1 -1
  34. package/dist/analyzers/health/detailed.js +6 -2
  35. package/dist/analyzers/health/detailed.js.map +1 -1
  36. package/dist/analyzers/health.d.ts +0 -2
  37. package/dist/analyzers/health.d.ts.map +1 -1
  38. package/dist/analyzers/health.js +123 -72
  39. package/dist/analyzers/health.js.map +1 -1
  40. package/dist/analyzers/maintainability/shallow.d.ts +3 -2
  41. package/dist/analyzers/maintainability/shallow.d.ts.map +1 -1
  42. package/dist/analyzers/maintainability/shallow.js +2 -2
  43. package/dist/analyzers/maintainability/shallow.js.map +1 -1
  44. package/dist/analyzers/quality/detailed.js +1 -1
  45. package/dist/analyzers/quality/detailed.js.map +1 -1
  46. package/dist/analyzers/quality/gather.d.ts +33 -4
  47. package/dist/analyzers/quality/gather.d.ts.map +1 -1
  48. package/dist/analyzers/quality/gather.js +81 -93
  49. package/dist/analyzers/quality/gather.js.map +1 -1
  50. package/dist/analyzers/quality/index.js +4 -4
  51. package/dist/analyzers/quality/index.js.map +1 -1
  52. package/dist/analyzers/quality/shallow.d.ts +3 -2
  53. package/dist/analyzers/quality/shallow.d.ts.map +1 -1
  54. package/dist/analyzers/quality/shallow.js +2 -2
  55. package/dist/analyzers/quality/shallow.js.map +1 -1
  56. package/dist/analyzers/scoring.d.ts +26 -9
  57. package/dist/analyzers/scoring.d.ts.map +1 -1
  58. package/dist/analyzers/scoring.js +83 -71
  59. package/dist/analyzers/scoring.js.map +1 -1
  60. package/dist/analyzers/security/detailed.js +1 -1
  61. package/dist/analyzers/security/detailed.js.map +1 -1
  62. package/dist/analyzers/security/gather.d.ts +28 -5
  63. package/dist/analyzers/security/gather.d.ts.map +1 -1
  64. package/dist/analyzers/security/gather.js +87 -135
  65. package/dist/analyzers/security/gather.js.map +1 -1
  66. package/dist/analyzers/security/index.d.ts +1 -1
  67. package/dist/analyzers/security/index.d.ts.map +1 -1
  68. package/dist/analyzers/security/index.js +27 -17
  69. package/dist/analyzers/security/index.js.map +1 -1
  70. package/dist/analyzers/security/report.d.ts +6 -0
  71. package/dist/analyzers/security/report.d.ts.map +1 -0
  72. package/dist/analyzers/security/report.js +118 -0
  73. package/dist/analyzers/security/report.js.map +1 -0
  74. package/dist/analyzers/security/shallow.d.ts +3 -2
  75. package/dist/analyzers/security/shallow.d.ts.map +1 -1
  76. package/dist/analyzers/security/shallow.js +2 -2
  77. package/dist/analyzers/security/shallow.js.map +1 -1
  78. package/dist/analyzers/tests/detailed.js +1 -1
  79. package/dist/analyzers/tests/detailed.js.map +1 -1
  80. package/dist/analyzers/tests/import-graph.d.ts +8 -22
  81. package/dist/analyzers/tests/import-graph.d.ts.map +1 -1
  82. package/dist/analyzers/tests/import-graph.js +22 -189
  83. package/dist/analyzers/tests/import-graph.js.map +1 -1
  84. package/dist/analyzers/tests/index.d.ts +1 -1
  85. package/dist/analyzers/tests/index.d.ts.map +1 -1
  86. package/dist/analyzers/tests/index.js +3 -3
  87. package/dist/analyzers/tests/index.js.map +1 -1
  88. package/dist/analyzers/tests/shallow.d.ts +3 -2
  89. package/dist/analyzers/tests/shallow.d.ts.map +1 -1
  90. package/dist/analyzers/tests/shallow.js +2 -2
  91. package/dist/analyzers/tests/shallow.js.map +1 -1
  92. package/dist/analyzers/tools/coverage.d.ts +21 -11
  93. package/dist/analyzers/tools/coverage.d.ts.map +1 -1
  94. package/dist/analyzers/tools/coverage.js +32 -44
  95. package/dist/analyzers/tools/coverage.js.map +1 -1
  96. package/dist/analyzers/tools/dotnet.d.ts +8 -0
  97. package/dist/analyzers/tools/dotnet.d.ts.map +1 -0
  98. package/dist/analyzers/tools/dotnet.js +81 -0
  99. package/dist/analyzers/tools/dotnet.js.map +1 -0
  100. package/dist/analyzers/tools/gather-cache.d.ts +16 -0
  101. package/dist/analyzers/tools/gather-cache.d.ts.map +1 -0
  102. package/dist/analyzers/tools/gather-cache.js +126 -0
  103. package/dist/analyzers/tools/gather-cache.js.map +1 -0
  104. package/dist/analyzers/tools/generic.d.ts.map +1 -1
  105. package/dist/analyzers/tools/generic.js +6 -28
  106. package/dist/analyzers/tools/generic.js.map +1 -1
  107. package/dist/analyzers/tools/gitleaks.d.ts +28 -5
  108. package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
  109. package/dist/analyzers/tools/gitleaks.js +91 -37
  110. package/dist/analyzers/tools/gitleaks.js.map +1 -1
  111. package/dist/analyzers/tools/go.d.ts +8 -0
  112. package/dist/analyzers/tools/go.d.ts.map +1 -0
  113. package/dist/analyzers/tools/go.js +84 -0
  114. package/dist/analyzers/tools/go.js.map +1 -0
  115. package/dist/analyzers/tools/graphify.d.ts +31 -3
  116. package/dist/analyzers/tools/graphify.d.ts.map +1 -1
  117. package/dist/analyzers/tools/graphify.js +78 -36
  118. package/dist/analyzers/tools/graphify.js.map +1 -1
  119. package/dist/analyzers/tools/grep-secrets.d.ts +6 -0
  120. package/dist/analyzers/tools/grep-secrets.d.ts.map +1 -0
  121. package/dist/analyzers/tools/grep-secrets.js +124 -0
  122. package/dist/analyzers/tools/grep-secrets.js.map +1 -0
  123. package/dist/analyzers/tools/jscpd.d.ts +40 -0
  124. package/dist/analyzers/tools/jscpd.d.ts.map +1 -0
  125. package/dist/analyzers/tools/jscpd.js +96 -0
  126. package/dist/analyzers/tools/jscpd.js.map +1 -0
  127. package/dist/analyzers/tools/node.d.ts +8 -0
  128. package/dist/analyzers/tools/node.d.ts.map +1 -0
  129. package/dist/analyzers/tools/node.js +160 -0
  130. package/dist/analyzers/tools/node.js.map +1 -0
  131. package/dist/analyzers/tools/package-json.d.ts +6 -0
  132. package/dist/analyzers/tools/package-json.d.ts.map +1 -0
  133. package/dist/analyzers/tools/package-json.js +67 -0
  134. package/dist/analyzers/tools/package-json.js.map +1 -0
  135. package/dist/analyzers/tools/parallel.d.ts +22 -5
  136. package/dist/analyzers/tools/parallel.d.ts.map +1 -1
  137. package/dist/analyzers/tools/parallel.js +26 -185
  138. package/dist/analyzers/tools/parallel.js.map +1 -1
  139. package/dist/analyzers/tools/paths.d.ts +21 -0
  140. package/dist/analyzers/tools/paths.d.ts.map +1 -0
  141. package/dist/analyzers/tools/paths.js +62 -0
  142. package/dist/analyzers/tools/paths.js.map +1 -0
  143. package/dist/analyzers/tools/python.d.ts +8 -0
  144. package/dist/analyzers/tools/python.d.ts.map +1 -0
  145. package/dist/analyzers/tools/python.js +81 -0
  146. package/dist/analyzers/tools/python.js.map +1 -0
  147. package/dist/analyzers/tools/rust.d.ts +8 -0
  148. package/dist/analyzers/tools/rust.d.ts.map +1 -0
  149. package/dist/analyzers/tools/rust.js +86 -0
  150. package/dist/analyzers/tools/rust.js.map +1 -0
  151. package/dist/analyzers/tools/semgrep.d.ts +39 -0
  152. package/dist/analyzers/tools/semgrep.d.ts.map +1 -0
  153. package/dist/analyzers/tools/semgrep.js +129 -0
  154. package/dist/analyzers/tools/semgrep.js.map +1 -0
  155. package/dist/analyzers/tools/tool-registry.d.ts +0 -41
  156. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  157. package/dist/analyzers/tools/tool-registry.js +0 -87
  158. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  159. package/dist/analyzers/types.d.ts +42 -30
  160. package/dist/analyzers/types.d.ts.map +1 -1
  161. package/dist/cli.d.ts.map +1 -1
  162. package/dist/cli.js +16 -8
  163. package/dist/cli.js.map +1 -1
  164. package/dist/constants.d.ts +1 -3
  165. package/dist/constants.d.ts.map +1 -1
  166. package/dist/constants.js +55 -14
  167. package/dist/constants.js.map +1 -1
  168. package/dist/languages/capabilities/descriptors.d.ts +74 -0
  169. package/dist/languages/capabilities/descriptors.d.ts.map +1 -0
  170. package/dist/languages/capabilities/descriptors.js +250 -0
  171. package/dist/languages/capabilities/descriptors.js.map +1 -0
  172. package/dist/languages/capabilities/global.d.ts +43 -0
  173. package/dist/languages/capabilities/global.d.ts.map +1 -0
  174. package/dist/languages/capabilities/global.js +48 -0
  175. package/dist/languages/capabilities/global.js.map +1 -0
  176. package/dist/languages/capabilities/index.d.ts +31 -0
  177. package/dist/languages/capabilities/index.d.ts.map +1 -0
  178. package/dist/languages/capabilities/index.js +56 -0
  179. package/dist/languages/capabilities/index.js.map +1 -0
  180. package/dist/languages/capabilities/provider.d.ts +16 -0
  181. package/dist/languages/capabilities/provider.d.ts.map +1 -0
  182. package/dist/languages/capabilities/provider.js +12 -0
  183. package/dist/languages/capabilities/provider.js.map +1 -0
  184. package/dist/languages/capabilities/types.d.ts +226 -0
  185. package/dist/languages/capabilities/types.d.ts.map +1 -0
  186. package/dist/languages/capabilities/types.js +23 -0
  187. package/dist/languages/capabilities/types.js.map +1 -0
  188. package/dist/languages/csharp.d.ts +8 -0
  189. package/dist/languages/csharp.d.ts.map +1 -1
  190. package/dist/languages/csharp.js +203 -103
  191. package/dist/languages/csharp.js.map +1 -1
  192. package/dist/languages/go.d.ts +13 -7
  193. package/dist/languages/go.d.ts.map +1 -1
  194. package/dist/languages/go.js +277 -183
  195. package/dist/languages/go.js.map +1 -1
  196. package/dist/languages/python.d.ts +14 -0
  197. package/dist/languages/python.d.ts.map +1 -1
  198. package/dist/languages/python.js +276 -169
  199. package/dist/languages/python.js.map +1 -1
  200. package/dist/languages/rust.d.ts +8 -0
  201. package/dist/languages/rust.d.ts.map +1 -1
  202. package/dist/languages/rust.js +218 -131
  203. package/dist/languages/rust.js.map +1 -1
  204. package/dist/languages/types.d.ts +16 -15
  205. package/dist/languages/types.d.ts.map +1 -1
  206. package/dist/languages/typescript.d.ts +12 -11
  207. package/dist/languages/typescript.d.ts.map +1 -1
  208. package/dist/languages/typescript.js +256 -161
  209. package/dist/languages/typescript.js.map +1 -1
  210. package/package.json +1 -1
  211. 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,6 @@
1
+ export interface PackageJsonMetrics {
2
+ npmScriptsCount: number;
3
+ nodeEngineVersion: string | null;
4
+ }
5
+ export declare function gatherPackageJsonMetrics(cwd: string): PackageJsonMetrics;
6
+ //# sourceMappingURL=package-json.d.ts.map
@@ -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
- * Run cloc + gitleaks + graphify gather functions in parallel child processes.
4
- * Each child calls the real gather function from the existing tool module.
5
- * Falls back to sequential on low memory (<1GB free).
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
- export declare function gatherLayer2Parallel(cwd: string, verbose?: boolean): Partial<HealthMetrics>;
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":"AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAoFzF"}
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
- * Parallel tool execution — run Layer 2 gather functions concurrently
39
- * by forking child processes that call the EXISTING gather functions.
40
- *
41
- * Each child process requires the built dist/ module and calls the same
42
- * gather function that sequential mode uses. NO duplicated invocation logic.
43
- *
44
- * Architecture rule (CLAUDE.md #2): each tool has ONE gather function.
45
- * This module orchestrates, never reimplements.
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
- runTasksSequential(tasks, cwd, dxkitDist, tmpDir);
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
- if (verbose) {
90
- const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
91
- console.error(` [parallel] Layer 2 completed in ${elapsed}s`);
21
+ const graphify = (0, graphify_1.gatherGraphifyResult)(cwd);
22
+ if (graphify.kind === 'success') {
23
+ toolsUsed.push('graphify');
92
24
  }
93
- // Merge all results
94
- const merged = {
95
- toolsUsed: [],
96
- toolsUnavailable: [],
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":"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"}
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"}