UNPKG

@sethdouglasford/claude-flow

Version:

Claude Code Flow - Advanced AI-powered development workflows with SPARC methodology

163 lines 5.97 kB
/** * Fallback UI Handler - Handles raw mode errors gracefully * Provides alternative UI when Ink/raw mode isn't supported */ import chalk from "chalk"; import { createCompatibleUI } from "./compatible-ui"; /** * Handles raw mode errors and provides fallback UI */ export async function handleRawModeError(error, options = {}) { const isRawModeError = error.message.includes("Raw mode is not supported") || error.message.includes("stdin") || error.message.includes("Ink"); if (!isRawModeError) { throw error; // Re-throw if it's not a raw mode error } console.clear(); console.log(chalk.yellow.bold("⚠️ Interactive Mode Not Supported")); console.log(chalk.gray("─".repeat(50))); console.log(chalk.white("The current terminal environment does not support")); console.log(chalk.white("interactive UI features (raw mode).")); console.log(); console.log(chalk.cyan("Common causes:")); console.log(chalk.gray("• VS Code integrated terminal")); console.log(chalk.gray("• CI/CD environments")); console.log(chalk.gray("• Docker containers")); console.log(chalk.gray("• SSH sessions without TTY")); console.log(); if (options.fallbackMessage) { console.log(chalk.blue("ℹ️ "), options.fallbackMessage); console.log(); } if (options.enableUI) { console.log(chalk.green("✅ Launching compatible UI mode...")); console.log(); try { const ui = createCompatibleUI(); await ui.start(); } catch (fallbackError) { console.log(chalk.red("❌ Fallback UI also failed:"), fallbackError.message); await showBasicInterface(options); } } else { await showBasicInterface(options); } } /** * Shows a basic text-based interface when UI isn't available */ async function showBasicInterface(options) { console.log(chalk.green("📋 Available alternatives:")); console.log(); console.log(chalk.white("1. Use CLI commands directly:")); console.log(chalk.gray(" ./claude-flow status")); console.log(chalk.gray(" ./claude-flow memory list")); console.log(chalk.gray(" ./claude-flow sparc modes")); console.log(); console.log(chalk.white("2. Use non-interactive modes:")); console.log(chalk.gray(" ./claude-flow start (without --ui)")); console.log(chalk.gray(" ./claude-flow swarm \"task\" --monitor")); console.log(); console.log(chalk.white("3. Use external terminal:")); console.log(chalk.gray(" Run in a standalone terminal application")); console.log(); if (options.showHelp) { console.log(chalk.cyan("💡 For help with any command, use:")); console.log(chalk.gray(" ./claude-flow help <command>")); console.log(chalk.gray(" ./claude-flow <command> --help")); console.log(); } console.log(chalk.gray("Press Ctrl+C to exit")); // Wait for user to exit await new Promise(() => { process.on("SIGINT", () => { console.log(chalk.green("\n👋 Goodbye!")); process.exit(0); }); }); } /** * Wraps a function to catch and handle raw mode errors */ export function withRawModeFallback(fn, fallbackOptions = {}) { return async (...args) => { try { return await fn(...args); } catch (error) { if (error instanceof Error) { await handleRawModeError(error, fallbackOptions); } else { throw error; } } }; } /** * Checks if the current environment supports interactive UI */ export function checkUISupport() { // Check if we're in a TTY if (!process.stdin.isTTY) { return { supported: false, reason: "Not running in a TTY environment", recommendation: "Use a proper terminal application", }; } // Check if raw mode is available if (typeof process.stdin.setRawMode !== "function") { return { supported: false, reason: "Raw mode not available", recommendation: "Use --no-ui flag or run in external terminal", }; } // Check for VS Code terminal if (process.env.TERM_PROGRAM === "vscode") { return { supported: false, reason: "Running in VS Code integrated terminal", recommendation: "Use VS Code external terminal or standalone terminal", }; } // Check for other problematic environments if (process.env.CI || process.env.GITHUB_ACTIONS) { return { supported: false, reason: "Running in CI/CD environment", recommendation: "Use non-interactive mode", }; } return { supported: true }; } /** * Shows UI support information */ export function showUISupport() { const support = checkUISupport(); console.log(chalk.cyan.bold("🖥️ UI Support Information")); console.log(chalk.gray("─".repeat(40))); if (support.supported) { console.log(chalk.green("✅ Interactive UI supported")); console.log(chalk.gray("Your terminal supports all UI features")); } else { console.log(chalk.yellow("⚠️ Limited UI support")); console.log(chalk.gray(`Reason: ${support.reason}`)); if (support.recommendation) { console.log(chalk.blue(`Recommendation: ${support.recommendation}`)); } } console.log(); console.log(chalk.white("Environment details:")); console.log(chalk.gray(`• Terminal: ${process.env.TERM ?? "unknown"}`)); console.log(chalk.gray(`• TTY: ${process.stdin.isTTY ? "yes" : "no"}`)); console.log(chalk.gray(`• Program: ${process.env.TERM_PROGRAM ?? "unknown"}`)); console.log(chalk.gray(`• Platform: ${process.platform}`)); } //# sourceMappingURL=fallback-handler.js.map