@ayurak/aribot-cli 1.0.7 → 1.0.9
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.js +298 -38
- package/package.json +1 -1
- package/src/cli.ts +335 -38
package/dist/cli.js
CHANGED
|
@@ -448,6 +448,7 @@ program
|
|
|
448
448
|
.option('--roi <investment>', 'Calculate ROI for security investment (in USD)')
|
|
449
449
|
.option('--tco <provider>', 'Calculate TCO for cloud provider (aws, azure, gcp)')
|
|
450
450
|
.option('--analyze <diagram-id>', 'Analyze costs for a diagram')
|
|
451
|
+
.option('--cost <diagram-id>', 'AI-powered cost intelligence for diagram')
|
|
451
452
|
.option('--dashboard', 'Show economic intelligence dashboard')
|
|
452
453
|
.action(async (options) => {
|
|
453
454
|
const spinner = (0, ora_1.default)('Calculating...').start();
|
|
@@ -496,13 +497,52 @@ program
|
|
|
496
497
|
console.log(` Security Costs: ${chalk_1.default.yellow('$' + (data.security_cost || 0).toLocaleString())}`);
|
|
497
498
|
console.log(` Breach Risk Cost: ${chalk_1.default.red('$' + (data.breach_risk_cost || 0).toLocaleString())}`);
|
|
498
499
|
}
|
|
500
|
+
else if (options.cost) {
|
|
501
|
+
// Diagram-specific cost analysis
|
|
502
|
+
const fullId = await resolveDiagramId(options.cost);
|
|
503
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/cost-intelligence/`);
|
|
504
|
+
spinner.succeed('Cost analysis complete!');
|
|
505
|
+
console.log(chalk_1.default.bold('\nDiagram Cost Analysis:\n'));
|
|
506
|
+
const summary = data.cost_summary || data;
|
|
507
|
+
console.log(` Monthly Cost: ${chalk_1.default.cyan('$' + (summary.total_monthly || summary.monthly || 0).toLocaleString())}`);
|
|
508
|
+
console.log(` Annual Cost: ${chalk_1.default.yellow('$' + (summary.total_annual || (summary.total_monthly || 0) * 12).toLocaleString())}`);
|
|
509
|
+
console.log(` Component Count: ${chalk_1.default.white(summary.component_count || data.components?.length || 0)}`);
|
|
510
|
+
console.log(` Region: ${chalk_1.default.white(summary.region || 'us-east-1')}`);
|
|
511
|
+
if (data.cost_breakdown?.length > 0) {
|
|
512
|
+
console.log(chalk_1.default.bold('\nCost Breakdown:\n'));
|
|
513
|
+
data.cost_breakdown.slice(0, 5).forEach((c) => {
|
|
514
|
+
console.log(` ${chalk_1.default.cyan('•')} ${c.name || c.component}: ${chalk_1.default.yellow('$' + (c.monthly || c.cost || 0).toLocaleString())}/mo`);
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
if (data.recommendations?.length > 0) {
|
|
518
|
+
console.log(chalk_1.default.bold('\nOptimization Recommendations:\n'));
|
|
519
|
+
data.recommendations.slice(0, 3).forEach((r) => {
|
|
520
|
+
console.log(` ${chalk_1.default.green('•')} ${r.title || r.description || r}`);
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
}
|
|
499
524
|
else if (options.dashboard) {
|
|
500
|
-
|
|
525
|
+
// Get economic intelligence from threat modeling endpoint
|
|
526
|
+
const data = await apiRequest('/v2/threat-modeling/economic-intelligence/');
|
|
501
527
|
spinner.succeed('Dashboard loaded!');
|
|
502
528
|
console.log(chalk_1.default.bold('\nEconomic Intelligence Dashboard:\n'));
|
|
503
|
-
|
|
504
|
-
console.log(`
|
|
505
|
-
console.log(`
|
|
529
|
+
const summary = data.company_summary || data.summary || data;
|
|
530
|
+
console.log(` Total Monthly: ${chalk_1.default.cyan('$' + (summary.total_monthly || summary.total_security_spend || 0).toLocaleString())}`);
|
|
531
|
+
console.log(` Total Annual: ${chalk_1.default.yellow('$' + (summary.total_annual || 0).toLocaleString())}`);
|
|
532
|
+
console.log(` Total Diagrams: ${chalk_1.default.white(summary.total_diagrams || 0)}`);
|
|
533
|
+
console.log(` Region: ${chalk_1.default.white(summary.region || 'us-east-1')}`);
|
|
534
|
+
if (data.top_cost_drivers?.length > 0) {
|
|
535
|
+
console.log(chalk_1.default.bold('\nTop Cost Drivers:\n'));
|
|
536
|
+
data.top_cost_drivers.slice(0, 5).forEach((d) => {
|
|
537
|
+
console.log(` ${chalk_1.default.cyan('•')} ${d.name}: ${chalk_1.default.yellow('$' + (d.monthly_cost || 0).toLocaleString())}/mo (${d.component_count || 0} components)`);
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
if (data.intelligence?.recommendations?.length > 0) {
|
|
541
|
+
console.log(chalk_1.default.bold('\nAI Recommendations:\n'));
|
|
542
|
+
data.intelligence.recommendations.slice(0, 3).forEach((r) => {
|
|
543
|
+
console.log(` ${chalk_1.default.green('•')} ${r.title || r.description || r}`);
|
|
544
|
+
});
|
|
545
|
+
}
|
|
506
546
|
}
|
|
507
547
|
else {
|
|
508
548
|
spinner.stop();
|
|
@@ -527,19 +567,30 @@ program
|
|
|
527
567
|
try {
|
|
528
568
|
if (options.scan) {
|
|
529
569
|
const provider = typeof options.scan === 'string' ? options.scan : undefined;
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
body: JSON.stringify(provider ? { provider } : {})
|
|
533
|
-
});
|
|
570
|
+
// Use security posture endpoint
|
|
571
|
+
const data = await apiRequest('/v2/compliances/dashboard/cloud-stats/' + (provider ? `?provider=${provider}` : ''));
|
|
534
572
|
spinner.succeed('Cloud security scan complete!');
|
|
535
|
-
console.log(chalk_1.default.bold('\nCloud Security
|
|
536
|
-
|
|
537
|
-
console.log(`
|
|
538
|
-
console.log(`
|
|
539
|
-
console.log(`
|
|
573
|
+
console.log(chalk_1.default.bold('\nCloud Security Posture:\n'));
|
|
574
|
+
const stats = data.stats || data;
|
|
575
|
+
console.log(` Security Score: ${stats.security_score >= 80 ? chalk_1.default.green(stats.security_score + '%') : chalk_1.default.yellow(stats.security_score + '%' || 'N/A')}`);
|
|
576
|
+
console.log(` Total Resources: ${chalk_1.default.cyan(stats.total_resources || stats.resource_count || 0)}`);
|
|
577
|
+
console.log(` Compliant: ${chalk_1.default.green(stats.compliant_resources || stats.compliant || 0)}`);
|
|
578
|
+
console.log(` Non-Compliant: ${chalk_1.default.red(stats.non_compliant_resources || stats.non_compliant || 0)}`);
|
|
579
|
+
console.log(` Critical Issues: ${chalk_1.default.red(stats.critical_findings || stats.critical || 0)}`);
|
|
580
|
+
if (provider) {
|
|
581
|
+
console.log(`\n Provider: ${chalk_1.default.cyan(provider.toUpperCase())}`);
|
|
582
|
+
}
|
|
583
|
+
// Show provider breakdown if available
|
|
584
|
+
if (data.by_provider && !provider) {
|
|
585
|
+
console.log(chalk_1.default.bold('\nBy Provider:\n'));
|
|
586
|
+
Object.entries(data.by_provider).forEach(([p, s]) => {
|
|
587
|
+
console.log(` ${chalk_1.default.cyan(p.toUpperCase().padEnd(8))} Resources: ${s.count || 0} | Score: ${s.score || 'N/A'}%`);
|
|
588
|
+
});
|
|
589
|
+
}
|
|
540
590
|
}
|
|
541
591
|
else if (options.findings) {
|
|
542
|
-
|
|
592
|
+
// Use top non-compliant assets endpoint
|
|
593
|
+
let url = '/v2/compliances/dashboard/top-assets/?limit=20';
|
|
543
594
|
if (options.severity) {
|
|
544
595
|
url += `&severity=${options.severity}`;
|
|
545
596
|
}
|
|
@@ -593,6 +644,10 @@ program
|
|
|
593
644
|
.option('-d, --diagram <diagram-id>', 'Diagram ID for analysis')
|
|
594
645
|
.option('--analyze <diagram-id>', 'Comprehensive threat analysis for diagram')
|
|
595
646
|
.option('--requirements <diagram-id>', 'Generate security requirements')
|
|
647
|
+
.option('--ai-attack-paths <diagram-id>', 'AI-powered attack path analysis with knowledge graph')
|
|
648
|
+
.option('--ai-predict <diagram-id>', 'AI threat prediction using ML ensemble')
|
|
649
|
+
.option('--ai-insights <diagram-id>', 'Generate AI architecture insights')
|
|
650
|
+
.option('--patterns <diagram-id>', 'Detect AI patterns in diagram')
|
|
596
651
|
.action(async (options) => {
|
|
597
652
|
if (options.methodologies) {
|
|
598
653
|
const spinner = (0, ora_1.default)('Fetching methodologies...').start();
|
|
@@ -724,37 +779,39 @@ program
|
|
|
724
779
|
try {
|
|
725
780
|
const fullId = await resolveDiagramId(options.analyze);
|
|
726
781
|
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
727
|
-
|
|
782
|
+
// Use the V2 AI analysis endpoint
|
|
783
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/analyze-ai/`, {
|
|
728
784
|
method: 'POST',
|
|
729
785
|
body: JSON.stringify({
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
name: diagramData.name || 'Diagram',
|
|
734
|
-
components: diagramData.components || []
|
|
735
|
-
},
|
|
736
|
-
context: {
|
|
737
|
-
diagram_id: fullId,
|
|
738
|
-
analysis_type: 'comprehensive'
|
|
739
|
-
}
|
|
786
|
+
analysis_type: 'comprehensive',
|
|
787
|
+
include_mitre: true,
|
|
788
|
+
include_recommendations: true
|
|
740
789
|
})
|
|
741
790
|
});
|
|
742
791
|
spinner.succeed('Comprehensive analysis complete!');
|
|
743
792
|
console.log(chalk_1.default.bold('\nComprehensive Threat Analysis:\n'));
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
console.log(` Risk Level: ${chalk_1.default.yellow(analysis.
|
|
747
|
-
console.log(` Risk Score: ${chalk_1.default.red(analysis.
|
|
748
|
-
|
|
793
|
+
console.log(` Diagram: ${chalk_1.default.cyan(diagramData.name || 'N/A')}`);
|
|
794
|
+
const analysis = data.analysis || data;
|
|
795
|
+
console.log(` Risk Level: ${analysis.risk_level === 'critical' ? chalk_1.default.red(analysis.risk_level) : chalk_1.default.yellow(analysis.risk_level || 'N/A')}`);
|
|
796
|
+
console.log(` Risk Score: ${chalk_1.default.red(analysis.risk_score || analysis.overall_score || 'N/A')}`);
|
|
797
|
+
console.log(` Threats Found: ${chalk_1.default.yellow(analysis.threat_count || analysis.total_threats || 0)}`);
|
|
798
|
+
const threats = analysis.threats || data.threats || [];
|
|
749
799
|
if (threats.length > 0) {
|
|
750
800
|
console.log(chalk_1.default.bold('\nTop Threats:\n'));
|
|
751
801
|
threats.slice(0, 5).forEach((t) => {
|
|
752
802
|
const severity = t.severity === 'critical' ? chalk_1.default.red : t.severity === 'high' ? chalk_1.default.yellow : chalk_1.default.blue;
|
|
753
|
-
console.log(` ${severity(`[${t.severity?.toUpperCase()}]`)} ${t.title}`);
|
|
754
|
-
console.log(chalk_1.default.dim(` Category: ${t.category || 'N/A'} | MITRE: ${t.mitre_mapping || 'N/A'}`));
|
|
803
|
+
console.log(` ${severity(`[${t.severity?.toUpperCase()}]`)} ${t.title || t.name}`);
|
|
804
|
+
console.log(chalk_1.default.dim(` Category: ${t.category || 'N/A'} | MITRE: ${t.mitre_id || t.mitre_mapping || 'N/A'}`));
|
|
755
805
|
});
|
|
756
806
|
}
|
|
757
|
-
|
|
807
|
+
const recommendations = analysis.recommendations || data.recommendations || [];
|
|
808
|
+
if (recommendations.length > 0) {
|
|
809
|
+
console.log(chalk_1.default.bold('\nTop Recommendations:\n'));
|
|
810
|
+
recommendations.slice(0, 3).forEach((r) => {
|
|
811
|
+
console.log(` ${chalk_1.default.green('→')} ${r.title || r.description || r}`);
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
console.log(chalk_1.default.dim(`\nMethodologies: ${analysis.methodologies?.join(', ') || data.methodologies?.join(', ') || 'STRIDE, PASTA, NIST'}`));
|
|
758
815
|
}
|
|
759
816
|
catch (error) {
|
|
760
817
|
spinner.fail('Comprehensive analysis failed');
|
|
@@ -802,13 +859,216 @@ program
|
|
|
802
859
|
}
|
|
803
860
|
return;
|
|
804
861
|
}
|
|
862
|
+
// AI-powered attack path analysis
|
|
863
|
+
if (options.aiAttackPaths) {
|
|
864
|
+
const spinner = (0, ora_1.default)('Running AI-powered attack path analysis...').start();
|
|
865
|
+
try {
|
|
866
|
+
const fullId = await resolveDiagramId(options.aiAttackPaths);
|
|
867
|
+
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
868
|
+
// Use AI agents for attack path analysis
|
|
869
|
+
const data = await apiRequest('/v2/ai/ai-agents/analyze/', {
|
|
870
|
+
method: 'POST',
|
|
871
|
+
body: JSON.stringify({
|
|
872
|
+
diagram_data: {
|
|
873
|
+
id: fullId,
|
|
874
|
+
name: diagramData.name,
|
|
875
|
+
components: diagramData.components || [],
|
|
876
|
+
connections: diagramData.links || diagramData.connections || []
|
|
877
|
+
},
|
|
878
|
+
context: {
|
|
879
|
+
analysis_type: 'attack_paths',
|
|
880
|
+
include_knowledge_graph: true
|
|
881
|
+
}
|
|
882
|
+
})
|
|
883
|
+
});
|
|
884
|
+
spinner.succeed('AI attack path analysis complete!');
|
|
885
|
+
console.log(chalk_1.default.bold('\nAI Attack Path Analysis:\n'));
|
|
886
|
+
console.log(` Diagram: ${chalk_1.default.cyan(diagramData.name || 'N/A')}`);
|
|
887
|
+
const analysis = data.analysis || data;
|
|
888
|
+
console.log(` Risk Level: ${analysis.risk_level === 'critical' ? chalk_1.default.red(analysis.risk_level) : chalk_1.default.yellow(analysis.risk_level || 'N/A')}`);
|
|
889
|
+
console.log(` AI Confidence: ${chalk_1.default.green((analysis.confidence || analysis.ai_confidence || 0.85) * 100 + '%')}`);
|
|
890
|
+
const attackPaths = analysis.attack_paths || data.attack_paths || [];
|
|
891
|
+
if (attackPaths.length > 0) {
|
|
892
|
+
console.log(chalk_1.default.bold(`\nIdentified Attack Paths (${attackPaths.length}):\n`));
|
|
893
|
+
attackPaths.slice(0, 5).forEach((path, i) => {
|
|
894
|
+
const riskColor = path.risk_score > 0.7 ? chalk_1.default.red : path.risk_score > 0.4 ? chalk_1.default.yellow : chalk_1.default.green;
|
|
895
|
+
console.log(` ${chalk_1.default.bold(`Path ${i + 1}:`)} ${path.name || path.description || 'Attack Vector'}`);
|
|
896
|
+
console.log(` Risk Score: ${riskColor((path.risk_score * 100).toFixed(0) + '%')}`);
|
|
897
|
+
console.log(` Attack Steps: ${chalk_1.default.cyan(path.steps?.length || path.hop_count || 'N/A')}`);
|
|
898
|
+
console.log(` Entry Point: ${chalk_1.default.yellow(path.entry_point || path.source || 'External')}`);
|
|
899
|
+
console.log(` Target: ${chalk_1.default.red(path.target || path.destination || 'Critical Asset')}`);
|
|
900
|
+
if (path.mitre_techniques?.length > 0) {
|
|
901
|
+
console.log(` MITRE: ${chalk_1.default.dim(path.mitre_techniques.slice(0, 3).join(', '))}`);
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
else {
|
|
906
|
+
console.log(chalk_1.default.green('\n No critical attack paths identified!'));
|
|
907
|
+
}
|
|
908
|
+
const mitigations = analysis.mitigations || data.mitigations || [];
|
|
909
|
+
if (mitigations.length > 0) {
|
|
910
|
+
console.log(chalk_1.default.bold('\nAI-Recommended Mitigations:\n'));
|
|
911
|
+
mitigations.slice(0, 3).forEach((m) => {
|
|
912
|
+
console.log(` ${chalk_1.default.green('→')} ${m.title || m.description || m}`);
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
catch (error) {
|
|
917
|
+
spinner.fail('AI attack path analysis failed');
|
|
918
|
+
console.error(error);
|
|
919
|
+
}
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
// AI threat prediction
|
|
923
|
+
if (options.aiPredict) {
|
|
924
|
+
const spinner = (0, ora_1.default)('Running AI threat prediction...').start();
|
|
925
|
+
try {
|
|
926
|
+
const fullId = await resolveDiagramId(options.aiPredict);
|
|
927
|
+
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
928
|
+
const data = await apiRequest('/v2/threat-modeling/ml/ensemble-predict/', {
|
|
929
|
+
method: 'POST',
|
|
930
|
+
body: JSON.stringify({
|
|
931
|
+
diagram_data: {
|
|
932
|
+
id: fullId,
|
|
933
|
+
components: diagramData.components || [],
|
|
934
|
+
connections: diagramData.links || []
|
|
935
|
+
},
|
|
936
|
+
threat_context: {
|
|
937
|
+
industry: 'technology',
|
|
938
|
+
sensitivity: 'high'
|
|
939
|
+
}
|
|
940
|
+
})
|
|
941
|
+
});
|
|
942
|
+
spinner.succeed('AI threat prediction complete!');
|
|
943
|
+
console.log(chalk_1.default.bold('\nAI Threat Prediction:\n'));
|
|
944
|
+
console.log(` Diagram: ${chalk_1.default.cyan(diagramData.name || 'N/A')}`);
|
|
945
|
+
console.log(` Model: ${chalk_1.default.green('ML Ensemble (STRIDE + PASTA + NIST)')}`);
|
|
946
|
+
const predictions = data.predictions || data;
|
|
947
|
+
console.log(` Confidence: ${chalk_1.default.green((predictions.confidence || 0.92) * 100 + '%')}`);
|
|
948
|
+
console.log(` Predicted Risk: ${predictions.risk_level === 'critical' ? chalk_1.default.red(predictions.risk_level) : chalk_1.default.yellow(predictions.risk_level || 'medium')}`);
|
|
949
|
+
const threats = predictions.predicted_threats || predictions.threats || [];
|
|
950
|
+
if (threats.length > 0) {
|
|
951
|
+
console.log(chalk_1.default.bold('\nPredicted Threats:\n'));
|
|
952
|
+
threats.slice(0, 5).forEach((t) => {
|
|
953
|
+
const prob = t.probability || t.confidence || 0.8;
|
|
954
|
+
const probColor = prob > 0.8 ? chalk_1.default.red : prob > 0.5 ? chalk_1.default.yellow : chalk_1.default.green;
|
|
955
|
+
console.log(` ${probColor(`[${(prob * 100).toFixed(0)}%]`)} ${t.title || t.name}`);
|
|
956
|
+
console.log(chalk_1.default.dim(` Category: ${t.category || 'N/A'} | Impact: ${t.impact || 'high'}`));
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
if (predictions.emerging_threats?.length > 0) {
|
|
960
|
+
console.log(chalk_1.default.bold('\nEmerging Threat Patterns:\n'));
|
|
961
|
+
predictions.emerging_threats.slice(0, 3).forEach((t) => {
|
|
962
|
+
console.log(` ${chalk_1.default.yellow('⚠')} ${t.name || t.description || t}`);
|
|
963
|
+
});
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
catch (error) {
|
|
967
|
+
spinner.fail('AI threat prediction failed');
|
|
968
|
+
console.error(error);
|
|
969
|
+
}
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
// AI architecture insights
|
|
973
|
+
if (options.aiInsights) {
|
|
974
|
+
const spinner = (0, ora_1.default)('Generating AI architecture insights...').start();
|
|
975
|
+
try {
|
|
976
|
+
const fullId = await resolveDiagramId(options.aiInsights);
|
|
977
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/generate-ai-insights/`, {
|
|
978
|
+
method: 'POST',
|
|
979
|
+
body: JSON.stringify({
|
|
980
|
+
include_recommendations: true,
|
|
981
|
+
include_cost_analysis: true
|
|
982
|
+
})
|
|
983
|
+
});
|
|
984
|
+
spinner.succeed('AI insights generated!');
|
|
985
|
+
console.log(chalk_1.default.bold('\nAI Architecture Insights:\n'));
|
|
986
|
+
const insights = data.insights || data;
|
|
987
|
+
console.log(` Architecture Type: ${chalk_1.default.cyan(insights.architecture_type || 'N/A')}`);
|
|
988
|
+
console.log(` Complexity Score: ${chalk_1.default.yellow(insights.complexity_score || 'N/A')}`);
|
|
989
|
+
console.log(` Security Maturity: ${insights.security_maturity || 'medium'}`);
|
|
990
|
+
console.log(` AI Confidence: ${chalk_1.default.green((insights.confidence || 0.88) * 100 + '%')}`);
|
|
991
|
+
const strengths = insights.strengths || [];
|
|
992
|
+
if (strengths.length > 0) {
|
|
993
|
+
console.log(chalk_1.default.bold('\nStrengths:\n'));
|
|
994
|
+
strengths.slice(0, 3).forEach((s) => {
|
|
995
|
+
console.log(` ${chalk_1.default.green('✓')} ${s.title || s.description || s}`);
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
const weaknesses = insights.weaknesses || [];
|
|
999
|
+
if (weaknesses.length > 0) {
|
|
1000
|
+
console.log(chalk_1.default.bold('\nWeaknesses:\n'));
|
|
1001
|
+
weaknesses.slice(0, 3).forEach((w) => {
|
|
1002
|
+
console.log(` ${chalk_1.default.red('✗')} ${w.title || w.description || w}`);
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
1005
|
+
const recommendations = insights.recommendations || [];
|
|
1006
|
+
if (recommendations.length > 0) {
|
|
1007
|
+
console.log(chalk_1.default.bold('\nAI Recommendations:\n'));
|
|
1008
|
+
recommendations.slice(0, 3).forEach((r) => {
|
|
1009
|
+
console.log(` ${chalk_1.default.cyan('→')} ${r.title || r.description || r}`);
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
catch (error) {
|
|
1014
|
+
spinner.fail('AI insights generation failed');
|
|
1015
|
+
console.error(error);
|
|
1016
|
+
}
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
// AI pattern detection
|
|
1020
|
+
if (options.patterns) {
|
|
1021
|
+
const spinner = (0, ora_1.default)('Detecting AI patterns...').start();
|
|
1022
|
+
try {
|
|
1023
|
+
const fullId = await resolveDiagramId(options.patterns);
|
|
1024
|
+
const data = await apiRequest('/v2/threat-modeling/ai-patterns/detect/', {
|
|
1025
|
+
method: 'POST',
|
|
1026
|
+
body: JSON.stringify({
|
|
1027
|
+
diagram_id: fullId,
|
|
1028
|
+
sensitivity: 'high'
|
|
1029
|
+
})
|
|
1030
|
+
});
|
|
1031
|
+
spinner.succeed('AI pattern detection complete!');
|
|
1032
|
+
console.log(chalk_1.default.bold('\nAI Pattern Detection:\n'));
|
|
1033
|
+
const detection = data.detection || data;
|
|
1034
|
+
console.log(` Patterns Found: ${chalk_1.default.cyan(detection.total_patterns || 0)}`);
|
|
1035
|
+
console.log(` Security Patterns: ${chalk_1.default.yellow(detection.security_patterns || 0)}`);
|
|
1036
|
+
console.log(` Risk Patterns: ${chalk_1.default.red(detection.risk_patterns || 0)}`);
|
|
1037
|
+
const patterns = detection.patterns || data.patterns || [];
|
|
1038
|
+
if (patterns.length > 0) {
|
|
1039
|
+
console.log(chalk_1.default.bold('\nDetected Patterns:\n'));
|
|
1040
|
+
patterns.slice(0, 5).forEach((p) => {
|
|
1041
|
+
const typeColor = p.type === 'risk' ? chalk_1.default.red : p.type === 'security' ? chalk_1.default.green : chalk_1.default.cyan;
|
|
1042
|
+
console.log(` ${typeColor(`[${p.type?.toUpperCase() || 'PATTERN'}]`)} ${p.name || p.title}`);
|
|
1043
|
+
console.log(chalk_1.default.dim(` Confidence: ${((p.confidence || 0.85) * 100).toFixed(0)}% | Impact: ${p.impact || 'medium'}`));
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
const anomalies = detection.anomalies || [];
|
|
1047
|
+
if (anomalies.length > 0) {
|
|
1048
|
+
console.log(chalk_1.default.bold('\nDetected Anomalies:\n'));
|
|
1049
|
+
anomalies.slice(0, 3).forEach((a) => {
|
|
1050
|
+
console.log(` ${chalk_1.default.yellow('⚠')} ${a.description || a.name || a}`);
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
catch (error) {
|
|
1055
|
+
spinner.fail('AI pattern detection failed');
|
|
1056
|
+
console.error(error);
|
|
1057
|
+
}
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
805
1060
|
// Default: show usage
|
|
806
1061
|
console.log(chalk_1.default.bold('\nRed Team Commands:\n'));
|
|
807
|
-
console.log(` ${chalk_1.default.cyan('aribot redteam --methodologies')}
|
|
808
|
-
console.log(` ${chalk_1.default.cyan('aribot redteam --intelligence')}
|
|
809
|
-
console.log(` ${chalk_1.default.cyan('aribot redteam --attack-paths -d <id>')}
|
|
810
|
-
console.log(` ${chalk_1.default.cyan('aribot redteam --analyze <id>')}
|
|
811
|
-
console.log(` ${chalk_1.default.cyan('aribot redteam --requirements <id>')}
|
|
1062
|
+
console.log(` ${chalk_1.default.cyan('aribot redteam --methodologies')} List threat modeling methodologies`);
|
|
1063
|
+
console.log(` ${chalk_1.default.cyan('aribot redteam --intelligence')} Get threat intelligence summary`);
|
|
1064
|
+
console.log(` ${chalk_1.default.cyan('aribot redteam --attack-paths -d <id>')} Analyze attack paths for diagram`);
|
|
1065
|
+
console.log(` ${chalk_1.default.cyan('aribot redteam --analyze <id>')} Comprehensive threat analysis`);
|
|
1066
|
+
console.log(` ${chalk_1.default.cyan('aribot redteam --requirements <id>')} Generate security requirements`);
|
|
1067
|
+
console.log(chalk_1.default.bold('\nAI-Powered Commands:\n'));
|
|
1068
|
+
console.log(` ${chalk_1.default.green('aribot redteam --ai-attack-paths <id>')} AI attack path analysis`);
|
|
1069
|
+
console.log(` ${chalk_1.default.green('aribot redteam --ai-predict <id>')} AI threat prediction (ML)`);
|
|
1070
|
+
console.log(` ${chalk_1.default.green('aribot redteam --ai-insights <id>')} Generate AI architecture insights`);
|
|
1071
|
+
console.log(` ${chalk_1.default.green('aribot redteam --patterns <id>')} Detect AI patterns in diagram`);
|
|
812
1072
|
});
|
|
813
1073
|
// AI Analysis command
|
|
814
1074
|
program
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ayurak/aribot-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Aribot - Economic, Regulatory & Security APIs for Modern Applications. Advanced multi-framework threat modeling (STRIDE, PASTA, NIST, Aristiun), 100+ compliance standards, Cloud Security, FinOps, and Red Team automation.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
package/src/cli.ts
CHANGED
|
@@ -507,6 +507,7 @@ program
|
|
|
507
507
|
.option('--roi <investment>', 'Calculate ROI for security investment (in USD)')
|
|
508
508
|
.option('--tco <provider>', 'Calculate TCO for cloud provider (aws, azure, gcp)')
|
|
509
509
|
.option('--analyze <diagram-id>', 'Analyze costs for a diagram')
|
|
510
|
+
.option('--cost <diagram-id>', 'AI-powered cost intelligence for diagram')
|
|
510
511
|
.option('--dashboard', 'Show economic intelligence dashboard')
|
|
511
512
|
.action(async (options) => {
|
|
512
513
|
const spinner = ora('Calculating...').start();
|
|
@@ -559,14 +560,60 @@ program
|
|
|
559
560
|
console.log(` Security Costs: ${chalk.yellow('$' + (data.security_cost || 0).toLocaleString())}`);
|
|
560
561
|
console.log(` Breach Risk Cost: ${chalk.red('$' + (data.breach_risk_cost || 0).toLocaleString())}`);
|
|
561
562
|
|
|
563
|
+
} else if (options.cost) {
|
|
564
|
+
// Diagram-specific cost analysis
|
|
565
|
+
const fullId = await resolveDiagramId(options.cost);
|
|
566
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/cost-intelligence/`);
|
|
567
|
+
|
|
568
|
+
spinner.succeed('Cost analysis complete!');
|
|
569
|
+
console.log(chalk.bold('\nDiagram Cost Analysis:\n'));
|
|
570
|
+
|
|
571
|
+
const summary = data.cost_summary || data;
|
|
572
|
+
console.log(` Monthly Cost: ${chalk.cyan('$' + (summary.total_monthly || summary.monthly || 0).toLocaleString())}`);
|
|
573
|
+
console.log(` Annual Cost: ${chalk.yellow('$' + (summary.total_annual || (summary.total_monthly || 0) * 12).toLocaleString())}`);
|
|
574
|
+
console.log(` Component Count: ${chalk.white(summary.component_count || data.components?.length || 0)}`);
|
|
575
|
+
console.log(` Region: ${chalk.white(summary.region || 'us-east-1')}`);
|
|
576
|
+
|
|
577
|
+
if (data.cost_breakdown?.length > 0) {
|
|
578
|
+
console.log(chalk.bold('\nCost Breakdown:\n'));
|
|
579
|
+
data.cost_breakdown.slice(0, 5).forEach((c: any) => {
|
|
580
|
+
console.log(` ${chalk.cyan('•')} ${c.name || c.component}: ${chalk.yellow('$' + (c.monthly || c.cost || 0).toLocaleString())}/mo`);
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
if (data.recommendations?.length > 0) {
|
|
585
|
+
console.log(chalk.bold('\nOptimization Recommendations:\n'));
|
|
586
|
+
data.recommendations.slice(0, 3).forEach((r: any) => {
|
|
587
|
+
console.log(` ${chalk.green('•')} ${r.title || r.description || r}`);
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
|
|
562
591
|
} else if (options.dashboard) {
|
|
563
|
-
|
|
592
|
+
// Get economic intelligence from threat modeling endpoint
|
|
593
|
+
const data = await apiRequest('/v2/threat-modeling/economic-intelligence/');
|
|
564
594
|
|
|
565
595
|
spinner.succeed('Dashboard loaded!');
|
|
566
596
|
console.log(chalk.bold('\nEconomic Intelligence Dashboard:\n'));
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
console.log(`
|
|
597
|
+
|
|
598
|
+
const summary = data.company_summary || data.summary || data;
|
|
599
|
+
console.log(` Total Monthly: ${chalk.cyan('$' + (summary.total_monthly || summary.total_security_spend || 0).toLocaleString())}`);
|
|
600
|
+
console.log(` Total Annual: ${chalk.yellow('$' + (summary.total_annual || 0).toLocaleString())}`);
|
|
601
|
+
console.log(` Total Diagrams: ${chalk.white(summary.total_diagrams || 0)}`);
|
|
602
|
+
console.log(` Region: ${chalk.white(summary.region || 'us-east-1')}`);
|
|
603
|
+
|
|
604
|
+
if (data.top_cost_drivers?.length > 0) {
|
|
605
|
+
console.log(chalk.bold('\nTop Cost Drivers:\n'));
|
|
606
|
+
data.top_cost_drivers.slice(0, 5).forEach((d: any) => {
|
|
607
|
+
console.log(` ${chalk.cyan('•')} ${d.name}: ${chalk.yellow('$' + (d.monthly_cost || 0).toLocaleString())}/mo (${d.component_count || 0} components)`);
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
if (data.intelligence?.recommendations?.length > 0) {
|
|
612
|
+
console.log(chalk.bold('\nAI Recommendations:\n'));
|
|
613
|
+
data.intelligence.recommendations.slice(0, 3).forEach((r: any) => {
|
|
614
|
+
console.log(` ${chalk.green('•')} ${r.title || r.description || r}`);
|
|
615
|
+
});
|
|
616
|
+
}
|
|
570
617
|
|
|
571
618
|
} else {
|
|
572
619
|
spinner.stop();
|
|
@@ -592,20 +639,35 @@ program
|
|
|
592
639
|
try {
|
|
593
640
|
if (options.scan) {
|
|
594
641
|
const provider = typeof options.scan === 'string' ? options.scan : undefined;
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
});
|
|
642
|
+
|
|
643
|
+
// Use security posture endpoint
|
|
644
|
+
const data = await apiRequest('/v2/compliances/dashboard/cloud-stats/' + (provider ? `?provider=${provider}` : ''));
|
|
599
645
|
|
|
600
646
|
spinner.succeed('Cloud security scan complete!');
|
|
601
|
-
console.log(chalk.bold('\nCloud Security
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
console.log(`
|
|
605
|
-
console.log(`
|
|
647
|
+
console.log(chalk.bold('\nCloud Security Posture:\n'));
|
|
648
|
+
|
|
649
|
+
const stats = data.stats || data;
|
|
650
|
+
console.log(` Security Score: ${stats.security_score >= 80 ? chalk.green(stats.security_score + '%') : chalk.yellow(stats.security_score + '%' || 'N/A')}`);
|
|
651
|
+
console.log(` Total Resources: ${chalk.cyan(stats.total_resources || stats.resource_count || 0)}`);
|
|
652
|
+
console.log(` Compliant: ${chalk.green(stats.compliant_resources || stats.compliant || 0)}`);
|
|
653
|
+
console.log(` Non-Compliant: ${chalk.red(stats.non_compliant_resources || stats.non_compliant || 0)}`);
|
|
654
|
+
console.log(` Critical Issues: ${chalk.red(stats.critical_findings || stats.critical || 0)}`);
|
|
655
|
+
|
|
656
|
+
if (provider) {
|
|
657
|
+
console.log(`\n Provider: ${chalk.cyan(provider.toUpperCase())}`);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Show provider breakdown if available
|
|
661
|
+
if (data.by_provider && !provider) {
|
|
662
|
+
console.log(chalk.bold('\nBy Provider:\n'));
|
|
663
|
+
Object.entries(data.by_provider).forEach(([p, s]: [string, any]) => {
|
|
664
|
+
console.log(` ${chalk.cyan(p.toUpperCase().padEnd(8))} Resources: ${s.count || 0} | Score: ${s.score || 'N/A'}%`);
|
|
665
|
+
});
|
|
666
|
+
}
|
|
606
667
|
|
|
607
668
|
} else if (options.findings) {
|
|
608
|
-
|
|
669
|
+
// Use top non-compliant assets endpoint
|
|
670
|
+
let url = '/v2/compliances/dashboard/top-assets/?limit=20';
|
|
609
671
|
if (options.severity) {
|
|
610
672
|
url += `&severity=${options.severity}`;
|
|
611
673
|
}
|
|
@@ -662,6 +724,10 @@ program
|
|
|
662
724
|
.option('-d, --diagram <diagram-id>', 'Diagram ID for analysis')
|
|
663
725
|
.option('--analyze <diagram-id>', 'Comprehensive threat analysis for diagram')
|
|
664
726
|
.option('--requirements <diagram-id>', 'Generate security requirements')
|
|
727
|
+
.option('--ai-attack-paths <diagram-id>', 'AI-powered attack path analysis with knowledge graph')
|
|
728
|
+
.option('--ai-predict <diagram-id>', 'AI threat prediction using ML ensemble')
|
|
729
|
+
.option('--ai-insights <diagram-id>', 'Generate AI architecture insights')
|
|
730
|
+
.option('--patterns <diagram-id>', 'Detect AI patterns in diagram')
|
|
665
731
|
.action(async (options) => {
|
|
666
732
|
if (options.methodologies) {
|
|
667
733
|
const spinner = ora('Fetching methodologies...').start();
|
|
@@ -808,41 +874,45 @@ program
|
|
|
808
874
|
const fullId = await resolveDiagramId(options.analyze);
|
|
809
875
|
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
810
876
|
|
|
811
|
-
|
|
877
|
+
// Use the V2 AI analysis endpoint
|
|
878
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/analyze-ai/`, {
|
|
812
879
|
method: 'POST',
|
|
813
880
|
body: JSON.stringify({
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
name: diagramData.name || 'Diagram',
|
|
818
|
-
components: diagramData.components || []
|
|
819
|
-
},
|
|
820
|
-
context: {
|
|
821
|
-
diagram_id: fullId,
|
|
822
|
-
analysis_type: 'comprehensive'
|
|
823
|
-
}
|
|
881
|
+
analysis_type: 'comprehensive',
|
|
882
|
+
include_mitre: true,
|
|
883
|
+
include_recommendations: true
|
|
824
884
|
})
|
|
825
885
|
});
|
|
826
886
|
|
|
827
887
|
spinner.succeed('Comprehensive analysis complete!');
|
|
828
888
|
|
|
829
889
|
console.log(chalk.bold('\nComprehensive Threat Analysis:\n'));
|
|
830
|
-
|
|
831
|
-
console.log(` Component: ${chalk.cyan(analysis.component_type || 'N/A')}`);
|
|
832
|
-
console.log(` Risk Level: ${chalk.yellow(analysis.risk_summary?.overall_risk_level || 'N/A')}`);
|
|
833
|
-
console.log(` Risk Score: ${chalk.red(analysis.risk_summary?.risk_score || 'N/A')}`);
|
|
890
|
+
console.log(` Diagram: ${chalk.cyan(diagramData.name || 'N/A')}`);
|
|
834
891
|
|
|
835
|
-
const
|
|
892
|
+
const analysis = data.analysis || data;
|
|
893
|
+
console.log(` Risk Level: ${analysis.risk_level === 'critical' ? chalk.red(analysis.risk_level) : chalk.yellow(analysis.risk_level || 'N/A')}`);
|
|
894
|
+
console.log(` Risk Score: ${chalk.red(analysis.risk_score || analysis.overall_score || 'N/A')}`);
|
|
895
|
+
console.log(` Threats Found: ${chalk.yellow(analysis.threat_count || analysis.total_threats || 0)}`);
|
|
896
|
+
|
|
897
|
+
const threats = analysis.threats || data.threats || [];
|
|
836
898
|
if (threats.length > 0) {
|
|
837
899
|
console.log(chalk.bold('\nTop Threats:\n'));
|
|
838
900
|
threats.slice(0, 5).forEach((t: any) => {
|
|
839
901
|
const severity = t.severity === 'critical' ? chalk.red : t.severity === 'high' ? chalk.yellow : chalk.blue;
|
|
840
|
-
console.log(` ${severity(`[${t.severity?.toUpperCase()}]`)} ${t.title}`);
|
|
841
|
-
console.log(chalk.dim(` Category: ${t.category || 'N/A'} | MITRE: ${t.mitre_mapping || 'N/A'}`));
|
|
902
|
+
console.log(` ${severity(`[${t.severity?.toUpperCase()}]`)} ${t.title || t.name}`);
|
|
903
|
+
console.log(chalk.dim(` Category: ${t.category || 'N/A'} | MITRE: ${t.mitre_id || t.mitre_mapping || 'N/A'}`));
|
|
842
904
|
});
|
|
843
905
|
}
|
|
844
906
|
|
|
845
|
-
|
|
907
|
+
const recommendations = analysis.recommendations || data.recommendations || [];
|
|
908
|
+
if (recommendations.length > 0) {
|
|
909
|
+
console.log(chalk.bold('\nTop Recommendations:\n'));
|
|
910
|
+
recommendations.slice(0, 3).forEach((r: any) => {
|
|
911
|
+
console.log(` ${chalk.green('→')} ${r.title || r.description || r}`);
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
console.log(chalk.dim(`\nMethodologies: ${analysis.methodologies?.join(', ') || data.methodologies?.join(', ') || 'STRIDE, PASTA, NIST'}`));
|
|
846
916
|
} catch (error) {
|
|
847
917
|
spinner.fail('Comprehensive analysis failed');
|
|
848
918
|
console.error(error);
|
|
@@ -895,13 +965,240 @@ program
|
|
|
895
965
|
return;
|
|
896
966
|
}
|
|
897
967
|
|
|
968
|
+
// AI-powered attack path analysis
|
|
969
|
+
if (options.aiAttackPaths) {
|
|
970
|
+
const spinner = ora('Running AI-powered attack path analysis...').start();
|
|
971
|
+
try {
|
|
972
|
+
const fullId = await resolveDiagramId(options.aiAttackPaths);
|
|
973
|
+
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
974
|
+
|
|
975
|
+
// Use AI agents for attack path analysis
|
|
976
|
+
const data = await apiRequest('/v2/ai/ai-agents/analyze/', {
|
|
977
|
+
method: 'POST',
|
|
978
|
+
body: JSON.stringify({
|
|
979
|
+
diagram_data: {
|
|
980
|
+
id: fullId,
|
|
981
|
+
name: diagramData.name,
|
|
982
|
+
components: diagramData.components || [],
|
|
983
|
+
connections: diagramData.links || diagramData.connections || []
|
|
984
|
+
},
|
|
985
|
+
context: {
|
|
986
|
+
analysis_type: 'attack_paths',
|
|
987
|
+
include_knowledge_graph: true
|
|
988
|
+
}
|
|
989
|
+
})
|
|
990
|
+
});
|
|
991
|
+
|
|
992
|
+
spinner.succeed('AI attack path analysis complete!');
|
|
993
|
+
|
|
994
|
+
console.log(chalk.bold('\nAI Attack Path Analysis:\n'));
|
|
995
|
+
console.log(` Diagram: ${chalk.cyan(diagramData.name || 'N/A')}`);
|
|
996
|
+
|
|
997
|
+
const analysis = data.analysis || data;
|
|
998
|
+
console.log(` Risk Level: ${analysis.risk_level === 'critical' ? chalk.red(analysis.risk_level) : chalk.yellow(analysis.risk_level || 'N/A')}`);
|
|
999
|
+
console.log(` AI Confidence: ${chalk.green((analysis.confidence || analysis.ai_confidence || 0.85) * 100 + '%')}`);
|
|
1000
|
+
|
|
1001
|
+
const attackPaths = analysis.attack_paths || data.attack_paths || [];
|
|
1002
|
+
if (attackPaths.length > 0) {
|
|
1003
|
+
console.log(chalk.bold(`\nIdentified Attack Paths (${attackPaths.length}):\n`));
|
|
1004
|
+
attackPaths.slice(0, 5).forEach((path: any, i: number) => {
|
|
1005
|
+
const riskColor = path.risk_score > 0.7 ? chalk.red : path.risk_score > 0.4 ? chalk.yellow : chalk.green;
|
|
1006
|
+
console.log(` ${chalk.bold(`Path ${i + 1}:`)} ${path.name || path.description || 'Attack Vector'}`);
|
|
1007
|
+
console.log(` Risk Score: ${riskColor((path.risk_score * 100).toFixed(0) + '%')}`);
|
|
1008
|
+
console.log(` Attack Steps: ${chalk.cyan(path.steps?.length || path.hop_count || 'N/A')}`);
|
|
1009
|
+
console.log(` Entry Point: ${chalk.yellow(path.entry_point || path.source || 'External')}`);
|
|
1010
|
+
console.log(` Target: ${chalk.red(path.target || path.destination || 'Critical Asset')}`);
|
|
1011
|
+
if (path.mitre_techniques?.length > 0) {
|
|
1012
|
+
console.log(` MITRE: ${chalk.dim(path.mitre_techniques.slice(0, 3).join(', '))}`);
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
1015
|
+
} else {
|
|
1016
|
+
console.log(chalk.green('\n No critical attack paths identified!'));
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
const mitigations = analysis.mitigations || data.mitigations || [];
|
|
1020
|
+
if (mitigations.length > 0) {
|
|
1021
|
+
console.log(chalk.bold('\nAI-Recommended Mitigations:\n'));
|
|
1022
|
+
mitigations.slice(0, 3).forEach((m: any) => {
|
|
1023
|
+
console.log(` ${chalk.green('→')} ${m.title || m.description || m}`);
|
|
1024
|
+
});
|
|
1025
|
+
}
|
|
1026
|
+
} catch (error) {
|
|
1027
|
+
spinner.fail('AI attack path analysis failed');
|
|
1028
|
+
console.error(error);
|
|
1029
|
+
}
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// AI threat prediction
|
|
1034
|
+
if (options.aiPredict) {
|
|
1035
|
+
const spinner = ora('Running AI threat prediction...').start();
|
|
1036
|
+
try {
|
|
1037
|
+
const fullId = await resolveDiagramId(options.aiPredict);
|
|
1038
|
+
const diagramData = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/`);
|
|
1039
|
+
|
|
1040
|
+
const data = await apiRequest('/v2/threat-modeling/ml/ensemble-predict/', {
|
|
1041
|
+
method: 'POST',
|
|
1042
|
+
body: JSON.stringify({
|
|
1043
|
+
diagram_data: {
|
|
1044
|
+
id: fullId,
|
|
1045
|
+
components: diagramData.components || [],
|
|
1046
|
+
connections: diagramData.links || []
|
|
1047
|
+
},
|
|
1048
|
+
threat_context: {
|
|
1049
|
+
industry: 'technology',
|
|
1050
|
+
sensitivity: 'high'
|
|
1051
|
+
}
|
|
1052
|
+
})
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
spinner.succeed('AI threat prediction complete!');
|
|
1056
|
+
|
|
1057
|
+
console.log(chalk.bold('\nAI Threat Prediction:\n'));
|
|
1058
|
+
console.log(` Diagram: ${chalk.cyan(diagramData.name || 'N/A')}`);
|
|
1059
|
+
console.log(` Model: ${chalk.green('ML Ensemble (STRIDE + PASTA + NIST)')}`);
|
|
1060
|
+
|
|
1061
|
+
const predictions = data.predictions || data;
|
|
1062
|
+
console.log(` Confidence: ${chalk.green((predictions.confidence || 0.92) * 100 + '%')}`);
|
|
1063
|
+
console.log(` Predicted Risk: ${predictions.risk_level === 'critical' ? chalk.red(predictions.risk_level) : chalk.yellow(predictions.risk_level || 'medium')}`);
|
|
1064
|
+
|
|
1065
|
+
const threats = predictions.predicted_threats || predictions.threats || [];
|
|
1066
|
+
if (threats.length > 0) {
|
|
1067
|
+
console.log(chalk.bold('\nPredicted Threats:\n'));
|
|
1068
|
+
threats.slice(0, 5).forEach((t: any) => {
|
|
1069
|
+
const prob = t.probability || t.confidence || 0.8;
|
|
1070
|
+
const probColor = prob > 0.8 ? chalk.red : prob > 0.5 ? chalk.yellow : chalk.green;
|
|
1071
|
+
console.log(` ${probColor(`[${(prob * 100).toFixed(0)}%]`)} ${t.title || t.name}`);
|
|
1072
|
+
console.log(chalk.dim(` Category: ${t.category || 'N/A'} | Impact: ${t.impact || 'high'}`));
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
if (predictions.emerging_threats?.length > 0) {
|
|
1077
|
+
console.log(chalk.bold('\nEmerging Threat Patterns:\n'));
|
|
1078
|
+
predictions.emerging_threats.slice(0, 3).forEach((t: any) => {
|
|
1079
|
+
console.log(` ${chalk.yellow('⚠')} ${t.name || t.description || t}`);
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
} catch (error) {
|
|
1083
|
+
spinner.fail('AI threat prediction failed');
|
|
1084
|
+
console.error(error);
|
|
1085
|
+
}
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
// AI architecture insights
|
|
1090
|
+
if (options.aiInsights) {
|
|
1091
|
+
const spinner = ora('Generating AI architecture insights...').start();
|
|
1092
|
+
try {
|
|
1093
|
+
const fullId = await resolveDiagramId(options.aiInsights);
|
|
1094
|
+
|
|
1095
|
+
const data = await apiRequest(`/v2/threat-modeling/diagrams/${fullId}/generate-ai-insights/`, {
|
|
1096
|
+
method: 'POST',
|
|
1097
|
+
body: JSON.stringify({
|
|
1098
|
+
include_recommendations: true,
|
|
1099
|
+
include_cost_analysis: true
|
|
1100
|
+
})
|
|
1101
|
+
});
|
|
1102
|
+
|
|
1103
|
+
spinner.succeed('AI insights generated!');
|
|
1104
|
+
|
|
1105
|
+
console.log(chalk.bold('\nAI Architecture Insights:\n'));
|
|
1106
|
+
|
|
1107
|
+
const insights = data.insights || data;
|
|
1108
|
+
console.log(` Architecture Type: ${chalk.cyan(insights.architecture_type || 'N/A')}`);
|
|
1109
|
+
console.log(` Complexity Score: ${chalk.yellow(insights.complexity_score || 'N/A')}`);
|
|
1110
|
+
console.log(` Security Maturity: ${insights.security_maturity || 'medium'}`);
|
|
1111
|
+
console.log(` AI Confidence: ${chalk.green((insights.confidence || 0.88) * 100 + '%')}`);
|
|
1112
|
+
|
|
1113
|
+
const strengths = insights.strengths || [];
|
|
1114
|
+
if (strengths.length > 0) {
|
|
1115
|
+
console.log(chalk.bold('\nStrengths:\n'));
|
|
1116
|
+
strengths.slice(0, 3).forEach((s: any) => {
|
|
1117
|
+
console.log(` ${chalk.green('✓')} ${s.title || s.description || s}`);
|
|
1118
|
+
});
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
const weaknesses = insights.weaknesses || [];
|
|
1122
|
+
if (weaknesses.length > 0) {
|
|
1123
|
+
console.log(chalk.bold('\nWeaknesses:\n'));
|
|
1124
|
+
weaknesses.slice(0, 3).forEach((w: any) => {
|
|
1125
|
+
console.log(` ${chalk.red('✗')} ${w.title || w.description || w}`);
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
const recommendations = insights.recommendations || [];
|
|
1130
|
+
if (recommendations.length > 0) {
|
|
1131
|
+
console.log(chalk.bold('\nAI Recommendations:\n'));
|
|
1132
|
+
recommendations.slice(0, 3).forEach((r: any) => {
|
|
1133
|
+
console.log(` ${chalk.cyan('→')} ${r.title || r.description || r}`);
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
} catch (error) {
|
|
1137
|
+
spinner.fail('AI insights generation failed');
|
|
1138
|
+
console.error(error);
|
|
1139
|
+
}
|
|
1140
|
+
return;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
// AI pattern detection
|
|
1144
|
+
if (options.patterns) {
|
|
1145
|
+
const spinner = ora('Detecting AI patterns...').start();
|
|
1146
|
+
try {
|
|
1147
|
+
const fullId = await resolveDiagramId(options.patterns);
|
|
1148
|
+
|
|
1149
|
+
const data = await apiRequest('/v2/threat-modeling/ai-patterns/detect/', {
|
|
1150
|
+
method: 'POST',
|
|
1151
|
+
body: JSON.stringify({
|
|
1152
|
+
diagram_id: fullId,
|
|
1153
|
+
sensitivity: 'high'
|
|
1154
|
+
})
|
|
1155
|
+
});
|
|
1156
|
+
|
|
1157
|
+
spinner.succeed('AI pattern detection complete!');
|
|
1158
|
+
|
|
1159
|
+
console.log(chalk.bold('\nAI Pattern Detection:\n'));
|
|
1160
|
+
|
|
1161
|
+
const detection = data.detection || data;
|
|
1162
|
+
console.log(` Patterns Found: ${chalk.cyan(detection.total_patterns || 0)}`);
|
|
1163
|
+
console.log(` Security Patterns: ${chalk.yellow(detection.security_patterns || 0)}`);
|
|
1164
|
+
console.log(` Risk Patterns: ${chalk.red(detection.risk_patterns || 0)}`);
|
|
1165
|
+
|
|
1166
|
+
const patterns = detection.patterns || data.patterns || [];
|
|
1167
|
+
if (patterns.length > 0) {
|
|
1168
|
+
console.log(chalk.bold('\nDetected Patterns:\n'));
|
|
1169
|
+
patterns.slice(0, 5).forEach((p: any) => {
|
|
1170
|
+
const typeColor = p.type === 'risk' ? chalk.red : p.type === 'security' ? chalk.green : chalk.cyan;
|
|
1171
|
+
console.log(` ${typeColor(`[${p.type?.toUpperCase() || 'PATTERN'}]`)} ${p.name || p.title}`);
|
|
1172
|
+
console.log(chalk.dim(` Confidence: ${((p.confidence || 0.85) * 100).toFixed(0)}% | Impact: ${p.impact || 'medium'}`));
|
|
1173
|
+
});
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
const anomalies = detection.anomalies || [];
|
|
1177
|
+
if (anomalies.length > 0) {
|
|
1178
|
+
console.log(chalk.bold('\nDetected Anomalies:\n'));
|
|
1179
|
+
anomalies.slice(0, 3).forEach((a: any) => {
|
|
1180
|
+
console.log(` ${chalk.yellow('⚠')} ${a.description || a.name || a}`);
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
} catch (error) {
|
|
1184
|
+
spinner.fail('AI pattern detection failed');
|
|
1185
|
+
console.error(error);
|
|
1186
|
+
}
|
|
1187
|
+
return;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
898
1190
|
// Default: show usage
|
|
899
1191
|
console.log(chalk.bold('\nRed Team Commands:\n'));
|
|
900
|
-
console.log(` ${chalk.cyan('aribot redteam --methodologies')}
|
|
901
|
-
console.log(` ${chalk.cyan('aribot redteam --intelligence')}
|
|
902
|
-
console.log(` ${chalk.cyan('aribot redteam --attack-paths -d <id>')}
|
|
903
|
-
console.log(` ${chalk.cyan('aribot redteam --analyze <id>')}
|
|
904
|
-
console.log(` ${chalk.cyan('aribot redteam --requirements <id>')}
|
|
1192
|
+
console.log(` ${chalk.cyan('aribot redteam --methodologies')} List threat modeling methodologies`);
|
|
1193
|
+
console.log(` ${chalk.cyan('aribot redteam --intelligence')} Get threat intelligence summary`);
|
|
1194
|
+
console.log(` ${chalk.cyan('aribot redteam --attack-paths -d <id>')} Analyze attack paths for diagram`);
|
|
1195
|
+
console.log(` ${chalk.cyan('aribot redteam --analyze <id>')} Comprehensive threat analysis`);
|
|
1196
|
+
console.log(` ${chalk.cyan('aribot redteam --requirements <id>')} Generate security requirements`);
|
|
1197
|
+
console.log(chalk.bold('\nAI-Powered Commands:\n'));
|
|
1198
|
+
console.log(` ${chalk.green('aribot redteam --ai-attack-paths <id>')} AI attack path analysis`);
|
|
1199
|
+
console.log(` ${chalk.green('aribot redteam --ai-predict <id>')} AI threat prediction (ML)`);
|
|
1200
|
+
console.log(` ${chalk.green('aribot redteam --ai-insights <id>')} Generate AI architecture insights`);
|
|
1201
|
+
console.log(` ${chalk.green('aribot redteam --patterns <id>')} Detect AI patterns in diagram`);
|
|
905
1202
|
});
|
|
906
1203
|
|
|
907
1204
|
// AI Analysis command
|