cognium-ai 1.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/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cognium-ai CLI - AI-powered static analysis with LLM-enhanced vulnerability detection
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,528 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cognium-ai CLI - AI-powered static analysis with LLM-enhanced vulnerability detection
4
+ */
5
+ import { readFileSync, writeFileSync, existsSync, statSync, readdirSync } from 'fs';
6
+ import { join, extname, resolve, dirname } from 'path';
7
+ import { createRequire } from 'module';
8
+ import { initAnalyzer, analyze, detectDeadCode, formatDeadCodeReport, scanForSecrets, formatSecretReport, calculateHealthScore, formatHealthReport, analyzeSkillBundle, } from 'circle-ir-ai';
9
+ import { formatResults, formatJSON, formatSARIF } from './formatters.js';
10
+ import { version } from './version.js';
11
+ import { parseArgs, showHelp, showVersion } from './utils/args.js';
12
+ import { spinner } from './utils/spinner.js';
13
+ import { colors } from './utils/colors.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Constants
16
+ // ---------------------------------------------------------------------------
17
+ const TEST_PATTERNS = [
18
+ /[/\\]test[/\\]/i,
19
+ /[/\\]tests[/\\]/i,
20
+ /[/\\]__tests__[/\\]/i,
21
+ /[/\\]spec[/\\]/i,
22
+ /[/\\]__mocks__[/\\]/i,
23
+ /\.test\.[jt]sx?$/i,
24
+ /\.spec\.[jt]sx?$/i,
25
+ /Test\.java$/,
26
+ /Tests\.java$/,
27
+ /IT\.java$/,
28
+ /_test\.py$/,
29
+ /_tests\.py$/,
30
+ /test_.*\.py$/,
31
+ /_test\.rs$/,
32
+ ];
33
+ const LANG_MAP = {
34
+ '.java': 'java',
35
+ '.js': 'javascript',
36
+ '.mjs': 'javascript',
37
+ '.ts': 'typescript',
38
+ '.tsx': 'typescript',
39
+ '.py': 'python',
40
+ '.rs': 'rust',
41
+ '.sh': 'bash',
42
+ '.bash': 'bash',
43
+ };
44
+ const SINK_SEVERITY = {
45
+ sql_injection: 'critical',
46
+ nosql_injection: 'high',
47
+ command_injection: 'critical',
48
+ path_traversal: 'high',
49
+ xss: 'high',
50
+ xxe: 'critical',
51
+ deserialization: 'critical',
52
+ ldap_injection: 'high',
53
+ xpath_injection: 'high',
54
+ ssrf: 'high',
55
+ open_redirect: 'medium',
56
+ code_injection: 'critical',
57
+ log_injection: 'medium',
58
+ weak_random: 'low',
59
+ weak_hash: 'low',
60
+ weak_crypto: 'low',
61
+ insecure_cookie: 'low',
62
+ trust_boundary: 'medium',
63
+ external_taint_escape: 'medium',
64
+ };
65
+ const SINK_CWE = {
66
+ sql_injection: 'CWE-89',
67
+ nosql_injection: 'CWE-943',
68
+ command_injection: 'CWE-78',
69
+ path_traversal: 'CWE-22',
70
+ xss: 'CWE-79',
71
+ xxe: 'CWE-611',
72
+ deserialization: 'CWE-502',
73
+ ldap_injection: 'CWE-90',
74
+ xpath_injection: 'CWE-643',
75
+ ssrf: 'CWE-918',
76
+ open_redirect: 'CWE-601',
77
+ code_injection: 'CWE-94',
78
+ log_injection: 'CWE-117',
79
+ weak_random: 'CWE-330',
80
+ weak_hash: 'CWE-327',
81
+ weak_crypto: 'CWE-327',
82
+ insecure_cookie: 'CWE-614',
83
+ trust_boundary: 'CWE-501',
84
+ external_taint_escape: 'CWE-20',
85
+ };
86
+ // ---------------------------------------------------------------------------
87
+ // Helpers
88
+ // ---------------------------------------------------------------------------
89
+ function isTestFile(filePath) {
90
+ return TEST_PATTERNS.some((pattern) => pattern.test(filePath));
91
+ }
92
+ function detectLanguage(filePath) {
93
+ const ext = extname(filePath).toLowerCase();
94
+ return LANG_MAP[ext] || null;
95
+ }
96
+ function collectFiles(targetPath, language, excludeTests = false) {
97
+ const files = [];
98
+ const stat = statSync(targetPath);
99
+ if (stat.isFile()) {
100
+ if (excludeTests && isTestFile(targetPath))
101
+ return files;
102
+ const lang = language || detectLanguage(targetPath);
103
+ if (lang)
104
+ files.push(targetPath);
105
+ }
106
+ else if (stat.isDirectory()) {
107
+ const entries = readdirSync(targetPath, { withFileTypes: true });
108
+ for (const entry of entries) {
109
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
110
+ continue;
111
+ if (excludeTests && /^(test|tests|__tests__|spec|__mocks__)$/i.test(entry.name))
112
+ continue;
113
+ const fullPath = join(targetPath, entry.name);
114
+ files.push(...collectFiles(fullPath, language, excludeTests));
115
+ }
116
+ }
117
+ return files;
118
+ }
119
+ /**
120
+ * Resolve WASM paths for circle-ir initialization.
121
+ */
122
+ function resolveWasmPaths() {
123
+ const require = createRequire(import.meta.url);
124
+ // Resolve circle-ir through circle-ir-ai so we use the same instance
125
+ const circleIrAiDir = dirname(require.resolve('circle-ir-ai'));
126
+ const innerRequire = createRequire(join(circleIrAiDir, 'index.js'));
127
+ const wasmDir = join(dirname(innerRequire.resolve('circle-ir')), 'wasm');
128
+ const jsWasm = join(wasmDir, 'tree-sitter-javascript.wasm');
129
+ return {
130
+ wasmPath: join(wasmDir, 'web-tree-sitter.wasm'),
131
+ languagePaths: {
132
+ bash: join(wasmDir, 'tree-sitter-bash.wasm'),
133
+ java: join(wasmDir, 'tree-sitter-java.wasm'),
134
+ javascript: jsWasm,
135
+ typescript: jsWasm, // TypeScript uses the JavaScript grammar
136
+ python: join(wasmDir, 'tree-sitter-python.wasm'),
137
+ rust: join(wasmDir, 'tree-sitter-rust.wasm'),
138
+ },
139
+ };
140
+ }
141
+ /**
142
+ * Validate that a path argument exists and resolve to absolute.
143
+ */
144
+ function resolveTarget(targetPath) {
145
+ const absPath = resolve(targetPath);
146
+ if (!existsSync(absPath)) {
147
+ console.error(colors.red(`Error: path not found: ${absPath}`));
148
+ process.exit(2);
149
+ }
150
+ return absPath;
151
+ }
152
+ /**
153
+ * Write output to file or stdout.
154
+ */
155
+ function writeOutput(output, outputPath) {
156
+ if (outputPath) {
157
+ writeFileSync(outputPath, output);
158
+ console.log(colors.green(`Results written to ${outputPath}`));
159
+ }
160
+ else if (output.trim()) {
161
+ console.log(output);
162
+ }
163
+ }
164
+ // ---------------------------------------------------------------------------
165
+ // Scan command
166
+ // ---------------------------------------------------------------------------
167
+ async function scanFile(filePath, language) {
168
+ try {
169
+ const code = readFileSync(filePath, 'utf-8');
170
+ const result = await analyze(code, filePath, language);
171
+ const vulnerabilities = (result.taint.flows || []).map((flow) => ({
172
+ type: flow.sink_type,
173
+ severity: SINK_SEVERITY[flow.sink_type] ?? 'high',
174
+ message: `${flow.sink_type} vulnerability: tainted data flows from line ${flow.source_line} to line ${flow.sink_line}`,
175
+ line: flow.sink_line,
176
+ cwe: SINK_CWE[flow.sink_type],
177
+ }));
178
+ return { file: filePath, vulnerabilities };
179
+ }
180
+ catch (error) {
181
+ return {
182
+ file: filePath,
183
+ vulnerabilities: [],
184
+ error: error instanceof Error ? error.message : 'Unknown error',
185
+ };
186
+ }
187
+ }
188
+ async function runScan(targetPath, options) {
189
+ const spin = options.quiet ? null : spinner('Initializing analyzer...').start();
190
+ try {
191
+ // Initialize circle-ir
192
+ const wasm = resolveWasmPaths();
193
+ await initAnalyzer({ wasmPath: wasm.wasmPath, languagePaths: wasm.languagePaths });
194
+ if (spin)
195
+ spin.text = 'Collecting files...';
196
+ const absPath = resolveTarget(targetPath);
197
+ const files = collectFiles(absPath, options.language, options.excludeTests);
198
+ if (files.length === 0) {
199
+ if (spin)
200
+ spin.warn('No supported files found');
201
+ return;
202
+ }
203
+ let mode = 'static';
204
+ if (!options.noLlm) {
205
+ const model = process.env.LLM_ENRICHMENT_MODEL || 'cognium/gpt-oss-120b';
206
+ mode = options.llmDiscovery ? `LLM discovery · ${model}` : `LLM-enhanced · ${model}`;
207
+ }
208
+ if (spin)
209
+ spin.text = `Scanning ${files.length} file(s) [${mode}]...`;
210
+ const results = [];
211
+ let processed = 0;
212
+ // Process files with concurrency
213
+ const concurrency = options.threads;
214
+ for (let i = 0; i < files.length; i += concurrency) {
215
+ const batch = files.slice(i, i + concurrency);
216
+ const batchResults = await Promise.all(batch.map(async (file) => {
217
+ const lang = options.language || detectLanguage(file);
218
+ if (!lang)
219
+ return null;
220
+ return scanFile(file, lang);
221
+ }));
222
+ for (const result of batchResults) {
223
+ if (result)
224
+ results.push(result);
225
+ }
226
+ processed += batch.length;
227
+ if (spin)
228
+ spin.text = `Scanning... (${processed}/${files.length}) [${mode}]`;
229
+ }
230
+ if (spin)
231
+ spin.succeed(`Scanned ${files.length} file(s) [${mode}]`);
232
+ // Filter by severity
233
+ const severityOrder = ['low', 'medium', 'high', 'critical'];
234
+ if (options.severity) {
235
+ if (options.severity.includes(',')) {
236
+ const allowedSeverities = options.severity.split(',').map((s) => s.trim().toLowerCase());
237
+ for (const result of results) {
238
+ result.vulnerabilities = result.vulnerabilities.filter((v) => allowedSeverities.includes(v.severity.toLowerCase()));
239
+ }
240
+ }
241
+ else {
242
+ const minSeverityIndex = severityOrder.indexOf(options.severity.toLowerCase());
243
+ if (minSeverityIndex === -1) {
244
+ throw new Error(`Invalid severity level: ${options.severity}. Must be one of: low, medium, high, critical`);
245
+ }
246
+ for (const result of results) {
247
+ result.vulnerabilities = result.vulnerabilities.filter((v) => severityOrder.indexOf(v.severity) >= minSeverityIndex);
248
+ }
249
+ }
250
+ }
251
+ // Filter by excluded CWEs
252
+ if (options.excludeCwe) {
253
+ const excludedCwes = options.excludeCwe.split(',').map((c) => c.trim().toUpperCase());
254
+ for (const result of results) {
255
+ result.vulnerabilities = result.vulnerabilities.filter((v) => {
256
+ if (!v.cwe)
257
+ return true;
258
+ return !excludedCwes.includes(v.cwe.toUpperCase());
259
+ });
260
+ }
261
+ }
262
+ // Output
263
+ const totalVulns = results.reduce((sum, r) => sum + r.vulnerabilities.length, 0);
264
+ const errors = results.filter((r) => r.error).length;
265
+ const shouldOutput = totalVulns > 0 || errors > 0 || options.verbose || options.output || options.format !== 'text';
266
+ if (shouldOutput) {
267
+ let output;
268
+ switch (options.format) {
269
+ case 'json':
270
+ output = formatJSON(results);
271
+ break;
272
+ case 'sarif':
273
+ output = formatSARIF(results);
274
+ break;
275
+ default:
276
+ output = formatResults(results, options.verbose);
277
+ }
278
+ writeOutput(output, options.output);
279
+ if (!options.quiet && options.format === 'text') {
280
+ console.log();
281
+ if (totalVulns > 0) {
282
+ console.log(colors.red(`Found ${totalVulns} vulnerability(ies) in ${files.length} file(s)`));
283
+ }
284
+ else if (options.verbose) {
285
+ console.log(colors.green(`No vulnerabilities found in ${files.length} file(s)`));
286
+ }
287
+ if (errors > 0) {
288
+ console.log(colors.yellow(`${errors} file(s) had errors during analysis`));
289
+ }
290
+ }
291
+ }
292
+ process.exit(totalVulns > 0 ? 1 : 0);
293
+ }
294
+ catch (error) {
295
+ if (spin)
296
+ spin.fail('Analysis failed');
297
+ console.error(colors.red(error instanceof Error ? error.message : 'Unknown error'));
298
+ process.exit(2);
299
+ }
300
+ }
301
+ // ---------------------------------------------------------------------------
302
+ // Subcommands: dead-code, secrets, health, skill
303
+ // ---------------------------------------------------------------------------
304
+ async function runDeadCode(targetPath, options) {
305
+ const spin = options.quiet ? null : spinner('Initializing analyzer...').start();
306
+ try {
307
+ const wasm = resolveWasmPaths();
308
+ await initAnalyzer({ wasmPath: wasm.wasmPath, languagePaths: wasm.languagePaths });
309
+ const absPath = resolveTarget(targetPath);
310
+ if (spin)
311
+ spin.text = 'Detecting dead code...';
312
+ const result = await detectDeadCode({ target: absPath });
313
+ if (spin)
314
+ spin.succeed(`Dead code analysis complete (${result.summary.totalMethods} methods analyzed)`);
315
+ let output;
316
+ if (options.format === 'json') {
317
+ output = JSON.stringify(result, null, 2);
318
+ }
319
+ else {
320
+ output = formatDeadCodeReport(result);
321
+ }
322
+ writeOutput(output, options.output);
323
+ process.exit(result.summary.deadMethods > 0 ? 1 : 0);
324
+ }
325
+ catch (error) {
326
+ if (spin)
327
+ spin.fail('Dead code detection failed');
328
+ console.error(colors.red(error instanceof Error ? error.message : 'Unknown error'));
329
+ process.exit(2);
330
+ }
331
+ }
332
+ async function runSecrets(targetPath, options) {
333
+ const spin = options.quiet ? null : spinner('Scanning for secrets...').start();
334
+ try {
335
+ const absPath = resolveTarget(targetPath);
336
+ const result = await scanForSecrets(absPath);
337
+ if (spin)
338
+ spin.succeed(`Secret scan complete (${result.filesScanned} files scanned)`);
339
+ let output;
340
+ if (options.format === 'json') {
341
+ output = JSON.stringify(result, null, 2);
342
+ }
343
+ else {
344
+ output = formatSecretReport(result);
345
+ }
346
+ writeOutput(output, options.output);
347
+ process.exit(result.secrets.length > 0 ? 1 : 0);
348
+ }
349
+ catch (error) {
350
+ if (spin)
351
+ spin.fail('Secret scanning failed');
352
+ console.error(colors.red(error instanceof Error ? error.message : 'Unknown error'));
353
+ process.exit(2);
354
+ }
355
+ }
356
+ async function runHealth(targetPath, options) {
357
+ const spin = options.quiet ? null : spinner('Initializing analyzer...').start();
358
+ try {
359
+ const wasm = resolveWasmPaths();
360
+ await initAnalyzer({ wasmPath: wasm.wasmPath, languagePaths: wasm.languagePaths });
361
+ const absPath = resolveTarget(targetPath);
362
+ if (spin)
363
+ spin.text = 'Calculating health score...';
364
+ const result = await calculateHealthScore(absPath);
365
+ if (spin)
366
+ spin.succeed(`Health analysis complete (score: ${result.overallScore.toFixed(0)}/100)`);
367
+ let output;
368
+ if (options.format === 'json') {
369
+ output = JSON.stringify(result, null, 2);
370
+ }
371
+ else {
372
+ output = formatHealthReport(result);
373
+ }
374
+ writeOutput(output, options.output);
375
+ }
376
+ catch (error) {
377
+ if (spin)
378
+ spin.fail('Health score calculation failed');
379
+ console.error(colors.red(error instanceof Error ? error.message : 'Unknown error'));
380
+ process.exit(2);
381
+ }
382
+ }
383
+ async function runSkill(targetPath, options) {
384
+ const spin = options.quiet ? null : spinner('Initializing analyzer...').start();
385
+ try {
386
+ const wasm = resolveWasmPaths();
387
+ await initAnalyzer({ wasmPath: wasm.wasmPath, languagePaths: wasm.languagePaths });
388
+ const absPath = resolveTarget(targetPath);
389
+ if (spin)
390
+ spin.text = 'Analyzing skill bundle...';
391
+ const result = await analyzeSkillBundle(absPath, {
392
+ enableCrossArtifact: true,
393
+ enableVerification: true,
394
+ });
395
+ if (spin)
396
+ spin.succeed(`Skill analysis complete (trust score: ${result.score}/100)`);
397
+ const output = JSON.stringify(result, null, 2);
398
+ writeOutput(output, options.output);
399
+ // Exit 1 if findings with high/critical severity
400
+ const hasHighFindings = result.findings.some((f) => f.severity === 'high' || f.severity === 'critical');
401
+ process.exit(hasHighFindings ? 1 : 0);
402
+ }
403
+ catch (error) {
404
+ if (spin)
405
+ spin.fail('Skill analysis failed');
406
+ console.error(colors.red(error instanceof Error ? error.message : 'Unknown error'));
407
+ process.exit(2);
408
+ }
409
+ }
410
+ // ---------------------------------------------------------------------------
411
+ // Init command
412
+ // ---------------------------------------------------------------------------
413
+ function handleInit() {
414
+ const configPath = 'cognium-ai.config.json';
415
+ if (existsSync(configPath)) {
416
+ console.log(colors.yellow('Configuration file already exists'));
417
+ return;
418
+ }
419
+ const config = {
420
+ include: ['src/**/*.java', 'src/**/*.ts', 'src/**/*.py'],
421
+ exclude: ['**/test/**', '**/node_modules/**', '**/dist/**'],
422
+ severity: 'medium',
423
+ llm: {
424
+ enabled: true,
425
+ discovery: false,
426
+ },
427
+ rules: {
428
+ 'sql-injection': 'error',
429
+ 'command-injection': 'error',
430
+ 'xss': 'error',
431
+ 'path-traversal': 'error',
432
+ 'ssrf': 'warn',
433
+ 'deserialization': 'warn',
434
+ },
435
+ };
436
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
437
+ console.log(colors.green(`Created ${configPath}`));
438
+ }
439
+ // ---------------------------------------------------------------------------
440
+ // Main
441
+ // ---------------------------------------------------------------------------
442
+ async function main() {
443
+ const { command, args, options } = parseArgs(process.argv.slice(2));
444
+ if (options.help || options.h) {
445
+ showHelp();
446
+ return;
447
+ }
448
+ if (command === 'version' || options.version || options.V) {
449
+ showVersion(version);
450
+ return;
451
+ }
452
+ if (command === 'init') {
453
+ handleInit();
454
+ return;
455
+ }
456
+ // Commands that require a path argument
457
+ const subOptions = {
458
+ format: (options.format || options.f || 'text'),
459
+ output: (options.output || options.o),
460
+ quiet: options.quiet === true || options.q === true,
461
+ };
462
+ if (command === 'scan') {
463
+ if (args.length === 0) {
464
+ console.error(colors.red('Error: scan command requires a path argument'));
465
+ console.log('\nUsage: cognium-ai scan <path> [options]');
466
+ process.exit(1);
467
+ }
468
+ await runScan(args[0], {
469
+ language: (options.language || options.l),
470
+ format: subOptions.format,
471
+ threads: parseInt(options.threads || '4', 10),
472
+ severity: options.severity,
473
+ output: subOptions.output,
474
+ quiet: subOptions.quiet,
475
+ verbose: options.verbose === true || options.v === true,
476
+ excludeTests: options['exclude-tests'] === true,
477
+ excludeCwe: options['exclude-cwe'],
478
+ noLlm: options['no-llm'] === true,
479
+ llmDiscovery: options['llm-discovery'] === true,
480
+ });
481
+ return;
482
+ }
483
+ if (command === 'dead-code') {
484
+ if (args.length === 0) {
485
+ console.error(colors.red('Error: dead-code command requires a path argument'));
486
+ process.exit(1);
487
+ }
488
+ await runDeadCode(args[0], subOptions);
489
+ return;
490
+ }
491
+ if (command === 'secrets') {
492
+ if (args.length === 0) {
493
+ console.error(colors.red('Error: secrets command requires a path argument'));
494
+ process.exit(1);
495
+ }
496
+ await runSecrets(args[0], subOptions);
497
+ return;
498
+ }
499
+ if (command === 'health') {
500
+ if (args.length === 0) {
501
+ console.error(colors.red('Error: health command requires a path argument'));
502
+ process.exit(1);
503
+ }
504
+ await runHealth(args[0], subOptions);
505
+ return;
506
+ }
507
+ if (command === 'skill') {
508
+ if (args.length === 0) {
509
+ console.error(colors.red('Error: skill command requires a path argument'));
510
+ process.exit(1);
511
+ }
512
+ await runSkill(args[0], { output: subOptions.output, quiet: subOptions.quiet });
513
+ return;
514
+ }
515
+ if (!command) {
516
+ showHelp();
517
+ }
518
+ else {
519
+ console.error(colors.red(`Error: Unknown command '${command}'`));
520
+ console.log("\nRun 'cognium-ai --help' for usage information");
521
+ process.exit(1);
522
+ }
523
+ }
524
+ main().catch((error) => {
525
+ console.error(colors.red('Fatal error:'), error.message);
526
+ process.exit(2);
527
+ });
528
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Output formatters for CLI results
3
+ */
4
+ interface Vulnerability {
5
+ type: string;
6
+ severity: string;
7
+ message: string;
8
+ line: number;
9
+ cwe?: string;
10
+ }
11
+ interface ScanResult {
12
+ file: string;
13
+ vulnerabilities: Vulnerability[];
14
+ error?: string;
15
+ }
16
+ export declare function formatResults(results: ScanResult[], verbose?: boolean): string;
17
+ export declare function formatJSON(results: ScanResult[]): string;
18
+ export declare function formatSARIF(results: ScanResult[]): string;
19
+ export {};
20
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+FD,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAyC9E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAkBxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA8DzD"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Output formatters for CLI results
3
+ */
4
+ import { colors } from './utils/colors.js';
5
+ const VULNERABILITY_HELP = {
6
+ sql_injection: {
7
+ description: 'User input is used in SQL query without sanitization',
8
+ fix: 'Use PreparedStatement with parameterized queries instead of string concatenation',
9
+ },
10
+ nosql_injection: {
11
+ description: 'User input is used in NoSQL query without sanitization',
12
+ fix: 'Use parameterized queries or properly escape user input before using in queries',
13
+ },
14
+ command_injection: {
15
+ description: 'User input is used in system command without sanitization',
16
+ fix: 'Avoid Runtime.exec() with user input. Use ProcessBuilder with argument arrays instead',
17
+ },
18
+ path_traversal: {
19
+ description: 'User input is used in file path without validation',
20
+ fix: 'Validate file paths against allowlist, use canonical paths, and check for ".." sequences',
21
+ },
22
+ xss: {
23
+ description: 'User input is rendered in HTML without proper encoding',
24
+ fix: 'Use HTML encoding/escaping functions before rendering user input in web pages',
25
+ },
26
+ xxe: {
27
+ description: 'XML parser may process external entities from untrusted input',
28
+ fix: 'Disable external entity processing in XML parsers',
29
+ },
30
+ deserialization: {
31
+ description: 'Untrusted data is deserialized which can lead to remote code execution',
32
+ fix: 'Avoid deserializing untrusted data. Use safe formats like JSON instead of Java serialization',
33
+ },
34
+ ldap_injection: {
35
+ description: 'User input is used in LDAP query without sanitization',
36
+ fix: 'Escape LDAP special characters or use parameterized LDAP queries',
37
+ },
38
+ xpath_injection: {
39
+ description: 'User input is used in XPath query without sanitization',
40
+ fix: 'Use parameterized XPath queries or properly escape user input',
41
+ },
42
+ ssrf: {
43
+ description: 'Server-Side Request Forgery: user controls URL in server-side request',
44
+ fix: 'Validate URLs against allowlist of domains, block internal IPs',
45
+ },
46
+ open_redirect: {
47
+ description: 'User input controls redirect destination which can be abused for phishing',
48
+ fix: 'Validate redirect URLs against allowlist or use relative paths only',
49
+ },
50
+ code_injection: {
51
+ description: 'User input is evaluated as code (eval, script execution, etc.)',
52
+ fix: 'Never execute user input as code. Use safe alternatives like JSON parsing',
53
+ },
54
+ log_injection: {
55
+ description: 'User input in logs can inject fake log entries or exploit log viewers',
56
+ fix: 'Sanitize newlines and special characters from user input before logging',
57
+ },
58
+ weak_random: {
59
+ description: 'Cryptographically weak random number generator used for security purposes',
60
+ fix: 'Use SecureRandom instead of Random for security-sensitive operations',
61
+ },
62
+ weak_hash: {
63
+ description: 'Weak hashing algorithm (MD5, SHA1) used for security purposes',
64
+ fix: 'Use SHA-256 or stronger hashing algorithms',
65
+ },
66
+ weak_crypto: {
67
+ description: 'Weak cryptographic algorithm or configuration',
68
+ fix: 'Use strong encryption algorithms (AES-256) and secure configurations',
69
+ },
70
+ insecure_cookie: {
71
+ description: 'Cookie without Secure or HttpOnly flags exposes it to attacks',
72
+ fix: 'Set Secure and HttpOnly flags on sensitive cookies',
73
+ },
74
+ trust_boundary: {
75
+ description: 'Data crosses trust boundary without validation',
76
+ fix: 'Validate and sanitize data when crossing trust boundaries',
77
+ },
78
+ external_taint_escape: {
79
+ description: 'External input reaches a sensitive sink without proper validation',
80
+ fix: 'Validate, sanitize, or escape external input before use in sensitive operations',
81
+ },
82
+ };
83
+ const SEVERITY_COLORS = {
84
+ critical: colors.red,
85
+ high: colors.red,
86
+ medium: colors.yellow,
87
+ low: colors.cyan,
88
+ };
89
+ const SEVERITY_ICONS = {
90
+ critical: '!!!',
91
+ high: '!!',
92
+ medium: '!',
93
+ low: 'i',
94
+ };
95
+ export function formatResults(results, verbose) {
96
+ const lines = [];
97
+ for (const result of results) {
98
+ if (result.error) {
99
+ lines.push(colors.red(`[ERROR] ${result.file}: ${result.error}`));
100
+ continue;
101
+ }
102
+ if (result.vulnerabilities.length === 0) {
103
+ if (verbose) {
104
+ lines.push(colors.green(`[OK] ${result.file}`));
105
+ }
106
+ continue;
107
+ }
108
+ lines.push(colors.bold(result.file));
109
+ for (const vuln of result.vulnerabilities) {
110
+ const colorFn = SEVERITY_COLORS[vuln.severity] || ((text) => text);
111
+ const icon = SEVERITY_ICONS[vuln.severity] || '?';
112
+ const cweTag = vuln.cwe ? ` [${vuln.cwe}]` : '';
113
+ const severityUpper = vuln.severity.charAt(0).toUpperCase() + vuln.severity.slice(1);
114
+ lines.push(` ${colorFn(`[${icon}]`)} ${colorFn(vuln.type)} (${severityUpper})${cweTag}`);
115
+ lines.push(` Line ${vuln.line}: ${vuln.message}`);
116
+ const help = VULNERABILITY_HELP[vuln.type];
117
+ if (help) {
118
+ lines.push(` ${help.description}`);
119
+ lines.push(colors.cyan(` -> Fix: ${help.fix}`));
120
+ }
121
+ }
122
+ lines.push('');
123
+ }
124
+ return lines.join('\n');
125
+ }
126
+ export function formatJSON(results) {
127
+ const output = {
128
+ version: '1.0.0',
129
+ timestamp: new Date().toISOString(),
130
+ results: results.map((r) => ({
131
+ file: r.file,
132
+ vulnerabilities: r.vulnerabilities,
133
+ error: r.error,
134
+ })),
135
+ summary: {
136
+ filesScanned: results.length,
137
+ filesWithVulnerabilities: results.filter((r) => r.vulnerabilities.length > 0).length,
138
+ totalVulnerabilities: results.reduce((sum, r) => sum + r.vulnerabilities.length, 0),
139
+ errors: results.filter((r) => r.error).length,
140
+ },
141
+ };
142
+ return JSON.stringify(output, null, 2);
143
+ }
144
+ export function formatSARIF(results) {
145
+ const ruleSet = new Map();
146
+ const sarifResults = [];
147
+ for (const result of results) {
148
+ for (const vuln of result.vulnerabilities) {
149
+ if (!ruleSet.has(vuln.type)) {
150
+ ruleSet.set(vuln.type, {
151
+ id: vuln.type.replace(/\s+/g, '-').toLowerCase(),
152
+ name: vuln.type,
153
+ shortDescription: { text: vuln.type },
154
+ defaultConfiguration: {
155
+ level: vuln.severity === 'critical' || vuln.severity === 'high' ? 'error' : 'warning',
156
+ },
157
+ properties: {
158
+ 'security-severity': vuln.severity === 'critical' ? '9.0' :
159
+ vuln.severity === 'high' ? '7.0' :
160
+ vuln.severity === 'medium' ? '5.0' : '3.0',
161
+ },
162
+ });
163
+ }
164
+ sarifResults.push({
165
+ ruleId: vuln.type.replace(/\s+/g, '-').toLowerCase(),
166
+ level: vuln.severity === 'critical' || vuln.severity === 'high' ? 'error' : 'warning',
167
+ message: { text: vuln.message },
168
+ locations: [
169
+ {
170
+ physicalLocation: {
171
+ artifactLocation: { uri: result.file },
172
+ region: { startLine: vuln.line },
173
+ },
174
+ },
175
+ ],
176
+ properties: {
177
+ cwe: vuln.cwe,
178
+ severity: vuln.severity,
179
+ },
180
+ });
181
+ }
182
+ }
183
+ const sarif = {
184
+ $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',
185
+ version: '2.1.0',
186
+ runs: [
187
+ {
188
+ tool: {
189
+ driver: {
190
+ name: 'cognium-ai',
191
+ version: '1.0.0',
192
+ informationUri: 'https://cognium.dev',
193
+ rules: Array.from(ruleSet.values()),
194
+ },
195
+ },
196
+ results: sarifResults,
197
+ },
198
+ ],
199
+ };
200
+ return JSON.stringify(sarif, null, 2);
201
+ }
202
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * cognium-ai - AI-powered static analysis
3
+ *
4
+ * Re-exports circle-ir-ai APIs for programmatic use.
5
+ * For CLI usage, run `cognium-ai` directly.
6
+ */
7
+ export { version } from './version.js';
8
+ export { analyzeFile, scanDirectory, detectDeadCode, scanForSecrets, calculateHealthScore, analyzeSkillBundle, initAnalyzer, analyze, } from 'circle-ir-ai';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,OAAO,GACR,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * cognium-ai - AI-powered static analysis
3
+ *
4
+ * Re-exports circle-ir-ai APIs for programmatic use.
5
+ * For CLI usage, run `cognium-ai` directly.
6
+ */
7
+ export { version } from './version.js';
8
+ // Re-export key circle-ir-ai APIs
9
+ export { analyzeFile, scanDirectory, detectDeadCode, scanForSecrets, calculateHealthScore, analyzeSkillBundle, initAnalyzer, analyze, } from 'circle-ir-ai';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,kCAAkC;AAClC,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,OAAO,GACR,MAAM,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lightweight argument parser
3
+ */
4
+ export interface ParsedArgs {
5
+ command?: string;
6
+ args: string[];
7
+ options: Record<string, string | boolean>;
8
+ }
9
+ export declare function parseArgs(argv: string[]): ParsedArgs;
10
+ export declare function showHelp(): void;
11
+ export declare function showVersion(version: string): void;
12
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/utils/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyCpD;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAuD/B;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Lightweight argument parser
3
+ */
4
+ export function parseArgs(argv) {
5
+ const args = [];
6
+ const options = {};
7
+ let command;
8
+ for (let i = 0; i < argv.length; i++) {
9
+ const arg = argv[i];
10
+ if (arg.startsWith('--')) {
11
+ const key = arg.slice(2);
12
+ if (key.includes('=')) {
13
+ const [k, v] = key.split('=', 2);
14
+ options[k] = v;
15
+ }
16
+ else {
17
+ const nextArg = argv[i + 1];
18
+ if (nextArg && !nextArg.startsWith('-')) {
19
+ options[key] = nextArg;
20
+ i++;
21
+ }
22
+ else {
23
+ options[key] = true;
24
+ }
25
+ }
26
+ }
27
+ else if (arg.startsWith('-') && arg.length === 2) {
28
+ const key = arg.slice(1);
29
+ const nextArg = argv[i + 1];
30
+ if (nextArg && !nextArg.startsWith('-')) {
31
+ options[key] = nextArg;
32
+ i++;
33
+ }
34
+ else {
35
+ options[key] = true;
36
+ }
37
+ }
38
+ else {
39
+ if (!command) {
40
+ command = arg;
41
+ }
42
+ else {
43
+ args.push(arg);
44
+ }
45
+ }
46
+ }
47
+ return { command, args, options };
48
+ }
49
+ export function showHelp() {
50
+ console.log(`
51
+ cognium-ai - AI-powered static analysis with LLM-enhanced vulnerability detection
52
+
53
+ USAGE:
54
+ cognium-ai <command> [options]
55
+
56
+ COMMANDS:
57
+ scan <path> Scan for security vulnerabilities (LLM-enhanced by default)
58
+ dead-code <path> Detect dead/unreachable code
59
+ secrets <path> Scan for secrets and credentials
60
+ health <path> Calculate codebase health score
61
+ skill <path> Analyze AI skill bundle security
62
+ init Initialize a configuration file
63
+ version Display version information
64
+
65
+ SCAN OPTIONS:
66
+ -l, --language <lang> Force language (bash|java|javascript|typescript|python|rust)
67
+ -f, --format <format> Output format (text|json|sarif) [default: text]
68
+ --threads <n> Parallel analysis threads [default: 4]
69
+ --severity <level> Filter by severity (low|medium|high|critical)
70
+ --exclude-tests Exclude test files and directories
71
+ --exclude-cwe <cwes> Exclude specific CWEs (comma-separated)
72
+ -o, --output <file> Write results to file
73
+ -q, --quiet Suppress progress output
74
+ -v, --verbose Show detailed output
75
+ --no-llm Static SAST only (no LLM enrichment)
76
+ --llm-discovery Enable LLM discovery mode (deeper analysis)
77
+
78
+ DEAD-CODE / SECRETS / HEALTH OPTIONS:
79
+ -f, --format <format> Output format (text|json) [default: text]
80
+ -o, --output <file> Write results to file
81
+ -q, --quiet Suppress progress output
82
+
83
+ SKILL OPTIONS:
84
+ -o, --output <file> Write results to file
85
+
86
+ LLM CONFIGURATION:
87
+ Set these environment variables for LLM-enhanced analysis:
88
+ LLM_API_KEY API key for LLM provider
89
+ LLM_BASE_URL LLM API base URL
90
+ LLM_ENRICHMENT_MODEL Model to use (default: cognium/gpt-oss-120b)
91
+
92
+ EXAMPLES:
93
+ cognium-ai scan src/ # LLM-enhanced scan
94
+ cognium-ai scan src/ --no-llm # Static-only scan
95
+ cognium-ai scan app.java -f json -o out.json # JSON output to file
96
+ cognium-ai scan . --severity high # High+ severity only
97
+ cognium-ai dead-code src/ # Find dead code
98
+ cognium-ai secrets . # Find secrets
99
+ cognium-ai health src/ # Health score
100
+ cognium-ai skill ./my-mcp-server # Analyze AI skill
101
+
102
+ For more information, visit: https://cognium.dev
103
+ `);
104
+ }
105
+ export function showVersion(version) {
106
+ console.log(`cognium-ai v${version}`);
107
+ console.log(`Powered by Cognium Labs (circle-ir + circle-ir-ai)`);
108
+ }
109
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/utils/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,IAAI,OAA2B,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;oBACvB,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;gBACvB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,GAAG,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Lightweight ANSI color utilities
3
+ */
4
+ export declare const colors: {
5
+ red: (text: string) => string;
6
+ green: (text: string) => string;
7
+ yellow: (text: string) => string;
8
+ blue: (text: string) => string;
9
+ cyan: (text: string) => string;
10
+ magenta: (text: string) => string;
11
+ bold: (text: string) => string;
12
+ dim: (text: string) => string;
13
+ };
14
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,eAAO,MAAM,MAAM;gBACL,MAAM;kBACJ,MAAM;mBACL,MAAM;iBACR,MAAM;iBACN,MAAM;oBACH,MAAM;iBACT,MAAM;gBACP,MAAM;CACnB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Lightweight ANSI color utilities
3
+ */
4
+ const RESET = '\x1b[0m';
5
+ const BOLD = '\x1b[1m';
6
+ const RED = '\x1b[91m';
7
+ const GREEN = '\x1b[92m';
8
+ const YELLOW = '\x1b[93m';
9
+ const BLUE = '\x1b[94m';
10
+ const CYAN = '\x1b[96m';
11
+ const MAGENTA = '\x1b[95m';
12
+ export const colors = {
13
+ red: (text) => `${RED}${text}${RESET}`,
14
+ green: (text) => `${GREEN}${text}${RESET}`,
15
+ yellow: (text) => `${YELLOW}${text}${RESET}`,
16
+ blue: (text) => `${BLUE}${text}${RESET}`,
17
+ cyan: (text) => `${CYAN}${text}${RESET}`,
18
+ magenta: (text) => `${MAGENTA}${text}${RESET}`,
19
+ bold: (text) => `${BOLD}${text}${RESET}`,
20
+ dim: (text) => text,
21
+ };
22
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AAEvB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,OAAO,GAAG,UAAU,CAAC;AAE3B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE;IAC9C,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE;IAClD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE;IACpD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE;IAChD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE;IAChD,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,EAAE;IACtD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE;IAChD,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;CAC5B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lightweight spinner utility
3
+ */
4
+ export declare class Spinner {
5
+ private _text;
6
+ private frameIndex;
7
+ private intervalId?;
8
+ private isSpinning;
9
+ constructor(text: string);
10
+ start(): this;
11
+ stop(): this;
12
+ succeed(text?: string): this;
13
+ fail(text?: string): this;
14
+ warn(text?: string): this;
15
+ set text(value: string);
16
+ get text(): string;
17
+ }
18
+ export declare function spinner(text: string): Spinner;
19
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,EAAE,MAAM;IAIxB,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAgBZ,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzB,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAErB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Lightweight spinner utility
3
+ */
4
+ const SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F'];
5
+ const CHECKMARK = '\u2714';
6
+ const CROSS = '\u2716';
7
+ const WARNING = '\u26A0';
8
+ export class Spinner {
9
+ _text;
10
+ frameIndex = 0;
11
+ intervalId;
12
+ isSpinning = false;
13
+ constructor(text) {
14
+ this._text = text;
15
+ }
16
+ start() {
17
+ if (this.isSpinning)
18
+ return this;
19
+ this.isSpinning = true;
20
+ this.frameIndex = 0;
21
+ process.stdout.write('\x1b[?25l');
22
+ this.intervalId = setInterval(() => {
23
+ const frame = SPINNER_FRAMES[this.frameIndex];
24
+ this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;
25
+ process.stdout.write(`\r\x1b[K${frame} ${this._text}`);
26
+ }, 80);
27
+ return this;
28
+ }
29
+ stop() {
30
+ if (!this.isSpinning)
31
+ return this;
32
+ if (this.intervalId) {
33
+ clearInterval(this.intervalId);
34
+ this.intervalId = undefined;
35
+ }
36
+ this.isSpinning = false;
37
+ process.stdout.write('\r\x1b[K');
38
+ process.stdout.write('\x1b[?25h');
39
+ return this;
40
+ }
41
+ succeed(text) {
42
+ this.stop();
43
+ const message = text || this._text;
44
+ console.log(`\x1b[32m${CHECKMARK}\x1b[0m ${message}`);
45
+ return this;
46
+ }
47
+ fail(text) {
48
+ this.stop();
49
+ const message = text || this._text;
50
+ console.log(`\x1b[31m${CROSS}\x1b[0m ${message}`);
51
+ return this;
52
+ }
53
+ warn(text) {
54
+ this.stop();
55
+ const message = text || this._text;
56
+ console.log(`\x1b[33m${WARNING}\x1b[0m ${message}`);
57
+ return this;
58
+ }
59
+ set text(value) {
60
+ this._text = value;
61
+ }
62
+ get text() {
63
+ return this._text;
64
+ }
65
+ }
66
+ export function spinner(text) {
67
+ return new Spinner(text);
68
+ }
69
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const version = "1.0.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const version = '1.0.0';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "cognium-ai",
3
+ "version": "1.0.0",
4
+ "description": "AI-powered static analysis CLI with LLM-enhanced vulnerability detection",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "cognium-ai": "dist/cli.js"
9
+ },
10
+ "type": "module",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "prepare": "npm run build",
14
+ "prepublishOnly": "npm run build",
15
+ "dev": "tsx src/cli.ts",
16
+ "test": "vitest run",
17
+ "typecheck": "tsc --noEmit",
18
+ "clean": "rm -rf dist *.tsbuildinfo"
19
+ },
20
+ "keywords": [
21
+ "security",
22
+ "sast",
23
+ "static-analysis",
24
+ "vulnerability",
25
+ "cli",
26
+ "ai",
27
+ "llm",
28
+ "taint-analysis"
29
+ ],
30
+ "author": {
31
+ "name": "Cognium Labs",
32
+ "url": "https://cognium.dev"
33
+ },
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "README.md",
41
+ "LICENSE"
42
+ ],
43
+ "dependencies": {
44
+ "circle-ir-ai": "file:../circle-ir-ai"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.0.0",
48
+ "tsx": "^4.19.0",
49
+ "typescript": "^5.9.3",
50
+ "vitest": "^3.0.0"
51
+ }
52
+ }