mirror of
https://github.com/seemueller-io/sumpin.git
synced 2025-09-08 22:56:46 +00:00
add code
This commit is contained in:
278
lib/components/output-formatter.ts
Normal file
278
lib/components/output-formatter.ts
Normal file
@@ -0,0 +1,278 @@
|
||||
export interface OutputOptions {
|
||||
format: 'typescript' | 'markdown' | 'json' | 'yaml';
|
||||
includeMetadata: boolean;
|
||||
includeTimestamp: boolean;
|
||||
includeComments: boolean;
|
||||
}
|
||||
|
||||
export interface FormattedOutput {
|
||||
content: string;
|
||||
filename: string;
|
||||
extension: string;
|
||||
metadata?: any;
|
||||
}
|
||||
|
||||
export class OutputFormatter {
|
||||
formatOutput(
|
||||
content: string,
|
||||
domain: string,
|
||||
version: 'v1' | 'v2',
|
||||
options: OutputOptions
|
||||
): FormattedOutput {
|
||||
switch (options.format) {
|
||||
case 'typescript':
|
||||
return this.formatTypeScript(content, domain, version, options);
|
||||
case 'markdown':
|
||||
return this.formatMarkdown(content, domain, version, options);
|
||||
case 'json':
|
||||
return this.formatJSON(content, domain, version, options);
|
||||
case 'yaml':
|
||||
return this.formatYAML(content, domain, version, options);
|
||||
default:
|
||||
throw new Error(`Unsupported format: ${options.format}`);
|
||||
}
|
||||
}
|
||||
|
||||
private formatTypeScript(
|
||||
content: string,
|
||||
domain: string,
|
||||
version: 'v1' | 'v2',
|
||||
options: OutputOptions
|
||||
): FormattedOutput {
|
||||
const header = options.includeComments ? `/**
|
||||
* ${domain} Professional Hierarchy Example
|
||||
* Generated using OpenAI Agents SDK and Sumpin Professional Hierarchy Models
|
||||
* Model Version: ${version} (${version === 'v1' ? '4-layer' : '6-layer'} hierarchy)
|
||||
* ${options.includeTimestamp ? `Generated on: ${new Date().toISOString()}` : ''}
|
||||
*/
|
||||
|
||||
` : '';
|
||||
|
||||
const imports = `import {
|
||||
Enterprise,
|
||||
${version === 'v1' ? 'DomainModel, SpecializationModel, RoleModel, ResponsibilityModel' : 'DomainModel, IndustryModel, ProfessionModel, FieldModel, RoleModel, TaskModel'}
|
||||
} from "../../lib/${version}";
|
||||
|
||||
`;
|
||||
|
||||
const cleanedContent = this.extractTypeScriptCode(content);
|
||||
|
||||
return {
|
||||
content: header + imports + cleanedContent,
|
||||
filename: `${domain.toLowerCase()}-hierarchy-example`,
|
||||
extension: 'ts',
|
||||
metadata: {
|
||||
domain,
|
||||
version,
|
||||
generatedAt: options.includeTimestamp ? new Date().toISOString() : undefined
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private extractTypeScriptCode(content: string): string {
|
||||
let cleaned = content;
|
||||
|
||||
cleaned = cleaned.replace(/^#{1,6}\s+.*$/gm, '');
|
||||
|
||||
cleaned = cleaned.replace(/\*\*([^*]+)\*\*/g, '$1');
|
||||
cleaned = cleaned.replace(/\*([^*]+)\*/g, '$1');
|
||||
|
||||
// Remove markdown lists that aren't TypeScript code
|
||||
cleaned = cleaned.replace(/^[\s]*[-*+]\s+\*\*([^*]+)\*\*$/gm, '');
|
||||
cleaned = cleaned.replace(/^[\s]*[-*+]\s+([^:]+):$/gm, '');
|
||||
|
||||
// Extract TypeScript code blocks
|
||||
const codeBlockRegex = /```typescript\s*([\s\S]*?)```/g;
|
||||
const codeBlocks = [];
|
||||
let match;
|
||||
|
||||
while ((match = codeBlockRegex.exec(content)) !== null) {
|
||||
codeBlocks.push(match[1].trim());
|
||||
}
|
||||
|
||||
// If we found code blocks, use them
|
||||
if (codeBlocks.length > 0) {
|
||||
return codeBlocks.join('\n\n');
|
||||
}
|
||||
|
||||
// Otherwise, try to extract TypeScript-like content
|
||||
const lines = cleaned.split('\n');
|
||||
const tsLines = [];
|
||||
let inCodeSection = false;
|
||||
|
||||
for (const line of lines) {
|
||||
const trimmed = line.trim();
|
||||
|
||||
// Skip empty lines and markdown-like content
|
||||
if (!trimmed ||
|
||||
trimmed.startsWith('#') ||
|
||||
trimmed.startsWith('*') ||
|
||||
trimmed.startsWith('-') ||
|
||||
trimmed.includes('Below is') ||
|
||||
trimmed.includes('Here\'s') ||
|
||||
trimmed.includes('TypeScript Code') ||
|
||||
trimmed.includes('Professional Hierarchy')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Look for TypeScript patterns
|
||||
if (trimmed.includes('interface ') ||
|
||||
trimmed.includes('class ') ||
|
||||
trimmed.includes('type ') ||
|
||||
trimmed.includes('const ') ||
|
||||
trimmed.includes('let ') ||
|
||||
trimmed.includes('var ') ||
|
||||
trimmed.includes('function ') ||
|
||||
trimmed.includes('export ') ||
|
||||
trimmed.includes('import ') ||
|
||||
trimmed.includes('{') ||
|
||||
trimmed.includes('}') ||
|
||||
trimmed.includes(';') ||
|
||||
inCodeSection) {
|
||||
|
||||
tsLines.push(line);
|
||||
inCodeSection = true;
|
||||
|
||||
// End code section on certain patterns
|
||||
if (trimmed === '}' && !line.includes(',')) {
|
||||
inCodeSection = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tsLines.join('\n').trim() || cleaned.trim();
|
||||
}
|
||||
|
||||
private formatMarkdown(
|
||||
content: string,
|
||||
domain: string,
|
||||
version: 'v1' | 'v2',
|
||||
options: OutputOptions
|
||||
): FormattedOutput {
|
||||
const header = `# ${domain.charAt(0).toUpperCase() + domain.slice(1)} Professional Hierarchy Example
|
||||
|
||||
Generated using OpenAI Agents SDK and Sumpin Professional Hierarchy Models
|
||||
|
||||
## Overview
|
||||
|
||||
This example demonstrates a ${version} professional hierarchy model for the ${domain} domain.
|
||||
|
||||
**Model Version:** ${version} (${version === 'v1' ? '4-layer' : '6-layer'} hierarchy)
|
||||
${options.includeTimestamp ? `**Generated on:** ${new Date().toISOString()}` : ''}
|
||||
|
||||
## Structure
|
||||
|
||||
${version === 'v1' ? 'Domain → Specialization → Role → Responsibility' : 'Domain → Industry → Profession → Field → Role → Task'}
|
||||
|
||||
## Generated Content
|
||||
|
||||
\`\`\`typescript
|
||||
${content}
|
||||
\`\`\`
|
||||
|
||||
## Usage
|
||||
|
||||
To use this example:
|
||||
|
||||
1. Ensure you have the required dependencies installed:
|
||||
\`\`\`bash
|
||||
bun add mobx-state-tree mobx uuid
|
||||
bun add -d @types/uuid
|
||||
\`\`\`
|
||||
|
||||
2. Run the example:
|
||||
\`\`\`bash
|
||||
bun run examples/generated/${domain.toLowerCase()}-hierarchy-example.ts
|
||||
\`\`\`
|
||||
|
||||
---
|
||||
*This example was generated automatically and demonstrates best practices for professional hierarchy modeling.*
|
||||
`;
|
||||
|
||||
return {
|
||||
content: header,
|
||||
filename: `${domain.toLowerCase()}-hierarchy-example`,
|
||||
extension: 'md',
|
||||
metadata: {
|
||||
domain,
|
||||
version,
|
||||
generatedAt: options.includeTimestamp ? new Date().toISOString() : undefined
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private formatJSON(
|
||||
content: string,
|
||||
domain: string,
|
||||
version: 'v1' | 'v2',
|
||||
options: OutputOptions
|
||||
): FormattedOutput {
|
||||
const data = {
|
||||
domain,
|
||||
version,
|
||||
structure: version === 'v1'
|
||||
? ['Domain', 'Specialization', 'Role', 'Responsibility']
|
||||
: ['Domain', 'Industry', 'Profession', 'Field', 'Role', 'Task'],
|
||||
generatedContent: content,
|
||||
...(options.includeMetadata && {
|
||||
metadata: {
|
||||
generatedAt: options.includeTimestamp ? new Date().toISOString() : undefined,
|
||||
generator: 'OpenAI Agents SDK + Sumpin',
|
||||
hierarchyType: `${version === 'v1' ? '4' : '6'}-layer hierarchy`
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
return {
|
||||
content: JSON.stringify(data, null, 2),
|
||||
filename: `${domain.toLowerCase()}-hierarchy-example`,
|
||||
extension: 'json',
|
||||
metadata: data.metadata
|
||||
};
|
||||
}
|
||||
|
||||
private formatYAML(
|
||||
content: string,
|
||||
domain: string,
|
||||
version: 'v1' | 'v2',
|
||||
options: OutputOptions
|
||||
): FormattedOutput {
|
||||
const yamlContent = `domain: ${domain}
|
||||
version: ${version}
|
||||
structure:
|
||||
${(version === 'v1'
|
||||
? ['Domain', 'Specialization', 'Role', 'Responsibility']
|
||||
: ['Domain', 'Industry', 'Profession', 'Field', 'Role', 'Task']
|
||||
).map(item => ` - ${item}`).join('\n')}
|
||||
|
||||
generated_content: |
|
||||
${content.split('\n').map(line => ` ${line}`).join('\n')}
|
||||
|
||||
${options.includeMetadata ? `metadata:
|
||||
generated_at: ${options.includeTimestamp ? new Date().toISOString() : 'null'}
|
||||
generator: "OpenAI Agents SDK + Sumpin"
|
||||
hierarchy_type: "${version === 'v1' ? '4' : '6'}-layer hierarchy"` : ''}`;
|
||||
|
||||
return {
|
||||
content: yamlContent,
|
||||
filename: `${domain.toLowerCase()}-hierarchy-example`,
|
||||
extension: 'yaml',
|
||||
metadata: {
|
||||
domain,
|
||||
version,
|
||||
generatedAt: options.includeTimestamp ? new Date().toISOString() : undefined
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
getDefaultOptions(): OutputOptions {
|
||||
return {
|
||||
format: 'typescript',
|
||||
includeMetadata: true,
|
||||
includeTimestamp: true,
|
||||
includeComments: true
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export default OutputFormatter;
|
Reference in New Issue
Block a user