adpa-enterprise-framework-automation
Version:
Modular, standards-compliant Node.js/TypeScript automation framework for enterprise requirements, project, and data management. Provides CLI and API for BABOK v3, PMBOK 7th Edition, and DMBOK 2.0 (in progress). Production-ready Express.js API with TypeSpe
358 lines (352 loc) ⢠16.1 kB
JavaScript
/**
* CLI Integration for Advanced Template Engine
*
* This demonstrates how to integrate the revolutionary database-backed
* template system with your existing CLI while preserving all functionality.
*
* @version 3.0.0
* @author Requirements Gathering Agent Team
* @created June 2025
*/
import { TemplateEngineFactory } from './AdvancedTemplateEngine.js';
import { TemplateMigrationManager } from './TemplateMigrationStrategy.js';
/**
* Enhanced CLI Template Commands
*
* Add these functions to your existing CLI to support both static and dynamic templates
*/
/**
* Enhanced showAvailableTemplates that combines static and dynamic templates
*/
export async function showAvailableTemplatesEnhanced() {
console.log('š Available Document Templates (Enhanced)\n');
try {
// Create template engine
const templateEngine = await TemplateEngineFactory.createWithDatabase({});
// Load all templates (both migrated static and new dynamic ones)
const templates = await templateEngine.loadAllTemplates();
if (templates.length === 0) {
console.log('ā ļø No templates found. Running migration...');
const migrationManager = new TemplateMigrationManager(templateEngine);
await migrationManager.migrateStaticTemplates();
const migratedTemplates = await templateEngine.loadAllTemplates();
console.log(`ā
Migrated ${migratedTemplates.length} templates\n`);
}
// Group templates by category
const templatesByCategory = templates.reduce((acc, template) => {
if (!acc[template.category]) {
acc[template.category] = [];
}
acc[template.category].push(template);
return acc;
}, {});
console.log(`š DYNAMIC TEMPLATES: ${Object.keys(templatesByCategory).length} categories with ${templates.length} total templates:\n`);
for (const [category, categoryTemplates] of Object.entries(templatesByCategory)) {
// Convert category slug to display name
const displayCategory = category
.split('-')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
console.log(`${displayCategory} (${categoryTemplates.length} templates):`);
for (const template of categoryTemplates) {
const emoji = getCategoryEmoji(category);
console.log(` ${emoji} ${template.name}`);
console.log(` ID: ${template.id}`);
console.log(` Version: ${template.version}`);
console.log(` Context Points: ${template.contextInjectionPoints.length}`);
console.log(` Variables: ${template.variables.length}`);
console.log(` Generate: node dist/cli.js --generate-advanced ${template.id}`);
console.log('');
}
}
console.log('š REVOLUTIONARY FEATURES:');
console.log(' ⢠Dynamic context injection from related documents');
console.log(' ⢠AI-powered context summarization and optimization');
console.log(' ⢠Cross-document relationship analysis');
console.log(' ⢠Template variables for customization');
console.log(' ⢠Conditional logic for smart adaptation');
console.log(' ⢠Quality checks and validation');
console.log('\nš” Enhanced Usage Examples:');
console.log(' # Generate with enhanced context injection:');
console.log(' node dist/cli.js --generate-advanced stakeholder-register');
console.log(' node dist/cli.js --generate-advanced apidocumentation');
console.log('\n # Generate with custom variables:');
console.log(' node dist/cli.js --generate-advanced stakeholder-register \\');
console.log(' --var PROJECT_NAME="My Project" \\');
console.log(' --var ORGANIZATION_NAME="My Company"');
console.log('\n # Migrate static templates to dynamic:');
console.log(' node dist/cli.js --migrate-templates');
console.log('\n # Template management:');
console.log(' node dist/cli.js --template-info stakeholder-register');
console.log(' node dist/cli.js --template-validate apidocumentation');
}
catch (error) {
console.error('ā Error loading enhanced templates:', error);
console.log('\nš§ Falling back to static templates...');
// Fall back to your existing showAvailableTemplates function
}
}
/**
* Generate document using advanced template engine
*/
export async function generateDocumentAdvanced(templateId, options = {}) {
try {
if (!options.quiet) {
console.log(`š Generating document with advanced context injection: ${templateId}...`);
}
// Create template engine
const templateEngine = await TemplateEngineFactory.createWithDatabase({});
// Load template
const template = await templateEngine.loadTemplate(templateId);
if (!template) {
throw new Error(`Template not found: ${templateId}`);
}
if (!options.quiet) {
console.log(`š Template: ${template.name}`);
console.log(`š Category: ${template.category}`);
console.log(`š Context Points: ${template.contextInjectionPoints.length}`);
console.log(`āļø Variables: ${template.variables.length}`);
}
// Read project context (use your existing context reading logic)
const { readEnhancedProjectContext } = await import('../fileManager.js');
const baseContext = await readEnhancedProjectContext(process.cwd());
// Merge default variables with provided ones
const defaultVariables = {
PROJECT_NAME: 'Current Project',
ORGANIZATION_NAME: 'Organization',
PROJECT_MANAGER: 'Project Manager',
DOCUMENT_VERSION: '1.0',
GENERATION_DATE: new Date().toISOString().split('T')[0]
};
const variables = { ...defaultVariables, ...(options.variables || {}) };
if (!options.quiet) {
console.log('š§ Building enhanced context with dependency resolution...');
}
// Generate document with enhanced context injection
const generatedContent = await templateEngine.generateDocument(templateId, baseContext, variables);
// Save the document (use your existing file management logic)
const { writeFile, mkdir } = await import('fs/promises');
const { join, dirname } = await import('path');
const outputDir = options.outputDir || 'generated-documents';
const categoryDir = join(outputDir, template.category);
const filePath = join(categoryDir, `${templateId}.md`);
// Ensure directory exists
await mkdir(dirname(filePath), { recursive: true });
// Write the file
await writeFile(filePath, generatedContent, 'utf-8');
if (!options.quiet) {
console.log(`ā
Generated: ${template.name}`);
console.log(`š Saved to: ${outputDir}/${template.category}/${templateId}.md`);
console.log(`š Length: ${generatedContent.length} characters`);
console.log(`šÆ Enhanced with context from ${template.contextInjectionPoints.length} injection points`);
}
}
catch (error) {
console.error(`ā Error generating document: ${templateId}`, error);
throw error;
}
}
/**
* Show detailed information about a specific template
*/
export async function showTemplateInfo(templateId) {
try {
const templateEngine = await TemplateEngineFactory.createWithDatabase({});
const template = await templateEngine.loadTemplate(templateId);
if (!template) {
console.error(`ā Template not found: ${templateId}`);
return;
}
console.log(`š Template Information: ${template.name}\n`);
console.log('š BASIC INFO:');
console.log(` ID: ${template.id}`);
console.log(` Name: ${template.name}`);
console.log(` Category: ${template.category}`);
console.log(` Version: ${template.version}`);
console.log(` Active: ${template.isActive ? 'ā
' : 'ā'}`);
console.log(` Created: ${template.createdAt.toLocaleDateString()}`);
console.log(` Updated: ${template.updatedAt.toLocaleDateString()}`);
console.log('\nš§ AI CONFIGURATION:');
console.log(` Max Tokens: ${template.maxTokens}`);
console.log(` Temperature: ${template.temperature}`);
console.log(` Preferred Models: ${template.modelPreferences.join(', ')}`);
console.log('\nš CONTEXT INJECTION POINTS:');
for (const [index, point] of template.contextInjectionPoints.entries()) {
console.log(` ${index + 1}. ${point.placeholder}`);
console.log(` Dependencies: ${point.dependencies.length}`);
console.log(` Strategy: ${point.aggregationStrategy}`);
console.log(` Max Length: ${point.maxLength || 'unlimited'}`);
for (const dep of point.dependencies) {
const requiredText = dep.required ? '(required)' : '(optional)';
console.log(` - ${dep.documentKey} ${requiredText} (weight: ${dep.weight})`);
}
}
console.log('\nāļø VARIABLES:');
for (const variable of template.variables) {
const requiredText = variable.required ? '(required)' : '(optional)';
console.log(` ⢠${variable.name}: ${variable.type} ${requiredText}`);
console.log(` Default: ${variable.defaultValue || 'none'}`);
console.log(` Description: ${variable.description}`);
}
console.log('\nš CONDITIONAL LOGIC:');
if (template.conditionalLogic.length > 0) {
for (const rule of template.conditionalLogic) {
console.log(` ⢠IF ${rule.condition} THEN ${rule.action} ${rule.target}`);
}
}
else {
console.log(' No conditional logic defined');
}
console.log('\nā
QUALITY CHECKS:');
for (const check of template.qualityChecks) {
console.log(` ⢠${check.name} (${check.type}) - Weight: ${check.weight}`);
}
}
catch (error) {
console.error('ā Error showing template info:', error);
}
}
/**
* Migrate static templates to dynamic format
*/
export async function migrateStaticTemplates(options = {}) {
try {
console.log('š Starting template migration from static to dynamic format...');
const templateEngine = await TemplateEngineFactory.createWithDatabase({});
const migrationManager = new TemplateMigrationManager(templateEngine);
// Check if templates already exist
const existingTemplates = await templateEngine.loadAllTemplates();
if (existingTemplates.length > 0 && !options.force) {
console.log(`ā ļø Found ${existingTemplates.length} existing templates.`);
console.log('Use --force to re-migrate and overwrite existing templates.');
return;
}
await migrationManager.migrateStaticTemplates();
const migratedTemplates = await templateEngine.loadAllTemplates();
console.log(`\nš Migration completed successfully!`);
console.log(`š Templates migrated: ${migratedTemplates.length}`);
console.log(`š Categories: ${new Set(migratedTemplates.map(t => t.category)).size}`);
console.log(`š Context injection points: ${migratedTemplates.reduce((sum, t) => sum + t.contextInjectionPoints.length, 0)}`);
console.log('\n⨠REVOLUTIONARY FEATURES NOW AVAILABLE:');
console.log(' ⢠Dynamic context building with dependency resolution');
console.log(' ⢠AI-powered context summarization for large contexts');
console.log(' ⢠Cross-document relationship analysis');
console.log(' ⢠Template variables for customization');
console.log(' ⢠Conditional logic for smart adaptation');
console.log(' ⢠Quality checks and validation');
console.log(' ⢠Template versioning and evolution tracking');
console.log('\nš” Next Steps:');
console.log(' 1. Run: node dist/cli.js --list-templates (to see migrated templates)');
console.log(' 2. Run: node dist/cli.js --generate-advanced <template-id>');
console.log(' 3. Use: --template-info <template-id> to explore features');
}
catch (error) {
console.error('ā Error migrating templates:', error);
}
}
/**
* Parse variables from command line arguments
*/
export function parseVariablesFromArgs(args) {
const variables = {};
for (let i = 0; i < args.length; i++) {
if (args[i] === '--var' && i + 1 < args.length) {
const varAssignment = args[i + 1];
const [key, ...valueParts] = varAssignment.split('=');
const value = valueParts.join('=');
// Try to parse as JSON, fallback to string
try {
variables[key] = JSON.parse(value);
}
catch {
variables[key] = value;
}
i++; // Skip the next argument since we've processed it
}
}
return variables;
}
/**
* Get emoji for category
*/
function getCategoryEmoji(category) {
const emojis = {
'stakeholder-management': 'š„',
'technical-design': 'āļø',
'quality-assurance': 'ā
',
'project-charter': 'š',
'management-plans': 'š',
'planning': 'šļø',
'scope-management': 'šÆ',
'risk-management': 'ā ļø',
'strategic-statements': 'šÆ',
'technical-analysis': 'š§',
'implementation-guides': 'š',
'pmbok': 'š',
'requirements': 'š',
'basic-docs': 'š'
};
return emojis[category] || 'š';
}
/**
* Integration functions for existing CLI
*/
export const CLI_INTEGRATION = {
/**
* Add these command handlers to your main CLI function
*/
commandHandlers: {
'--list-templates': showAvailableTemplatesEnhanced,
'--generate-advanced': generateDocumentAdvanced,
'--template-info': showTemplateInfo,
'--migrate-templates': migrateStaticTemplates
},
/**
* Add these argument parsers
*/
argumentParsers: {
parseVariables: parseVariablesFromArgs
},
/**
* Example integration in main CLI function
*/
exampleIntegration: `
// In your main() function, add these handlers:
// Enhanced template listing
if (args.includes('--list-templates') || args.includes('--templates')) {
await showAvailableTemplatesEnhanced();
return;
}
// Advanced document generation
if (args.includes('--generate-advanced')) {
const idx = args.indexOf('--generate-advanced');
const templateId = args[idx + 1];
if (!templateId) {
console.error('ā Missing template ID for --generate-advanced');
return;
}
const variables = parseVariablesFromArgs(args);
await generateDocumentAdvanced(templateId, { variables, quiet: options.quiet });
return;
}
// Template information
if (args.includes('--template-info')) {
const idx = args.indexOf('--template-info');
const templateId = args[idx + 1];
if (!templateId) {
console.error('ā Missing template ID for --template-info');
return;
}
await showTemplateInfo(templateId);
return;
}
// Template migration
if (args.includes('--migrate-templates')) {
const force = args.includes('--force');
await migrateStaticTemplates({ force });
return;
}
`
};
export default CLI_INTEGRATION;
//# sourceMappingURL=CLIIntegration.js.map