Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate table formatters for structured CLI output with column alignment, borders, and responsive sizing.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 61% | 0% |
Generate table formatters for structured CLI output.
Invoke this skill when you need to:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | language | string | Yes | Target language | | style | string | No | Border style (simple, unicode, markdown) | | features | array | No | Required features |
typescriptimport 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); }
typescript// 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));
json{ "dependencies": { "chalk": "^5.0.0" } }
Other measured skills in the registry, with their headline benchmark lift.