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
554 lines (462 loc) • 14.7 kB
Markdown
# CLI Interactive Menu Implementation Specification
## Overview
This document provides the technical implementation specification for the interactive CLI menu system based on the design outlined in `CLI-INTERACTIVE-MENU-DESIGN.md`.
## Architecture
### Core Components
```typescript
interface MenuSystem {
menuRenderer: MenuRenderer;
navigationManager: NavigationManager;
stateManager: StateManager;
inputHandler: InputHandler;
contextProvider: ContextProvider;
}
```
### 1. Menu Renderer
**Responsibility**: Display menus and handle visual presentation
```typescript
interface MenuRenderer {
renderMainMenu(): Promise<void>;
renderSubMenu(menuConfig: MenuConfig): Promise<void>;
renderBreadcrumb(path: string[]): void;
renderStatusIndicators(status: SystemStatus): void;
clearScreen(): void;
showSpinner(message: string): void;
hideSpinner(): void;
}
interface MenuConfig {
title: string;
items: MenuItem[];
showBreadcrumb: boolean;
showStatusBar: boolean;
}
interface MenuItem {
key: string;
label: string;
icon: string;
description?: string;
enabled: boolean;
badge?: string;
action: MenuAction;
}
```
### 2. Navigation Manager
**Responsibility**: Handle menu navigation and routing
```typescript
interface NavigationManager {
navigateTo(menuId: string, params?: any): Promise<void>;
goBack(): Promise<void>;
goHome(): Promise<void>;
getCurrentPath(): string[];
canGoBack(): boolean;
registerRoute(route: MenuRoute): void;
}
interface MenuRoute {
id: string;
path: string;
handler: MenuHandler;
parent?: string;
children?: string[];
}
type MenuHandler = (params?: any) => Promise<MenuResult>;
interface MenuResult {
action: 'continue' | 'back' | 'home' | 'exit';
data?: any;
}
```
### 3. State Manager
**Responsibility**: Manage application state and context
```typescript
interface StateManager {
getProjectState(): ProjectState;
getSystemState(): SystemState;
getUserPreferences(): UserPreferences;
updateState(updates: Partial<AppState>): void;
saveState(): Promise<void>;
loadState(): Promise<void>;
}
interface ProjectState {
initialized: boolean;
configurationComplete: boolean;
documentsGenerated: string[];
lastActivity: Date;
projectType?: string;
}
interface SystemState {
aiProviderConfigured: boolean;
integrationsConfigured: IntegrationStatus;
lastHealthCheck: Date;
errors: SystemError[];
}
interface UserPreferences {
defaultProvider: string;
outputDirectory: string;
recentTemplates: string[];
favoriteActions: string[];
menuMode: 'beginner' | 'advanced';
}
```
### 4. Input Handler
**Responsibility**: Handle user input and validation
```typescript
interface InputHandler {
promptForChoice(options: ChoiceOptions): Promise<string>;
promptForText(prompt: TextPrompt): Promise<string>;
promptForConfirmation(message: string): Promise<boolean>;
promptForMultiSelect(options: MultiSelectOptions): Promise<string[]>;
handleKeyboardInput(): Promise<KeyboardEvent>;
}
interface ChoiceOptions {
message: string;
choices: Choice[];
default?: string;
allowCancel?: boolean;
}
interface Choice {
key: string;
label: string;
description?: string;
enabled?: boolean;
}
```
### 5. Context Provider
**Responsibility**: Provide context-aware information
```typescript
interface ContextProvider {
getAvailableTemplates(): Promise<TemplateInfo[]>;
getSystemStatus(): Promise<SystemStatus>;
getRecommendations(): Promise<Recommendation[]>;
getRecentActions(): Promise<RecentAction[]>;
validatePrerequisites(action: string): Promise<ValidationResult>;
}
interface SystemStatus {
aiProvider: ProviderStatus;
integrations: IntegrationStatus;
workspace: WorkspaceStatus;
health: HealthStatus;
}
interface Recommendation {
type: 'template' | 'action' | 'configuration';
title: string;
description: string;
priority: 'high' | 'medium' | 'low';
action: string;
}
```
## Menu Definitions
### Main Menu Configuration
```typescript
const MAIN_MENU: MenuConfig = {
title: 'ADPA Interactive CLI',
items: [
{
key: '1',
label: 'Quick Start',
icon: '🚀',
description: 'Get started quickly with common workflows',
enabled: true,
action: { type: 'navigate', target: 'quick-start' }
},
{
key: '2',
label: 'Document Generation',
icon: '📝',
description: 'Generate project documents',
enabled: true,
badge: getTemplateCount(),
action: { type: 'navigate', target: 'document-generation' }
},
{
key: '3',
label: 'AI Configuration',
icon: '🤖',
description: 'Configure AI providers',
enabled: true,
badge: getProviderStatus(),
action: { type: 'navigate', target: 'ai-configuration' }
},
// ... additional menu items
],
showBreadcrumb: false,
showStatusBar: true
};
```
### Sub-Menu Configurations
```typescript
const DOCUMENT_GENERATION_MENU: MenuConfig = {
title: 'Document Generation',
items: [
{
key: '1',
label: 'Browse by Category',
icon: '📚',
description: 'Browse templates organized by category',
enabled: true,
action: { type: 'navigate', target: 'browse-categories' }
},
{
key: '2',
label: 'Search Templates',
icon: '🔍',
description: 'Search for specific templates',
enabled: true,
action: { type: 'function', handler: 'searchTemplates' }
},
// ... additional items
],
showBreadcrumb: true,
showStatusBar: true
};
```
## Implementation Classes
### 1. Interactive Menu System
```typescript
export class InteractiveMenuSystem {
private renderer: MenuRenderer;
private navigation: NavigationManager;
private state: StateManager;
private input: InputHandler;
private context: ContextProvider;
constructor() {
this.renderer = new ConsoleMenuRenderer();
this.navigation = new MenuNavigationManager();
this.state = new FileBasedStateManager();
this.input = new InquirerInputHandler();
this.context = new SystemContextProvider();
}
async start(): Promise<void> {
await this.state.loadState();
await this.navigation.navigateTo('main-menu');
}
async stop(): Promise<void> {
await this.state.saveState();
}
}
```
### 2. Console Menu Renderer
```typescript
export class ConsoleMenuRenderer implements MenuRenderer {
private currentMenu?: MenuConfig;
async renderMainMenu(): Promise<void> {
this.clearScreen();
this.renderHeader();
await this.renderMenu(MAIN_MENU);
}
async renderSubMenu(menuConfig: MenuConfig): Promise<void> {
this.clearScreen();
if (menuConfig.showBreadcrumb) {
this.renderBreadcrumb(this.navigation.getCurrentPath());
}
await this.renderMenu(menuConfig);
}
private renderHeader(): void {
console.log('┌─────────────────────────────────────────────────────────────┐');
console.log('│ ADPA Interactive CLI │');
console.log('│ Version 2.1.3 │');
console.log('├─────────────────────────────────────────────────────────────┤');
}
private async renderMenu(config: MenuConfig): Promise<void> {
this.currentMenu = config;
for (const item of config.items) {
const status = item.enabled ? '' : ' (disabled)';
const badge = item.badge ? ` [${item.badge}]` : '';
console.log(`│ ${item.key}. ${item.icon} ${item.label}${badge}${status}`);
}
console.log('└─────────────────────────────────────────────────────────────┘');
}
renderBreadcrumb(path: string[]): void {
const breadcrumb = path.join(' > ');
console.log(`📍 ${breadcrumb}\n`);
}
clearScreen(): void {
console.clear();
}
showSpinner(message: string): void {
// Implementation for spinner
}
hideSpinner(): void {
// Implementation to hide spinner
}
}
```
### 3. Menu Navigation Manager
```typescript
export class MenuNavigationManager implements NavigationManager {
private routes: Map<string, MenuRoute> = new Map();
private navigationStack: string[] = [];
private currentRoute?: string;
constructor() {
this.registerDefaultRoutes();
}
async navigateTo(menuId: string, params?: any): Promise<void> {
const route = this.routes.get(menuId);
if (!route) {
throw new Error(`Route not found: ${menuId}`);
}
this.navigationStack.push(menuId);
this.currentRoute = menuId;
const result = await route.handler(params);
await this.handleMenuResult(result);
}
async goBack(): Promise<void> {
if (this.canGoBack()) {
this.navigationStack.pop(); // Remove current
const previous = this.navigationStack.pop(); // Get previous
if (previous) {
await this.navigateTo(previous);
}
}
}
async goHome(): Promise<void> {
this.navigationStack = [];
await this.navigateTo('main-menu');
}
getCurrentPath(): string[] {
return this.navigationStack.map(routeId => {
const route = this.routes.get(routeId);
return route?.path || routeId;
});
}
canGoBack(): boolean {
return this.navigationStack.length > 1;
}
private async handleMenuResult(result: MenuResult): Promise<void> {
switch (result.action) {
case 'back':
await this.goBack();
break;
case 'home':
await this.goHome();
break;
case 'exit':
process.exit(0);
break;
case 'continue':
// Stay in current menu
break;
}
}
private registerDefaultRoutes(): void {
// Register all menu routes
this.registerRoute({
id: 'main-menu',
path: 'Main Menu',
handler: this.handleMainMenu.bind(this)
});
this.registerRoute({
id: 'quick-start',
path: 'Quick Start',
handler: this.handleQuickStart.bind(this),
parent: 'main-menu'
});
// ... register all other routes
}
private async handleMainMenu(): Promise<MenuResult> {
const choice = await this.input.promptForChoice({
message: 'Select an option:',
choices: MAIN_MENU.items.map(item => ({
key: item.key,
label: `${item.icon} ${item.label}`,
description: item.description
}))
});
const selectedItem = MAIN_MENU.items.find(item => item.key === choice);
if (selectedItem?.action.type === 'navigate') {
await this.navigateTo(selectedItem.action.target);
}
return { action: 'continue' };
}
}
```
## Integration Points
### 1. Existing CLI Commands
The interactive menu system should integrate with existing CLI commands:
```typescript
interface CommandIntegration {
executeCommand(command: string, args: string[]): Promise<CommandResult>;
getCommandStatus(command: string): Promise<CommandStatus>;
validateCommand(command: string, args: string[]): Promise<ValidationResult>;
}
```
### 2. Configuration System
Integration with existing configuration:
```typescript
interface ConfigurationIntegration {
loadConfiguration(): Promise<Configuration>;
saveConfiguration(config: Configuration): Promise<void>;
validateConfiguration(): Promise<ValidationResult>;
getConfigurationStatus(): Promise<ConfigurationStatus>;
}
```
### 3. Document Generation
Integration with document generation system:
```typescript
interface DocumentGenerationIntegration {
getAvailableTemplates(): Promise<TemplateInfo[]>;
generateDocument(templateKey: string, options: GenerationOptions): Promise<GenerationResult>;
getGenerationHistory(): Promise<GenerationHistory[]>;
validateTemplate(templateKey: string): Promise<ValidationResult>;
}
```
## Error Handling
### 1. Menu-Level Error Handling
```typescript
interface MenuErrorHandler {
handleNavigationError(error: NavigationError): Promise<void>;
handleInputError(error: InputError): Promise<void>;
handleSystemError(error: SystemError): Promise<void>;
showErrorMessage(message: string, recoverable: boolean): Promise<void>;
}
```
### 2. Recovery Strategies
```typescript
interface ErrorRecovery {
recoverFromNavigationError(): Promise<void>;
recoverFromConfigurationError(): Promise<void>;
recoverFromSystemError(): Promise<void>;
resetToSafeState(): Promise<void>;
}
```
## Testing Strategy
### 1. Unit Tests
- Test individual menu components
- Test navigation logic
- Test state management
- Test input validation
### 2. Integration Tests
- Test menu flow end-to-end
- Test integration with existing commands
- Test error handling scenarios
- Test configuration management
### 3. User Experience Tests
- Test menu usability
- Test navigation efficiency
- Test accessibility features
- Test performance under load
## Performance Considerations
### 1. Lazy Loading
- Load menu configurations on demand
- Cache frequently accessed data
- Minimize startup time
### 2. Async Operations
- Non-blocking menu rendering
- Background status checks
- Parallel data loading where possible
### 3. Memory Management
- Clean up unused menu states
- Limit navigation history size
- Efficient string handling for large menus
## Deployment and Rollout
### 1. Feature Flags
- Gradual rollout of interactive menu
- Fallback to existing CLI interface
- A/B testing capabilities
### 2. Migration Strategy
- Maintain backward compatibility
- Provide migration path for existing users
- Documentation and training materials
### 3. Monitoring
- Track menu usage patterns
- Monitor performance metrics
- Collect user feedback
This implementation specification provides a comprehensive foundation for building the interactive CLI menu system while maintaining integration with the existing ADPA functionality.