Skip to content

Commit 8fa715d

Browse files
committed
Merge branch 'development' of github.com:ColdBox/coldbox-cli into development
2 parents a654ff6 + f455151 commit 8fa715d

File tree

2 files changed

+160
-121
lines changed

2 files changed

+160
-121
lines changed

commands/coldbox/ai/stats.cfc

Lines changed: 80 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ component extends="coldbox-cli.models.BaseAICommand" {
2626
}
2727

2828
try {
29-
var info = ensureInstalled( arguments.directory );
29+
var info = ensureInstalled( arguments.directory );
3030
var manifest = loadManifest( arguments.directory );
31-
var stats = calculateStats( info, manifest, arguments.directory );
31+
var stats = calculateStats( info, manifest, arguments.directory );
3232

3333
// JSON output
3434
if ( arguments.json ) {
@@ -53,41 +53,41 @@ component extends="coldbox-cli.models.BaseAICommand" {
5353
required string directory
5454
){
5555
var stats = {
56-
"guidelines": {
57-
"total": arguments.info.guidelines.len(),
58-
"core": 0,
59-
"module": 0,
60-
"custom": 0,
61-
"override": 0,
62-
"totalSize": 0,
63-
"avgSize": 0
56+
"guidelines" : {
57+
"total" : arguments.info.guidelines.len(),
58+
"core" : 0,
59+
"module" : 0,
60+
"custom" : 0,
61+
"override" : 0,
62+
"totalSize" : 0,
63+
"avgSize" : 0
6464
},
65-
"skills": {
66-
"total": arguments.info.skills.len(),
67-
"core": 0,
68-
"module": 0,
69-
"custom": 0,
70-
"override": 0,
71-
"totalSize": 0,
72-
"avgSize": 0
65+
"skills" : {
66+
"total" : arguments.info.skills.len(),
67+
"core" : 0,
68+
"module" : 0,
69+
"custom" : 0,
70+
"override" : 0,
71+
"totalSize" : 0,
72+
"avgSize" : 0
7373
},
74-
"agents": {
75-
"total": arguments.manifest.agents.len(),
76-
"configured": arguments.manifest.agents
74+
"agents" : {
75+
"total" : arguments.manifest.agents.len(),
76+
"configured" : arguments.manifest.agents
7777
},
78-
"mcpServers": {
79-
"total": 0,
80-
"core": 0,
81-
"module": 0,
82-
"custom": 0
78+
"mcpServers" : {
79+
"total" : 0,
80+
"core" : 0,
81+
"module" : 0,
82+
"custom" : 0
8383
},
84-
"language": arguments.manifest.language ?: "unknown",
85-
"templateType": arguments.manifest.templateType ?: "unknown",
86-
"lastSync": arguments.manifest.lastSync ?: "never",
87-
"contextEstimate": {
88-
"totalKB": 0,
89-
"guidelinesKB": 0,
90-
"skillsKB": 0
84+
"language" : arguments.manifest.language ?: "unknown",
85+
"templateType" : arguments.manifest.templateType ?: "unknown",
86+
"lastSync" : arguments.manifest.lastSync ?: "never",
87+
"contextEstimate" : {
88+
"totalKB" : 0,
89+
"guidelinesKB" : 0,
90+
"skillsKB" : 0
9191
}
9292
};
9393

@@ -101,7 +101,7 @@ component extends="coldbox-cli.models.BaseAICommand" {
101101

102102
// Count skills by type
103103
arguments.info.skills.each( ( skill ) => {
104-
var type = skill.type ?: "module";
104+
var type = skill.type ?: "module";
105105
var source = skill.source ?: "";
106106

107107
if ( type == "override" ) {
@@ -116,32 +116,34 @@ component extends="coldbox-cli.models.BaseAICommand" {
116116
} );
117117

118118
// Count MCP servers
119-
var mcpServers = arguments.manifest.mcpServers ?: { "core": [], "module": [], "custom": [] };
120-
stats.mcpServers.core = mcpServers.core.len();
119+
var mcpServers = arguments.manifest.mcpServers ?: {
120+
"core" : [],
121+
"module" : [],
122+
"custom" : []
123+
};
124+
stats.mcpServers.core = mcpServers.core.len();
121125
stats.mcpServers.module = mcpServers.module.len();
122126
stats.mcpServers.custom = mcpServers.custom.len();
123-
stats.mcpServers.total = stats.mcpServers.core + stats.mcpServers.module + stats.mcpServers.custom;
127+
stats.mcpServers.total = stats.mcpServers.core + stats.mcpServers.module + stats.mcpServers.custom;
124128

125129
// Calculate file sizes
126130
var aiDir = arguments.directory & "/.ai";
127131
if ( directoryExists( aiDir ) ) {
128132
// Guidelines size
129133
var guidelinesDir = aiDir & "/guidelines";
130134
if ( directoryExists( guidelinesDir ) ) {
131-
var guidelineSize = calculateDirectorySize( guidelinesDir );
132-
stats.guidelines.totalSize = guidelineSize;
133-
stats.guidelines.avgSize = stats.guidelines.total > 0 ?
134-
int( guidelineSize / stats.guidelines.total ) : 0;
135+
var guidelineSize = calculateDirectorySize( guidelinesDir );
136+
stats.guidelines.totalSize = guidelineSize;
137+
stats.guidelines.avgSize = stats.guidelines.total > 0 ? int( guidelineSize / stats.guidelines.total ) : 0;
135138
stats.contextEstimate.guidelinesKB = int( guidelineSize / 1024 );
136139
}
137140

138141
// Skills size
139142
var skillsDir = aiDir & "/skills";
140143
if ( directoryExists( skillsDir ) ) {
141-
var skillsSize = calculateDirectorySize( skillsDir );
142-
stats.skills.totalSize = skillsSize;
143-
stats.skills.avgSize = stats.skills.total > 0 ?
144-
int( skillsSize / stats.skills.total ) : 0;
144+
var skillsSize = calculateDirectorySize( skillsDir );
145+
stats.skills.totalSize = skillsSize;
146+
stats.skills.avgSize = stats.skills.total > 0 ? int( skillsSize / stats.skills.total ) : 0;
145147
stats.contextEstimate.skillsKB = int( skillsSize / 1024 );
146148
}
147149

@@ -246,29 +248,45 @@ component extends="coldbox-cli.models.BaseAICommand" {
246248

247249
// Show usage indicator based on common AI models (using GPT-4 128K as baseline)
248250
var estimatedTokens = arguments.stats.contextEstimate.totalKB * 300;
249-
var baselineTokens = 128000; // GPT-4 context window
250-
var percentage = ( estimatedTokens / baselineTokens ) * 100;
251+
var baselineTokens = 128000; // GPT-4 context window
252+
var percentage = ( estimatedTokens / baselineTokens ) * 100;
251253

252254
print.toConsole( " Usage: " );
253255
if ( percentage < 30 ) {
254-
print.greenLine( "✓ Low (#numberFormat( percentage, '9.1' )#% of typical AI context)" );
256+
print.greenLine( "✓ Low (#numberFormat( percentage, "9.1" )#% of typical AI context)" );
255257
} else if ( percentage < 60 ) {
256-
print.yellowLine( "⚠ Moderate (#numberFormat( percentage, '9.1' )#% of typical AI context)" );
258+
print.yellowLine( "⚠ Moderate (#numberFormat( percentage, "9.1" )#% of typical AI context)" );
257259
} else if ( percentage < 90 ) {
258-
print.orangeLine( "⚠ High (#numberFormat( percentage, '9.1' )#% of typical AI context)" );
260+
print.orangeLine( "⚠ High (#numberFormat( percentage, "9.1" )#% of typical AI context)" );
259261
} else {
260-
print.redLine( "⛔ Very High (#numberFormat( percentage, '9.1' )#% of typical AI context)" );
262+
print.redLine( "⛔ Very High (#numberFormat( percentage, "9.1" )#% of typical AI context)" );
261263
print.dim( " Consider reducing guidelines/skills for better AI performance" );
262264
}
263265
print.line();
264266

265267
// Context window estimates for popular AI models
266268
if ( arguments.verbose ) {
267269
print.cyanLine( "📈 Context Window Utilization:" );
268-
printContextUtilization( "Claude 3.5 Sonnet", 200000, arguments.stats.contextEstimate.totalKB );
269-
printContextUtilization( "GPT-4", 128000, arguments.stats.contextEstimate.totalKB );
270-
printContextUtilization( "GPT-3.5-Turbo", 16000, arguments.stats.contextEstimate.totalKB );
271-
printContextUtilization( "Gemini 1.5 Pro", 1000000, arguments.stats.contextEstimate.totalKB );
270+
printContextUtilization(
271+
"Claude 3.5 Sonnet",
272+
200000,
273+
arguments.stats.contextEstimate.totalKB
274+
);
275+
printContextUtilization(
276+
"GPT-4",
277+
128000,
278+
arguments.stats.contextEstimate.totalKB
279+
);
280+
printContextUtilization(
281+
"GPT-3.5-Turbo",
282+
16000,
283+
arguments.stats.contextEstimate.totalKB
284+
);
285+
printContextUtilization(
286+
"Gemini 1.5 Pro",
287+
1000000,
288+
arguments.stats.contextEstimate.totalKB
289+
);
272290
print.line();
273291
}
274292

@@ -287,18 +305,18 @@ component extends="coldbox-cli.models.BaseAICommand" {
287305
){
288306
// Rough estimate: 1KB ≈ 300 tokens
289307
var estimatedTokens = arguments.usedKB * 300;
290-
var percentage = ( estimatedTokens / arguments.contextTokens ) * 100;
291-
var color = percentage < 30 ? "green" : ( percentage < 60 ? "yellow" : "red" );
308+
var percentage = ( estimatedTokens / arguments.contextTokens ) * 100;
309+
var color = percentage < 30 ? "green" : ( percentage < 60 ? "yellow" : "red" );
292310

293311
print.line( " #arguments.modelName#: " );
294312
print.toConsole( " " );
295313

296314
if ( color == "green" ) {
297-
print.greenText( "#numberFormat( percentage, '9.2' )#%" );
315+
print.greenText( "#numberFormat( percentage, "9.2" )#%" );
298316
} else if ( color == "yellow" ) {
299-
print.yellowText( "#numberFormat( percentage, '9.2' )#%" );
317+
print.yellowText( "#numberFormat( percentage, "9.2" )#%" );
300318
} else {
301-
print.redText( "#numberFormat( percentage, '9.2' )#%" );
319+
print.redText( "#numberFormat( percentage, "9.2" )#%" );
302320
}
303321

304322
print.line( " (~#numberFormat( estimatedTokens )# tokens of #numberFormat( arguments.contextTokens )#)" );
@@ -311,9 +329,9 @@ component extends="coldbox-cli.models.BaseAICommand" {
311329
if ( arguments.bytes < 1024 ) {
312330
return "#arguments.bytes# B";
313331
} else if ( arguments.bytes < 1048576 ) {
314-
return "#numberFormat( arguments.bytes / 1024, '9.2' )# KB";
332+
return "#numberFormat( arguments.bytes / 1024, "9.2" )# KB";
315333
} else {
316-
return "#numberFormat( arguments.bytes / 1048576, '9.2' )# MB";
334+
return "#numberFormat( arguments.bytes / 1048576, "9.2" )# MB";
317335
}
318336
}
319337

0 commit comments

Comments
 (0)