UNPKG

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

427 lines • 19.4 kB
/** * Confluence Integration CLI Commands * Part of ADPA (Automated Document Processing Assistant) v2.1.3 * * Provides CLI interface for Confluence integration features */ import { createConfluencePublisher, validateConfluenceConfig } from './ConfluencePublisher.js'; import { createConfluenceConfigManager } from './ConfluenceConfigManager.js'; import { ConfluenceOAuth2 } from './ConfluenceOAuth2.js'; import { existsSync } from 'fs'; import { join } from 'path'; /** * Start OAuth2 authentication flow */ export async function confluenceOAuth2Login() { console.log('šŸ” Starting Confluence OAuth2 Authentication...\n'); try { const configManager = createConfluenceConfigManager(); const config = configManager.getConfluenceConfig(); if (config.authMethod !== 'oauth2') { console.error('āŒ OAuth2 authentication is not configured'); console.log(' Set CONFLUENCE_OAUTH2_CLIENT_ID in your .env file to enable OAuth2'); console.log(' Or update your config-rga.json to use authMethod: "oauth2"'); return; } const publisher = createConfluencePublisher(config); console.log('🌐 Starting OAuth2 authorization flow...'); console.log(' Your browser will open automatically'); console.log(' Complete the authorization in your browser'); console.log(' This process may take up to 60 seconds'); const result = await publisher.startOAuth2Login(); if (result.success) { console.log('āœ… OAuth2 Authentication Successful!'); console.log(' Access token obtained and stored securely'); console.log(' You can now use Confluence integration features'); } else { console.error('āŒ OAuth2 Authentication Failed:'); console.error(` ${result.error}`); console.log('\nšŸ”§ Troubleshooting:'); console.log(' 1. Check your OAuth2 app credentials in .env file'); console.log(' 2. Verify the redirect URI matches your app configuration'); console.log(' 3. Ensure your app has the required Confluence scopes'); } } catch (error) { console.error('āŒ Unexpected Error:', error.message); } } /** * Check Confluence OAuth2 authentication status */ export async function confluenceOAuth2Status() { console.log('šŸ” Checking Confluence OAuth2 Status...\n'); try { const configManager = createConfluenceConfigManager(); const config = configManager.getConfluenceConfig(); if (config.authMethod !== 'oauth2') { console.log('āŒ OAuth2 not configured - using API token authentication'); return; } const publisher = createConfluencePublisher(config); const isAuthorized = publisher.isOAuth2Authorized(); if (isAuthorized) { console.log('āœ… OAuth2 Authentication Status: Authorized'); // Test the connection to verify tokens work const connectionResult = await publisher.testConnection(); if (connectionResult.success) { console.log('āœ… Connection Test: Successful'); console.log(` User: ${connectionResult.userInfo.displayName}`); console.log(` Cloud ID: ${connectionResult.cloudId}`); } else { console.log('āš ļø Connection Test: Failed (tokens may need refresh)'); console.log(' Try running: npm run confluence:oauth2:login'); } } else { console.log('āŒ OAuth2 Authentication Status: Not Authorized'); console.log(' Run: npm run confluence:oauth2:login'); } } catch (error) { console.error('āŒ Unexpected Error:', error.message); } } /** * Test Confluence connection and authentication */ export async function testConfluenceConnection() { console.log('šŸ”— Testing Confluence Connection...\n'); try { const configManager = createConfluenceConfigManager(); const config = configManager.getConfluenceConfig(); // Validate configuration const validation = configManager.validateConfiguration(); if (!validation.valid) { console.error('āŒ Configuration Error:'); validation.errors.forEach(error => console.error(` • ${error}`)); if (validation.warnings.length > 0) { console.warn('\nāš ļø Warnings:'); validation.warnings.forEach(warning => console.warn(` • ${warning}`)); } console.log('\nšŸ“‹ Environment Setup Instructions:'); console.log(configManager.getEnvironmentSetupInstructions()); return; } // Test connection const publisher = createConfluencePublisher(config); const connectionResult = await publisher.testConnection(); if (connectionResult.success) { console.log('āœ… Connection Successful!'); console.log(` User: ${connectionResult.userInfo.displayName}`); console.log(` Email: ${connectionResult.userInfo.email}`); console.log(` Account ID: ${connectionResult.userInfo.accountId}`); // Test space access const space = await publisher.getSpace(); if (space) { console.log(`\nšŸ“ Space Access Verified:`); console.log(` Space: ${space.name} (${space.key})`); console.log(` Description: ${space.description?.plain?.value || 'No description'}`); console.log(` Homepage: ${space.homepage?.title || 'No homepage'}`); } else { console.warn(`\nāš ļø Space '${config.spaceKey}' not found or no access`); } // Get publishing statistics try { const stats = await publisher.getPublishingStats(); console.log(`\nšŸ“Š Publishing Statistics:`); console.log(` Total Pages: ${stats.totalPages}`); console.log(` Last Updated: ${new Date(stats.lastUpdated).toLocaleString()}`); } catch (error) { console.warn(' Unable to retrieve publishing statistics'); } } else { console.error('āŒ Connection Failed:'); console.error(` ${connectionResult.error}`); // Provide troubleshooting tips console.log('\nšŸ”§ Troubleshooting Tips:'); console.log(' 1. Verify your API token is correct and active'); console.log(' 2. Check that your email matches your Atlassian account'); console.log(' 3. Ensure your base URL is correct (https://your-domain.atlassian.net)'); console.log(' 4. Verify you have access to the specified Confluence space'); } } catch (error) { console.error('āŒ Unexpected Error:', error.message); } } /** * Initialize Confluence configuration */ export async function initConfluenceConfig() { console.log('āš™ļø Initializing Confluence Configuration...\n'); try { const configManager = createConfluenceConfigManager(); const result = await configManager.initializeConfiguration(); if (result.success) { console.log('āœ… Configuration Initialized Successfully!'); console.log(` Configuration file: ${result.configPath}`); console.log(` ${result.message}`); // Show current status const status = configManager.getConfigurationStatus(); console.log('\nšŸ“‹ Configuration Status:'); console.log(` Configured: ${status.configured ? 'āœ…' : 'āŒ'}`); console.log(` Valid: ${status.valid ? 'āœ…' : 'āŒ'}`); if (status.errors.length > 0) { console.log('\nāŒ Errors to fix:'); status.errors.forEach(error => console.log(` • ${error}`)); } if (status.warnings.length > 0) { console.log('\nāš ļø Warnings:'); status.warnings.forEach(warning => console.log(` • ${warning}`)); } // Environment variables status console.log('\nšŸ” Environment Variables:'); if (status.envVarsSet.length > 0) { console.log(' Set:'); status.envVarsSet.forEach(envVar => console.log(` āœ… ${envVar}`)); } if (status.envVarsMissing.length > 0) { console.log(' Missing:'); status.envVarsMissing.forEach(envVar => console.log(` āŒ ${envVar}`)); } console.log('\nšŸ“‹ Next Steps:'); console.log(' 1. Update config-rga.json with your Confluence details'); console.log(' 2. Set required environment variables (especially API token)'); console.log(' 3. Run "npm run confluence:test" to verify connection'); } else { console.error('āŒ Configuration Initialization Failed:'); console.error(` ${result.message}`); } } catch (error) { console.error('āŒ Unexpected Error:', error.message); } } /** * Publish generated documents to Confluence */ export async function publishToConfluence(documentsPath, options = {}) { console.log('šŸ“¤ Publishing Documents to Confluence...\n'); try { const configManager = createConfluenceConfigManager(); const config = configManager.getConfluenceConfig(); // Validate configuration const validation = configManager.validateConfiguration(); if (!validation.valid) { console.error('āŒ Configuration Error - cannot publish'); validation.errors.forEach(error => console.error(` • ${error}`)); return; } // Determine documents path const docsPath = documentsPath || join(process.cwd(), 'generated-documents'); if (!existsSync(docsPath)) { console.error(`āŒ Documents path does not exist: ${docsPath}`); return; } console.log(`šŸ“ Publishing from: ${docsPath}`); // Show configuration console.log(`šŸŽÆ Target Space: ${config.spaceKey}`); console.log(`🌐 Confluence URL: ${config.baseUrl}`); if (options.parentPageTitle) { console.log(`šŸ“„ Parent Page: ${options.parentPageTitle}`); } if (options.dryRun) { console.log('šŸ” DRY RUN MODE - No changes will be made\n'); } // Create publisher const publisher = createConfluencePublisher(config); // Test connection first const connectionTest = await publisher.testConnection(); if (!connectionTest.success) { console.error('āŒ Connection test failed - cannot publish'); console.error(` ${connectionTest.error}`); return; } console.log('āœ… Connection verified, starting publication...\n'); if (options.dryRun) { console.log('šŸ“„ Documents that would be published:'); const fs = require('fs'); const files = fs.readdirSync(docsPath).filter((file) => file.endsWith('.md')); files.forEach((file) => { const title = file.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()); console.log(` • ${title} (${file})`); }); return; } // Publish documents const publishingOptions = { parentPageTitle: options.parentPageTitle, labelPrefix: options.labelPrefix || 'adpa', includeMetadata: true }; const results = await publisher.publishDocuments(docsPath, publishingOptions); // Show results console.log('\nšŸ“Š Publication Results:'); console.log(` Total Documents: ${results.length}`); const successful = results.filter(r => r.success); const failed = results.filter(r => !r.success); console.log(` Successful: ${successful.length} āœ…`); console.log(` Failed: ${failed.length} āŒ`); if (successful.length > 0) { console.log('\nāœ… Successfully Published:'); successful.forEach(result => { console.log(` • ${result.title}`); if (result.pageUrl) { console.log(` URL: ${result.pageUrl}`); } }); } if (failed.length > 0) { console.log('\nāŒ Publication Failures:'); failed.forEach(result => { console.log(` • ${result.title}: ${result.error}`); }); } console.log('\nšŸŽ‰ Publication complete!'); } catch (error) { console.error('āŒ Publication Error:', error.message); } } /** * Show Confluence configuration status */ export async function showConfluenceStatus() { console.log('šŸ“‹ Confluence Integration Status\n'); try { const configManager = createConfluenceConfigManager(); const status = configManager.getConfigurationStatus(); console.log('āš™ļø Configuration:'); console.log(` File Exists: ${status.configured ? 'āœ…' : 'āŒ'}`); console.log(` Valid Config: ${status.valid ? 'āœ…' : 'āŒ'}`); if (status.errors.length > 0) { console.log('\nāŒ Configuration Errors:'); status.errors.forEach(error => console.log(` • ${error}`)); } if (status.warnings.length > 0) { console.log('\nāš ļø Configuration Warnings:'); status.warnings.forEach(warning => console.log(` • ${warning}`)); } console.log('\nšŸ” Environment Variables:'); if (status.envVarsSet.length > 0) { console.log(' Set:'); status.envVarsSet.forEach(envVar => console.log(` āœ… ${envVar}`)); } if (status.envVarsMissing.length > 0) { console.log(' Missing:'); status.envVarsMissing.forEach(envVar => console.log(` āŒ ${envVar}`)); } // Test connection if configuration is valid if (status.valid) { console.log('\nšŸ”— Connection Test:'); const config = configManager.getConfluenceConfig(); const publisher = createConfluencePublisher(config); try { const connectionResult = await publisher.testConnection(); if (connectionResult.success) { console.log(' Status: āœ… Connected'); console.log(` User: ${connectionResult.userInfo.displayName}`); } else { console.log(' Status: āŒ Connection Failed'); console.log(` Error: ${connectionResult.error}`); } } catch (error) { console.log(' Status: āŒ Connection Error'); console.log(` Error: ${error.message}`); } } console.log('\nšŸ“‹ Available Commands:'); console.log(' npm run confluence:init - Initialize configuration'); console.log(' npm run confluence:test - Test connection'); console.log(' npm run confluence:publish - Publish documents'); console.log(' npm run confluence:status - Show this status'); } catch (error) { console.error('āŒ Status Error:', error.message); } } /** * Debug OAuth2 configuration and connection */ export async function confluenceDebugOAuth2() { try { console.log('\nšŸ” OAuth 2.0 Configuration Debug'); console.log('━'.repeat(50)); const configManager = createConfluenceConfigManager(); const config = configManager.getConfluenceConfig(); if (config.authMethod !== 'oauth2') { console.log('āŒ Auth method is not OAuth2:', config.authMethod); console.log(' Check your environment variables or config file'); return; } if (!config.oauth2) { console.log('āŒ OAuth2 configuration missing'); return; } console.log('āœ… Authentication Method: OAuth 2.0'); console.log('━'.repeat(50)); // Check OAuth2 configuration console.log('šŸ“‹ OAuth2 Configuration:'); console.log(` Client ID: ${config.oauth2.clientId ? 'āœ… Set' : 'āŒ Missing'}`); console.log(` Client Secret: ${config.oauth2.clientSecret ? 'āœ… Set' : 'āŒ Missing'}`); console.log(` Redirect URI: ${config.oauth2.redirectUri}`); console.log(` Scopes: ${config.oauth2.scopes.join(', ')}`); // Check space configuration console.log('\nšŸ“ Space Configuration:'); console.log(` Space Key: ${config.spaceKey || 'āŒ Not set'}`); // Validate configuration const validation = validateConfluenceConfig(config); console.log('\nšŸ” Configuration Validation:'); if (validation.valid) { console.log('āœ… Configuration is valid'); } else { console.log('āŒ Configuration errors:'); validation.errors.forEach((error) => console.log(` • ${error}`)); } // Check if OAuth2 is authorized const publisher = createConfluencePublisher(config); console.log('\nšŸ” Authorization Status:'); if (publisher.isOAuth2Authorized()) { console.log('āœ… OAuth2 is authorized'); try { const connectionTest = await publisher.testConnection(); if (connectionTest.success) { console.log('āœ… Connection test successful'); console.log(` User: ${connectionTest.userInfo?.displayName || connectionTest.userInfo?.username}`); console.log(` Cloud ID: ${connectionTest.cloudId}`); } else { console.log('āŒ Connection test failed:', connectionTest.error); } } catch (error) { console.log('āŒ Connection test error:', error.message); } } else { console.log('āŒ OAuth2 not authorized - run login command first'); // Generate auth URL for reference if (config.oauth2) { const oauth2Handler = new ConfluenceOAuth2(config.oauth2); const authUrl = oauth2Handler.getAuthorizationUrl(); console.log('\nšŸ”— To authorize, use this URL:'); console.log(authUrl); } } console.log('\nšŸ’” Troubleshooting Tips:'); console.log(' 1. Verify OAuth app is configured in Atlassian Developer Console'); console.log(' 2. Check redirect URI matches exactly: http://localhost:3000/callback'); console.log(' 3. Ensure OAuth app has proper permissions for Confluence'); console.log(' 4. Try running: npm run confluence:login'); console.log('━'.repeat(50)); } catch (error) { console.error('Debug failed:', error.message); } } //# sourceMappingURL=ConfluenceCLI.js.map