Skip to content

Commit c69d75f

Browse files
committed
feat: implement progress bar for mcp servers count vs running
1 parent ec3c7d7 commit c69d75f

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

src/bin/cli.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,24 @@ async function init () {
2727
const filePath = filePathData.filePath.replace('~', process.env.HOME || '')
2828
const filePathValid = filePathData.parsable ? 'VALID' : 'INVALID'
2929
const filePathDataType = filePathData.type.toUpperCase()
30+
const mcpServers = filePathData.servers || []
31+
32+
const totalMCPServers = filePathData.servers ? filePathData.servers.length : 0
33+
const totalMCPServersRunning = mcpServers.filter(server => server.status === 'running').length
3034

3135
const mcpGroupData = [
3236
{ key: 'PROVIDER', value: group.friendlyName },
3337
{ key: 'FILE', value: filePath },
3438
{ key: 'PARSABLE', value: filePathValid },
3539
{ key: 'TYPE', value: filePathDataType },
36-
{ key: 'MCP SERVERS', value: filePathData.servers ? String(filePathData.servers.length) : 0 }
3740
]
3841

39-
const mcpServers = filePathData.servers || []
42+
const groupMetadata = {
43+
mcpServersTotal: totalMCPServers,
44+
mcpServersRunning: totalMCPServersRunning,
45+
}
4046

41-
RenderService.printMcpGroup(groupIndex, mcpGroupData)
47+
RenderService.printMcpGroup(groupIndex, mcpGroupData, groupMetadata)
4248
RenderService.printMcpServers(mcpServers)
4349
}
4450
} else {

src/services/render-service.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { styleText } from 'node:util'
12
import TransportComponent from '../components/transport.js'
23
import ColumnNameComponent from '../components/column-name.js'
34
import MCPServerStatusComponent from '../components/mcp-server-status.js'
@@ -100,7 +101,7 @@ export class RenderService {
100101
// { key: 'STATUS', value: '[✓ VALID] [GLOBAL] [5 MCP SERVERS]' }
101102
// ]
102103

103-
static printMcpGroup (id: number, data: any[]) {
104+
static printMcpGroup (id: number, data: any[], groupMetadata: object = {}) {
104105
if (data.length === 0) return
105106

106107
console.log('\n')
@@ -115,6 +116,12 @@ export class RenderService {
115116
const leftPaddingGroupLead = indexText + ' '.repeat(6 - indexText.length)
116117
const leftPaddingGroupData = ' '.repeat(6)
117118

119+
// Append group metadata keys to the data array
120+
if (Object.keys(groupMetadata).length > 0) {
121+
const metadataRow = this.renderProgressBar(groupMetadata.mcpServersRunning, groupMetadata.mcpServersTotal, 'Running')
122+
data.push({ key: 'MCP SERVERS', value: metadataRow })
123+
}
124+
118125
// Calculate column widths
119126
const columnWidths = headers.map((header, index) => {
120127
const dataWidth = Math.max(...data.map(row => {
@@ -150,4 +157,25 @@ export class RenderService {
150157
// Print bottom separator
151158
// console.log('')
152159
}
160+
161+
// draws progress bar components like this
162+
// "███████░░░░░░░░░░░░░ 3 / 9 Running"
163+
static renderProgressBar (count: number, total: number, label: string, width: number = 20): string {
164+
if (total === 0) {
165+
const emptyBar = '░'.repeat(width)
166+
return `${emptyBar} 0 / 0 ${label}`
167+
}
168+
169+
const progress = Math.min(count / total, 1)
170+
const filledWidth = Math.round(progress * width)
171+
const emptyWidth = width - filledWidth
172+
173+
const colorRunning = count > 0 ? 'greenBright' : 'red'
174+
const colorEmpty = count > 0 ? 'green' : 'red'
175+
176+
const filled = styleText([colorRunning], '█'.repeat(filledWidth))
177+
const empty = styleText([colorEmpty], '░'.repeat(emptyWidth))
178+
179+
return `${filled}${empty} ${count} / ${total} ${label}`
180+
}
153181
}

0 commit comments

Comments
 (0)