codeslick-cli 1.1.0 → 1.1.2
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/README.md +2 -1
- package/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
- package/dist/packages/cli/src/commands/scan.js +20 -5
- package/dist/packages/cli/src/commands/scan.js.map +1 -1
- package/dist/packages/cli/src/config/config-loader.d.ts +1 -0
- package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -1
- package/dist/packages/cli/src/config/config-loader.js +6 -0
- package/dist/packages/cli/src/config/config-loader.js.map +1 -1
- package/dist/packages/cli/src/utils/telemetry.d.ts +52 -0
- package/dist/packages/cli/src/utils/telemetry.d.ts.map +1 -0
- package/dist/packages/cli/src/utils/telemetry.js +119 -0
- package/dist/packages/cli/src/utils/telemetry.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/scan.ts +23 -6
- package/src/config/config-loader.ts +8 -0
- package/src/utils/telemetry.ts +113 -0
package/README.md
CHANGED
|
@@ -528,7 +528,8 @@ MIT License - see [LICENSE](../../LICENSE) for details.
|
|
|
528
528
|
|
|
529
529
|
## Support
|
|
530
530
|
|
|
531
|
-
- **
|
|
531
|
+
- **Website**: https://codeslick.dev
|
|
532
|
+
- **GitHub**: https://github.com/VitorLourenco/codeslick2
|
|
532
533
|
- **Issues**: https://github.com/VitorLourenco/codeslick2/issues
|
|
533
534
|
- **Email**: support@codeslick.dev
|
|
534
535
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA0BH;;GAEG;AACH,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAwCD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA0M/D"}
|
|
@@ -63,6 +63,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
63
63
|
const local_scanner_1 = require("../scanner/local-scanner");
|
|
64
64
|
const cli_reporter_1 = require("../reporters/cli-reporter");
|
|
65
65
|
const config_loader_1 = require("../config/config-loader");
|
|
66
|
+
const telemetry_1 = require("../utils/telemetry");
|
|
66
67
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
67
68
|
/**
|
|
68
69
|
* Get list of staged files from git
|
|
@@ -252,12 +253,26 @@ async function scanCommand(args) {
|
|
|
252
253
|
// Check if results exceed threshold
|
|
253
254
|
const threshold = scannerConfig.severityThreshold || 'critical';
|
|
254
255
|
const shouldBlock = (0, local_scanner_1.exceedsThreshold)(results, threshold);
|
|
256
|
+
// Calculate totals for telemetry and display
|
|
257
|
+
const totalCritical = results.reduce((sum, r) => sum + r.critical, 0);
|
|
258
|
+
const totalHigh = results.reduce((sum, r) => sum + r.high, 0);
|
|
259
|
+
const totalMedium = results.reduce((sum, r) => sum + r.medium, 0);
|
|
260
|
+
const totalLow = results.reduce((sum, r) => sum + r.low, 0);
|
|
261
|
+
// Collect unique languages scanned
|
|
262
|
+
const languages = [...new Set(results.map(r => r.language))];
|
|
263
|
+
// Send telemetry (fire-and-forget, won't block exit)
|
|
264
|
+
(0, telemetry_1.trackScan)({
|
|
265
|
+
filesScanned: results.length,
|
|
266
|
+
languages,
|
|
267
|
+
vulnerabilities: {
|
|
268
|
+
critical: totalCritical,
|
|
269
|
+
high: totalHigh,
|
|
270
|
+
medium: totalMedium,
|
|
271
|
+
low: totalLow,
|
|
272
|
+
},
|
|
273
|
+
scanDuration: duration,
|
|
274
|
+
}).catch(() => { }); // Ignore telemetry errors
|
|
255
275
|
if (shouldBlock) {
|
|
256
|
-
// Calculate totals for display
|
|
257
|
-
const totalCritical = results.reduce((sum, r) => sum + r.critical, 0);
|
|
258
|
-
const totalHigh = results.reduce((sum, r) => sum + r.high, 0);
|
|
259
|
-
const totalMedium = results.reduce((sum, r) => sum + r.medium, 0);
|
|
260
|
-
const totalLow = results.reduce((sum, r) => sum + r.low, 0);
|
|
261
276
|
if (!args.json) {
|
|
262
277
|
(0, cli_reporter_1.printCommitBlocked)(threshold, totalCritical, totalHigh, totalMedium, totalLow);
|
|
263
278
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../../src/commands/scan.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAe5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoBtF;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,eAAe,EACvB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,eAAe,EAC1B,KAAK,EAAE,OAAO,EACd,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -138,6 +138,12 @@ async function updateConfig(key, value, cwd = process.cwd()) {
|
|
|
138
138
|
}
|
|
139
139
|
config.languages = value;
|
|
140
140
|
break;
|
|
141
|
+
case 'telemetry':
|
|
142
|
+
if (typeof value !== 'boolean' && value !== 'true' && value !== 'false') {
|
|
143
|
+
throw new Error(`Invalid telemetry value: ${value}. Must be true or false`);
|
|
144
|
+
}
|
|
145
|
+
config.telemetry = value === true || value === 'true';
|
|
146
|
+
break;
|
|
141
147
|
default:
|
|
142
148
|
throw new Error(`Unknown configuration key: ${key}`);
|
|
143
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../../../src/config/config-loader.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Telemetry - Anonymous Usage Tracking
|
|
3
|
+
*
|
|
4
|
+
* Sends anonymous usage statistics to CodeSlick analytics.
|
|
5
|
+
* No code, file paths, or sensitive data is ever sent.
|
|
6
|
+
*
|
|
7
|
+
* Data collected:
|
|
8
|
+
* - Scan count, file count, vulnerability counts
|
|
9
|
+
* - CLI version, languages scanned
|
|
10
|
+
* - Scan duration
|
|
11
|
+
*
|
|
12
|
+
* Users can disable telemetry with: cs config set telemetry false
|
|
13
|
+
*/
|
|
14
|
+
interface TelemetryPayload {
|
|
15
|
+
eventType: 'scan' | 'init' | 'fix';
|
|
16
|
+
filesScanned?: number;
|
|
17
|
+
languages?: string[];
|
|
18
|
+
vulnerabilities?: {
|
|
19
|
+
critical: number;
|
|
20
|
+
high: number;
|
|
21
|
+
medium: number;
|
|
22
|
+
low: number;
|
|
23
|
+
};
|
|
24
|
+
scanDuration?: number;
|
|
25
|
+
cliVersion?: string;
|
|
26
|
+
authToken?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Send telemetry data to CodeSlick analytics
|
|
30
|
+
* This is fire-and-forget - errors are silently ignored to not disrupt the CLI
|
|
31
|
+
*/
|
|
32
|
+
export declare function sendTelemetry(payload: TelemetryPayload): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Track a scan event
|
|
35
|
+
*/
|
|
36
|
+
export declare function trackScan(data: {
|
|
37
|
+
filesScanned: number;
|
|
38
|
+
languages: string[];
|
|
39
|
+
vulnerabilities: {
|
|
40
|
+
critical: number;
|
|
41
|
+
high: number;
|
|
42
|
+
medium: number;
|
|
43
|
+
low: number;
|
|
44
|
+
};
|
|
45
|
+
scanDuration: number;
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Track an init event
|
|
49
|
+
*/
|
|
50
|
+
export declare function trackInit(): Promise<void>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../../../src/utils/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C5E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAI/C"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI Telemetry - Anonymous Usage Tracking
|
|
4
|
+
*
|
|
5
|
+
* Sends anonymous usage statistics to CodeSlick analytics.
|
|
6
|
+
* No code, file paths, or sensitive data is ever sent.
|
|
7
|
+
*
|
|
8
|
+
* Data collected:
|
|
9
|
+
* - Scan count, file count, vulnerability counts
|
|
10
|
+
* - CLI version, languages scanned
|
|
11
|
+
* - Scan duration
|
|
12
|
+
*
|
|
13
|
+
* Users can disable telemetry with: cs config set telemetry false
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.sendTelemetry = sendTelemetry;
|
|
50
|
+
exports.trackScan = trackScan;
|
|
51
|
+
exports.trackInit = trackInit;
|
|
52
|
+
const config_loader_1 = require("../config/config-loader");
|
|
53
|
+
const TELEMETRY_URL = 'https://codeslick.dev/api/cli/telemetry';
|
|
54
|
+
const TIMEOUT_MS = 3000; // 3 second timeout - don't slow down the CLI
|
|
55
|
+
/**
|
|
56
|
+
* Send telemetry data to CodeSlick analytics
|
|
57
|
+
* This is fire-and-forget - errors are silently ignored to not disrupt the CLI
|
|
58
|
+
*/
|
|
59
|
+
async function sendTelemetry(payload) {
|
|
60
|
+
try {
|
|
61
|
+
// Check if telemetry is disabled
|
|
62
|
+
const config = await (0, config_loader_1.loadConfig)();
|
|
63
|
+
if (config.telemetry === false) {
|
|
64
|
+
return; // Telemetry disabled by user
|
|
65
|
+
}
|
|
66
|
+
// Get CLI version from package.json
|
|
67
|
+
const version = require('../../package.json').version;
|
|
68
|
+
// Get auth token if user is logged in
|
|
69
|
+
let authToken;
|
|
70
|
+
try {
|
|
71
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
72
|
+
const os = await Promise.resolve().then(() => __importStar(require('os')));
|
|
73
|
+
const path = await Promise.resolve().then(() => __importStar(require('path')));
|
|
74
|
+
const tokenPath = path.join(os.homedir(), '.codeslick', 'cli-token');
|
|
75
|
+
authToken = await fs.readFile(tokenPath, 'utf-8').then(t => t.trim()).catch(() => undefined);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// No auth token - that's fine, will track as anonymous
|
|
79
|
+
}
|
|
80
|
+
// Send telemetry with timeout
|
|
81
|
+
const controller = new AbortController();
|
|
82
|
+
const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
83
|
+
await fetch(TELEMETRY_URL, {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: {
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
'User-Agent': `codeslick-cli/${version}`,
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
...payload,
|
|
91
|
+
cliVersion: version,
|
|
92
|
+
authToken,
|
|
93
|
+
}),
|
|
94
|
+
signal: controller.signal,
|
|
95
|
+
});
|
|
96
|
+
clearTimeout(timeoutId);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Silently ignore telemetry errors - never disrupt the user's workflow
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Track a scan event
|
|
104
|
+
*/
|
|
105
|
+
async function trackScan(data) {
|
|
106
|
+
await sendTelemetry({
|
|
107
|
+
eventType: 'scan',
|
|
108
|
+
...data,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Track an init event
|
|
113
|
+
*/
|
|
114
|
+
async function trackInit() {
|
|
115
|
+
await sendTelemetry({
|
|
116
|
+
eventType: 'init',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../../../src/utils/telemetry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,sCA6CC;AAKD,8BAeC;AAKD,8BAIC;AAlGD,2DAAqD;AAErD,MAAM,aAAa,GAAG,yCAAyC,CAAC;AAChE,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,6CAA6C;AAiBtE;;;GAGG;AACI,KAAK,UAAU,aAAa,CAAC,OAAyB;IAC3D,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAU,GAAE,CAAC;QAClC,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,6BAA6B;QACvC,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;QAEtD,sCAAsC;QACtC,IAAI,SAA6B,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,wDAAa,aAAa,GAAC,CAAC;YACvC,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YACrE,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;QAED,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,KAAK,CAAC,aAAa,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,iBAAiB,OAAO,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,OAAO;gBACV,UAAU,EAAE,OAAO;gBACnB,SAAS;aACV,CAAC;YACF,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;IACzE,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,IAU/B;IACC,MAAM,aAAa,CAAC;QAClB,SAAS,EAAE,MAAM;QACjB,GAAG,IAAI;KACR,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS;IAC7B,MAAM,aAAa,CAAC;QAClB,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
package/src/commands/scan.ts
CHANGED
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
printBriefSummary,
|
|
37
37
|
} from '../reporters/cli-reporter';
|
|
38
38
|
import { loadConfig } from '../config/config-loader';
|
|
39
|
+
import { trackScan } from '../utils/telemetry';
|
|
39
40
|
|
|
40
41
|
const execAsync = promisify(exec);
|
|
41
42
|
|
|
@@ -260,13 +261,29 @@ export async function scanCommand(args: ScanArgs): Promise<void> {
|
|
|
260
261
|
const threshold = scannerConfig.severityThreshold || 'critical';
|
|
261
262
|
const shouldBlock = exceedsThreshold(results, threshold);
|
|
262
263
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
264
|
+
// Calculate totals for telemetry and display
|
|
265
|
+
const totalCritical = results.reduce((sum, r) => sum + r.critical, 0);
|
|
266
|
+
const totalHigh = results.reduce((sum, r) => sum + r.high, 0);
|
|
267
|
+
const totalMedium = results.reduce((sum, r) => sum + r.medium, 0);
|
|
268
|
+
const totalLow = results.reduce((sum, r) => sum + r.low, 0);
|
|
269
|
+
|
|
270
|
+
// Collect unique languages scanned
|
|
271
|
+
const languages = [...new Set(results.map(r => r.language))];
|
|
272
|
+
|
|
273
|
+
// Send telemetry (fire-and-forget, won't block exit)
|
|
274
|
+
trackScan({
|
|
275
|
+
filesScanned: results.length,
|
|
276
|
+
languages,
|
|
277
|
+
vulnerabilities: {
|
|
278
|
+
critical: totalCritical,
|
|
279
|
+
high: totalHigh,
|
|
280
|
+
medium: totalMedium,
|
|
281
|
+
low: totalLow,
|
|
282
|
+
},
|
|
283
|
+
scanDuration: duration,
|
|
284
|
+
}).catch(() => {}); // Ignore telemetry errors
|
|
269
285
|
|
|
286
|
+
if (shouldBlock) {
|
|
270
287
|
if (!args.json) {
|
|
271
288
|
printCommitBlocked(threshold, totalCritical, totalHigh, totalMedium, totalLow);
|
|
272
289
|
}
|
|
@@ -31,6 +31,7 @@ export interface CodeSlickConfig {
|
|
|
31
31
|
autofix: boolean;
|
|
32
32
|
exclude: string[];
|
|
33
33
|
languages: ('javascript' | 'typescript' | 'python' | 'java')[];
|
|
34
|
+
telemetry?: boolean; // Enable/disable anonymous usage tracking (default: true)
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
/**
|
|
@@ -167,6 +168,13 @@ export async function updateConfig(
|
|
|
167
168
|
config.languages = value as ('javascript' | 'typescript' | 'python' | 'java')[];
|
|
168
169
|
break;
|
|
169
170
|
|
|
171
|
+
case 'telemetry':
|
|
172
|
+
if (typeof value !== 'boolean' && value !== 'true' && value !== 'false') {
|
|
173
|
+
throw new Error(`Invalid telemetry value: ${value}. Must be true or false`);
|
|
174
|
+
}
|
|
175
|
+
config.telemetry = value === true || value === 'true';
|
|
176
|
+
break;
|
|
177
|
+
|
|
170
178
|
default:
|
|
171
179
|
throw new Error(`Unknown configuration key: ${key}`);
|
|
172
180
|
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Telemetry - Anonymous Usage Tracking
|
|
3
|
+
*
|
|
4
|
+
* Sends anonymous usage statistics to CodeSlick analytics.
|
|
5
|
+
* No code, file paths, or sensitive data is ever sent.
|
|
6
|
+
*
|
|
7
|
+
* Data collected:
|
|
8
|
+
* - Scan count, file count, vulnerability counts
|
|
9
|
+
* - CLI version, languages scanned
|
|
10
|
+
* - Scan duration
|
|
11
|
+
*
|
|
12
|
+
* Users can disable telemetry with: cs config set telemetry false
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { loadConfig } from '../config/config-loader';
|
|
16
|
+
|
|
17
|
+
const TELEMETRY_URL = 'https://codeslick.dev/api/cli/telemetry';
|
|
18
|
+
const TIMEOUT_MS = 3000; // 3 second timeout - don't slow down the CLI
|
|
19
|
+
|
|
20
|
+
interface TelemetryPayload {
|
|
21
|
+
eventType: 'scan' | 'init' | 'fix';
|
|
22
|
+
filesScanned?: number;
|
|
23
|
+
languages?: string[];
|
|
24
|
+
vulnerabilities?: {
|
|
25
|
+
critical: number;
|
|
26
|
+
high: number;
|
|
27
|
+
medium: number;
|
|
28
|
+
low: number;
|
|
29
|
+
};
|
|
30
|
+
scanDuration?: number;
|
|
31
|
+
cliVersion?: string;
|
|
32
|
+
authToken?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Send telemetry data to CodeSlick analytics
|
|
37
|
+
* This is fire-and-forget - errors are silently ignored to not disrupt the CLI
|
|
38
|
+
*/
|
|
39
|
+
export async function sendTelemetry(payload: TelemetryPayload): Promise<void> {
|
|
40
|
+
try {
|
|
41
|
+
// Check if telemetry is disabled
|
|
42
|
+
const config = await loadConfig();
|
|
43
|
+
if (config.telemetry === false) {
|
|
44
|
+
return; // Telemetry disabled by user
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Get CLI version from package.json
|
|
48
|
+
const version = require('../../package.json').version;
|
|
49
|
+
|
|
50
|
+
// Get auth token if user is logged in
|
|
51
|
+
let authToken: string | undefined;
|
|
52
|
+
try {
|
|
53
|
+
const fs = await import('fs/promises');
|
|
54
|
+
const os = await import('os');
|
|
55
|
+
const path = await import('path');
|
|
56
|
+
const tokenPath = path.join(os.homedir(), '.codeslick', 'cli-token');
|
|
57
|
+
authToken = await fs.readFile(tokenPath, 'utf-8').then(t => t.trim()).catch(() => undefined);
|
|
58
|
+
} catch {
|
|
59
|
+
// No auth token - that's fine, will track as anonymous
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Send telemetry with timeout
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
65
|
+
|
|
66
|
+
await fetch(TELEMETRY_URL, {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers: {
|
|
69
|
+
'Content-Type': 'application/json',
|
|
70
|
+
'User-Agent': `codeslick-cli/${version}`,
|
|
71
|
+
},
|
|
72
|
+
body: JSON.stringify({
|
|
73
|
+
...payload,
|
|
74
|
+
cliVersion: version,
|
|
75
|
+
authToken,
|
|
76
|
+
}),
|
|
77
|
+
signal: controller.signal,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
clearTimeout(timeoutId);
|
|
81
|
+
} catch {
|
|
82
|
+
// Silently ignore telemetry errors - never disrupt the user's workflow
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Track a scan event
|
|
88
|
+
*/
|
|
89
|
+
export async function trackScan(data: {
|
|
90
|
+
filesScanned: number;
|
|
91
|
+
languages: string[];
|
|
92
|
+
vulnerabilities: {
|
|
93
|
+
critical: number;
|
|
94
|
+
high: number;
|
|
95
|
+
medium: number;
|
|
96
|
+
low: number;
|
|
97
|
+
};
|
|
98
|
+
scanDuration: number;
|
|
99
|
+
}): Promise<void> {
|
|
100
|
+
await sendTelemetry({
|
|
101
|
+
eventType: 'scan',
|
|
102
|
+
...data,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Track an init event
|
|
108
|
+
*/
|
|
109
|
+
export async function trackInit(): Promise<void> {
|
|
110
|
+
await sendTelemetry({
|
|
111
|
+
eventType: 'init',
|
|
112
|
+
});
|
|
113
|
+
}
|