claude-statusline-powerline
Version:
Beautiful powerline-style statusline for Claude Code with git integration, session tracking, and cost monitoring
227 lines • 9.89 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const node_child_process_1 = require("node:child_process");
const fs = __importStar(require("node:fs"));
const font_profiles_1 = require("../font-profiles");
const themes_1 = require("../themes");
function generate_schema() {
// Generate base schema using typescript-json-schema
console.log('🔧 Generating base schema from TypeScript interfaces...');
(0, node_child_process_1.execSync)('npx typescript-json-schema src/types.ts StatuslineConfig --out statusline.schema.generated.json --required', {
stdio: 'inherit',
});
// Load the generated schema
const generated_schema = JSON.parse(fs.readFileSync('statusline.schema.generated.json', 'utf8'));
// Enhance with metadata, descriptions, and constraints
const enhanced_schema = {
$schema: 'http://json-schema.org/draft-07/schema#',
$id: 'https://raw.githubusercontent.com/spences10/claude-statusline-powerline/main/statusline.schema.json',
title: 'Claude Statusline Powerline Configuration',
description: 'Configuration schema for Claude Code statusline with powerline symbols, git integration, and session tracking',
...generated_schema,
// Add missing properties
properties: {
$schema: {
type: 'string',
description: 'JSON Schema reference for IntelliSense support',
},
...generated_schema.properties,
},
};
// Add descriptions to main properties
if (enhanced_schema.properties) {
if (enhanced_schema.properties.separators) {
enhanced_schema.properties.separators.description =
'Configure separator styles for different segments and states';
}
if (enhanced_schema.properties.segments) {
enhanced_schema.properties.segments.description =
'Control which segments are visible in the statusline';
}
if (enhanced_schema.properties.color_theme) {
enhanced_schema.properties.color_theme.description =
'Color theme for segment backgrounds and text';
enhanced_schema.properties.color_theme.enum =
Object.keys(themes_1.THEMES);
enhanced_schema.properties.color_theme.default = 'dark';
}
if (enhanced_schema.properties.font_profile) {
enhanced_schema.properties.font_profile.description =
'Font compatibility profile determining available separator symbols';
enhanced_schema.properties.font_profile.enum =
Object.keys(font_profiles_1.FONT_PROFILES);
enhanced_schema.properties.font_profile.default = 'powerline';
}
if (enhanced_schema.properties.segment_config) {
enhanced_schema.properties.segment_config.description =
'Advanced segment configuration with multiline layout, styling, and granular control';
}
if (enhanced_schema.properties.current_theme) {
enhanced_schema.properties.current_theme.description =
'Internal property populated with actual theme object - not for user configuration';
}
}
if (enhanced_schema.definitions?.SegmentStyleConfig) {
const style_config = enhanced_schema.definitions.SegmentStyleConfig;
if (style_config.properties?.bg_color) {
style_config.properties.bg_color.pattern = '^#[0-9a-fA-F]{6}$';
style_config.properties.bg_color.description =
'Background color in hex format (e.g., #1e40af)';
style_config.properties.bg_color.examples = [
'#1e40af',
'#059669',
'#dc2626',
];
}
if (style_config.properties?.fg_color) {
style_config.properties.fg_color.pattern = '^#[0-9a-fA-F]{6}$';
style_config.properties.fg_color.description =
'Foreground (text) color in hex format (e.g., #ffffff)';
style_config.properties.fg_color.examples = [
'#ffffff',
'#000000',
];
}
if (style_config.properties?.separator?.properties?.color) {
style_config.properties.separator.properties.color.pattern =
'^#[0-9a-fA-F]{6}$';
style_config.properties.separator.properties.color.description =
'Separator color in hex format';
style_config.properties.separator.properties.color.examples = [
'#1e40af',
'#059669',
];
}
if (style_config.properties?.icons) {
style_config.properties.icons.description =
'Custom icons for segment symbols';
style_config.properties.icons.additionalProperties = {
type: 'string',
description: 'Additional custom icon mappings',
};
if (!style_config.properties.icons.properties) {
style_config.properties.icons.properties = {};
}
style_config.properties.icons.properties.folder = {
type: 'string',
description: 'Directory/folder icon',
examples: ['📁', '🗂️', '📂', '\\uF07B'],
};
style_config.properties.icons.properties.branch = {
type: 'string',
description: 'Git branch icon',
examples: ['\\uE0A0', '🌿', '🌳', '\\uF126'],
};
style_config.properties.icons.properties.clean = {
type: 'string',
description: 'Clean git status icon',
examples: ['✓', '✅', '\\u2713', '\\uF00C'],
};
style_config.properties.icons.properties.dirty = {
type: 'string',
description: 'Dirty git status icon',
examples: ['±', '⚠️', '\\u00B1', '\\uF071'],
};
style_config.properties.icons.properties.ai = {
type: 'string',
description: 'AI/Model icon',
examples: ['⚡', '🤖', '🧠', '\\uE007'],
};
style_config.properties.icons.properties.cost = {
type: 'string',
description: 'Session cost/usage icon',
examples: ['💰', '💲', '🪙', '\\uF0D6'],
};
}
}
// Add descriptions to definitions
if (enhanced_schema.definitions?.SeparatorStyle) {
enhanced_schema.definitions.SeparatorStyle.description =
'Visual style of powerline separators between segments';
}
// Add additionalProperties: false to key objects (optional - makes schema stricter)
enhanced_schema.additionalProperties = false;
// Add examples
enhanced_schema.examples = [
{
color_theme: 'dark',
segment_config: {
segments: [
{ type: 'model' },
{ type: 'directory' },
{ type: 'git' },
{ type: 'session' },
],
},
},
{
color_theme: 'electric',
segment_config: {
lines: [
{
directory: true,
git: true,
model: true,
},
{
session: true,
context: true,
},
],
segments: [
{ type: 'model' },
{ type: 'directory' },
{ type: 'git' },
{ type: 'session' },
{ type: 'context' },
],
},
},
];
// Remove the old required constraint that makes all top-level properties required
// Most config properties should be optional
delete enhanced_schema.required;
// Write the enhanced schema
fs.writeFileSync('statusline.schema.json', JSON.stringify(enhanced_schema, null, 2));
// Clean up temporary file
fs.unlinkSync('statusline.schema.generated.json');
console.log('✅ Enhanced schema generated successfully!');
console.log('📍 Schema written to statusline.schema.json');
}
if (require.main === module) {
generate_schema();
}
//# sourceMappingURL=generate-schema.js.map