Cli table formatter
Skill a5c-ai/babysitter/library/specializations/cli-mcp-development/skills/cli-table-formatter
Babysitter enforces obedience on agentic workforces and enables them to manage extremely complex tasks and workflows through deterministic, hallucination-free self-orchestration
npx -y skills add a5c-ai/babysitter --skill cli-table-formatterAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Generate table formatters for structured CLI output with column alignment, borders, and responsive sizing.
SKILL.md
5.9 KB, as published. Nobody here has run it
CLI Table Formatter
Generate table formatters for structured CLI output.
Capabilities
- Create table formatters with various styles
- Configure column alignment and width
- Implement responsive table sizing
- Support Unicode borders
- Handle multiline cells
- Generate table utilities
Usage
Invoke this skill when you need to:
- Display tabular data in CLI
- Create formatted list output
- Configure column widths
- Support various border styles
Inputs
| Parameter | Type | Required | Description |
|---|---|---|---|
| language | string | Yes | Target language |
| style | string | No | Border style (simple, unicode, markdown) |
| features | array | No | Required features |
Generated Patterns
TypeScript Table Formatter
import chalk from 'chalk';
export interface TableColumn {
key: string;
header: string;
width?: number;
align?: 'left' | 'center' | 'right';
format?: (value: any) => string;
}
export interface TableOptions {
columns: TableColumn[];
borderStyle?: 'simple' | 'unicode' | 'none' | 'markdown';
headerColor?: (text: string) => string;
maxWidth?: number;
}
const borders = {
simple: {
top: '-', bottom: '-', left: '|', right: '|',
topLeft: '+', topRight: '+', bottomLeft: '+', bottomRight: '+',
horizontal: '-', vertical: '|', cross: '+',
},
unicode: {
top: '─', bottom: '─', left: '│', right: '│',
topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',
horizontal: '─', vertical: '│', cross: '┼',
midLeft: '├', midRight: '┤', topMid: '┬', bottomMid: '┴',
},
none: {
top: '', bottom: '', left: '', right: '',
topLeft: '', topRight: '', bottomLeft: '', bottomRight: '',
horizontal: '', vertical: ' ', cross: '',
},
};
export class TableFormatter {
private columns: TableColumn[];
private options: TableOptions;
private border: typeof borders.unicode;
constructor(options: TableOptions) {
this.options = options;
this.columns = options.columns;
this.border = borders[options.borderStyle || 'unicode'];
}
private calculateWidths(data: Record<string, any>[]): number[] {
return this.columns.map(col => {
const headerWidth = col.header.length;
const maxDataWidth = Math.max(
...data.map(row => String(row[col.key] ?? '').length)
);
return col.width || Math.max(headerWidth, maxDataWidth);
});
}
private padCell(text: string, width: number, align: 'left' | 'center' | 'right' = 'left'): string {
const padding = width - text.length;
if (align === 'center') {
const left = Math.floor(padding / 2);
const right = padding - left;
return ' '.repeat(left) + text + ' '.repeat(right);
}
if (align === 'right') {
return ' '.repeat(padding) + text;
}
return text + ' '.repeat(padding);
}
format(data: Record<string, any>[]): string {
const widths = this.calculateWidths(data);
const lines: string[] = [];
const b = this.border;
// Top border
if (b.top) {
lines.push(
b.topLeft +
widths.map(w => b.top.repeat(w + 2)).join(b.topMid || b.cross) +
b.topRight
);
}
// Header
const headerCells = this.columns.map((col, i) =>
' ' + this.padCell(col.header, widths[i], col.align) + ' '
);
const headerColor = this.options.headerColor || chalk.bold;
lines.push(
b.left +
headerCells.map(c => headerColor(c)).join(b.vertical) +
b.right
);
// Header separator
if (b.horizontal) {
lines.push(
(b.midLeft || b.left) +
widths.map(w => b.horizontal.repeat(w + 2)).join(b.cross) +
(b.midRight || b.right)
);
}
// Data rows
for (const row of data) {
const cells = this.columns.map((col, i) => {
const value = row[col.key] ?? '';
const formatted = col.format ? col.format(value) : String(value);
return ' ' + this.padCell(formatted, widths[i], col.align) + ' ';
});
lines.push(b.left + cells.join(b.vertical) + b.right);
}
// Bottom border
if (b.bottom) {
lines.push(
b.bottomLeft +
widths.map(w => b.bottom.repeat(w + 2)).join(b.bottomMid || b.cross) +
b.bottomRight
);
}
return lines.join('\n');
}
}
// Quick table function
export function table(
data: Record<string, any>[],
columns?: (string | TableColumn)[]
): string {
const cols: TableColumn[] = columns
? columns.map(c => typeof c === 'string' ? { key: c, header: c } : c)
: Object.keys(data[0] || {}).map(key => ({ key, header: key }));
return new TableFormatter({ columns: cols }).format(data);
}
Usage Examples
// Simple table
console.log(table([
{ name: 'Alice', age: 30, role: 'Admin' },
{ name: 'Bob', age: 25, role: 'User' },
]));
// Custom columns
const formatter = new TableFormatter({
columns: [
{ key: 'id', header: 'ID', width: 6, align: 'right' },
{ key: 'name', header: 'Name', width: 20 },
{ key: 'status', header: 'Status', format: (v) =>
v === 'active' ? chalk.green(v) : chalk.red(v)
},
],
borderStyle: 'unicode',
headerColor: chalk.cyan.bold,
});
console.log(formatter.format(data));
Dependencies
{
"dependencies": {
"chalk": "^5.0.0"
}
}
Target Processes
- cli-output-formatting
- dashboard-monitoring-tui
- cli-application-bootstrap