Skip to content

Terminal UI (TUI) ​

ScriptIt provides a beautiful and intuitive Terminal User Interface (TUI) for interactive script management and execution. The TUI offers a visual way to browse, select, and execute scripts with real-time output monitoring.

Overview ​

The TUI is built using the blessed library and provides a full-screen terminal interface with multiple panels, keyboard navigation, and real-time script execution monitoring.

bash
# Launch TUI (default command)
scriptit run
scriptit  # Same as above

# Launch TUI with custom configuration
scriptit run --config custom.config.js --scripts-dir src/scripts

Interface Layout ​

The TUI consists of several panels arranged in a user-friendly layout:

┌─────────────────────────────────────────────────────────────────────┐
│ [C]onfig | [F]iles | [Tab] Focus | [Enter] Run | [j/k] Navigate | [Q]uit │ ← Control Panel
├─────────────────────────────────────────────────────────────────────┤
│ ┌─ Scripts ─────────┐ ┌─ Configuration ─┐                           │
│ │ • hello.js        │ │ Config: Default │                           │
│ │ • deploy.ts       │ │ Scripts: ./scr… │                           │
│ │ • backup.js       │ │ Temp: ./tmp     │                           │
│ │ • utils/clean.js  │ │ Env Vars: 12    │                           │
│ │                   │ │ Exclude: *.test │                           │
│ └───────────────────┘ └─────────────────┘                           │
├─────────────────────────────────────────────────────────────────────┤
│ ┌─ Output (ACTIVE) ─────────────────────────────────────────────────┐ │
│ │ TUI initialized. Use [↑↓] or [j/k] to navigate...                │ │
│ │ 🚀 Starting: hello.js                                            │ │
│ │   Hello from ScriptIt!                                           │ │
│ │   ✅ Script completed successfully                                │ │
│ │                                                                   │ │
│ └───────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

Panels ​

1. Control Panel ​

The top panel displays available keyboard shortcuts and commands:

  • [C]onfig - Toggle configuration panel visibility
  • [F]iles - Toggle file list panel visibility
  • [Tab] - Switch focus between panels
  • [Enter] - Execute selected script
  • [j/k] - Navigate using vim-style keys
  • [R]efresh - Refresh script list
  • [Q]uit - Exit the TUI

2. Scripts Panel ​

The scripts panel shows all available scripts in your scripts directory:

Features:

  • Hierarchical display - Shows directory structure
  • Relative paths - Clean, readable script paths
  • Selection indicator - Highlights currently selected script
  • Scrollable list - Navigate through many scripts
  • Real-time filtering - Respects exclude patterns

Navigation:

  • ↑/↓ or j/k - Move selection up/down
  • Enter - Execute selected script
  • Home/End - Jump to first/last script

3. Configuration Panel (Toggle) ​

The configuration panel displays current settings and can be toggled with C:

Information Displayed:

  • Config File - Shows loaded configuration file or "Default"
  • Scripts Directory - Relative path to scripts directory
  • Temp Directory - Relative path to temporary directory
  • Environment Variables - Count of loaded environment variables
  • Exclude Patterns - Active exclude patterns for filtering

4. Output Panel ​

The output panel shows real-time script execution output:

Features:

  • Colored output - Preserves console colors from scripts
  • Real-time updates - Shows output as it happens
  • Scrollable history - Navigate through previous output
  • Execution status - Clear success/failure indicators
  • Script results - Displays returned values from scripts

Navigation:

  • j/k - Scroll output up/down when focused
  • Tab - Switch focus to/from output panel

Keyboard Controls ​

Global Controls ​

KeyActionDescription
q, Q, Ctrl+CQuitExit the TUI application
TabSwitch FocusToggle between Scripts and Output panels
c, CToggle ConfigShow/hide configuration panel
f, FToggle FilesShow/hide file list panel
r, RRefreshReload script list from directory

Scripts Panel Controls ​

KeyActionDescription
↑, kMove UpSelect previous script
↓, jMove DownSelect next script
EnterExecuteRun the selected script
HomeFirst ScriptJump to first script in list
EndLast ScriptJump to last script in list

Output Panel Controls ​

KeyActionDescription
jScroll DownScroll output down
kScroll UpScroll output up
Page DownPage DownScroll down one page
Page UpPage UpScroll up one page

Features ​

Script Discovery ​

The TUI automatically discovers scripts in your configured scripts directory:

  • Recursive scanning - Finds scripts in subdirectories
  • Pattern filtering - Respects exclude patterns from configuration
  • File type support - Supports .js, .ts, and other configured extensions
  • Real-time updates - Refresh with R to see new scripts

Real-time Execution ​

When you execute a script, the TUI provides:

  • Immediate feedback - Shows execution start/end
  • Live output streaming - See output as it happens
  • Colored console output - Preserves script color formatting
  • Error handling - Clear error messages and stack traces
  • Result display - Shows script return values

Visual Feedback ​

The TUI provides rich visual feedback:

  • Panel borders - Color-coded panel borders
  • Focus indicators - Clear indication of active panel
  • Status messages - Informative status updates
  • Progress indicators - Shows script execution progress
  • Color coding - Different colors for different message types

Configuration ​

TUI-Specific Options ​

Configure TUI behavior in your scriptit.config.js:

javascript
export default {
  // TUI configuration
  tui: {
    enabled: true,              // Enable TUI by default
    theme: 'default',           // Color theme
    refreshInterval: 1000,      // Auto-refresh interval (ms)
    showHiddenFiles: false,     // Show hidden files
    defaultFocus: 'scripts'     // Default focused panel
  },
  
  // Display configuration
  display: {
    showRelativePaths: true,    // Show relative paths in scripts list
    maxPathLength: 50,          // Truncate long paths
    showFileExtensions: true,   // Show file extensions
    groupByDirectory: false     // Group scripts by directory
  }
}

Environment Variables ​

Control TUI behavior with environment variables:

bash
# Disable TUI and use CLI mode
scriptit run --no-tui

# Force TUI even in debug mode
scriptit run --force-tui

# Enable debug mode for TUI
SCRIPTIT_DEBUG=true scriptit run

Usage Examples ​

Basic TUI Usage ​

bash
# Launch TUI with default settings
scriptit run

# Navigate to a script using arrow keys or j/k
# Press Enter to execute the selected script
# Press q to quit

Custom Configuration ​

bash
# Use custom scripts directory
scriptit run --scripts-dir src/automation

# Use custom configuration file
scriptit run --config production.config.js

# Combine options
scriptit run --config prod.config.js --scripts-dir scripts --tmp-dir temp

Development Workflow ​

bash
# 1. Initialize project with TUI-friendly structure
scriptit init

# 2. Create some scripts
mkdir -p scripts/utils
echo 'export async function execute(context) { 
  const console = context.console || global.console;
  console.log("Hello from TUI!"); 
}' > scripts/hello.js

# 3. Launch TUI
scriptit run

# 4. Navigate and execute scripts interactively

Debugging with TUI ​

bash
# Enable debug mode to see detailed information
SCRIPTIT_DEBUG=true scriptit run

# The TUI will show additional debug information:
# - Runtime detection details
# - Configuration loading process
# - Script discovery process
# - Execution environment details

Advanced Features ​

Script Metadata Display ​

The TUI can display script metadata when available:

javascript
// my-script.js
export const description = "This description appears in the TUI";
export const author = "Your Name";
export const version = "1.0.0";

export async function execute(context) {
  // Script implementation
}

Interactive Environment Variable Prompting ​

The TUI now supports interactive collection of environment variables through beautiful modal dialogs, providing the same functionality as the CLI but with a visual interface.

When a script requires environment variables, the TUI displays modal dialogs:

┌─────────────────────────────────────────────────────────────────────┐
│                          🔐 Environment Variable                    │
│                                                                     │
│  Enter your API key:                                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │ ********                                                    │   │
│  └─────────────────────────────────────────────────────────────┘   │
│  [Enter] Submit • [Escape] Cancel • [Tab] Empty value             │
└─────────────────────────────────────────────────────────────────────┘

Declarative Variable Definition ​

Scripts can declare required environment variables:

javascript
// interactive-script.js
export const description = "Script with environment prompts";

// Define required environment variables
export const variables = [
  { name: 'API_KEY', message: 'Enter your API key:', type: 'password' },
  { name: 'USER_NAME', message: 'Enter your username:', type: 'input' },
  'ENVIRONMENT',  // Shorthand for simple variables
  'DEBUG_MODE'
];

export async function execute(context) {
  const console = context.console || global.console;
  
  // Variables are automatically collected and available
  console.log(`Username: ${context.env.USER_NAME}`);
  console.log(`Environment: ${context.env.ENVIRONMENT}`);
  console.log(`API Key: ${context.env.API_KEY ? '***hidden***' : 'Not set'}`);
  
  return { success: true };
}

Smart Variable Detection ​

The TUI automatically detects which variables need to be collected:

  • Skip existing - Variables already set in environment are not prompted
  • Batch collection - Collects multiple variables in sequence
  • Type-aware prompting - Password fields are masked, input fields are visible
  • Cancellable - Users can skip variables or cancel the entire process

Variable Types ​

The TUI supports different input types:

Password Fields:

javascript
{ name: 'API_KEY', type: 'password', message: 'Enter API key:' }
  • Input is masked with * characters
  • Content is hidden from display
  • Values are not logged for security

Input Fields:

javascript
{ name: 'USER_NAME', type: 'input', message: 'Enter username:' }
  • Regular text input
  • Content is visible as typed
  • Default type if not specified

Keyboard Controls:

  • Enter - Submit the current value
  • Escape - Skip this variable (sets empty value)
  • Tab - Submit empty value explicitly
  • Backspace - Delete characters
  • Arrow Keys - Navigate within input field

Visual Feedback:

  • 🔐 Icon - Indicates password fields
  • 📝 Icon - Indicates regular input fields
  • Color coding - Yellow for passwords, cyan for input
  • Progress indication - Shows which variable is being collected

Example Workflow ​

javascript
// deployment-script.js
export const description = "Deploy with environment prompts";

export const variables = [
  { name: 'DEPLOY_ENV', message: 'Target environment (prod/staging):', type: 'input' },
  { name: 'API_TOKEN', message: 'Deployment API token:', type: 'password' },
  { name: 'CONFIRM_DEPLOY', message: 'Confirm deployment (yes/no):', type: 'input' }
];

export async function execute(context) {
  const console = context.console || global.console;
  
  // Validate input
  if (context.env.CONFIRM_DEPLOY?.toLowerCase() !== 'yes') {
    console.warn('Deployment cancelled by user');
    return { cancelled: true };
  }
  
  console.info(`🚀 Deploying to ${context.env.DEPLOY_ENV}...`);
  
  // Use the collected variables
  const response = await deploy({
    environment: context.env.DEPLOY_ENV,
    token: context.env.API_TOKEN
  });
  
  console.log('✅ Deployment successful!');
  return response;
}

Security Features ​

  • No logging - Prompted values are never displayed in output logs
  • Memory isolation - Values are cleared after script execution
  • Visual masking - Password fields show * characters only
  • Process isolation - Values are only available during script execution

Multi-Panel Layout ​

The TUI supports different layout modes:

bash
# Hide configuration panel for more space
# Press 'C' to toggle configuration panel

# Hide file list to focus on output
# Press 'F' to toggle file list panel

# Switch focus between panels
# Press 'Tab' to switch focus

Output Management ​

The output panel provides advanced features:

  • Automatic scrolling - Follows new output automatically
  • Manual navigation - Use j/k to scroll through history
  • Clear indicators - Visual separation between script runs
  • Error highlighting - Errors are clearly marked
  • Result formatting - Script results are nicely formatted

Troubleshooting ​

Common Issues ​

TUI doesn't start:

bash
❌ Error initializing TUI: Terminal not supported
💡 Try running with --no-tui flag
💡 Ensure your terminal supports ANSI colors

Scripts not showing:

bash
# Check if scripts directory exists
ls -la scripts/

# Check exclude patterns in config
scriptit run --debug

# Refresh script list
# Press 'R' in TUI to refresh

Keyboard not working:

bash
# Ensure terminal supports keyboard input
# Try different terminal emulator
# Check if running in proper TTY

Debug Mode ​

Enable debug mode for detailed TUI information:

bash
SCRIPTIT_DEBUG=true scriptit run

Debug mode shows:

  • Terminal capabilities
  • Script discovery process
  • Configuration loading
  • Keyboard event handling
  • Panel rendering details

Terminal Compatibility ​

The TUI works best with modern terminal emulators:

✅ Fully Supported:

  • iTerm2 (macOS)
  • Terminal.app (macOS)
  • Windows Terminal
  • GNOME Terminal
  • Konsole
  • Alacritty
  • Hyper

⚠️ Limited Support:

  • Basic terminals without color support
  • Very old terminal emulators
  • Some CI/CD environments

❌ Not Supported:

  • Non-interactive environments
  • Terminals without TTY support

Integration with Other Features ​

Console Colors ​

The TUI preserves colored console output from scripts:

javascript
// colored-script.js
export async function execute(context) {
  const console = context.console || global.console;
  
  console.log('Regular message');    // White
  console.error('Error message');    // Red  
  console.warn('Warning message');   // Yellow
  console.info('Info message');      // Blue
  console.debug('Debug message');    // Gray
}

Environment Variables ​

The TUI displays environment information in the configuration panel:

javascript
// env-script.js
export async function execute(context) {
  const console = context.console || global.console;
  
  console.log('Environment:', context.env.NODE_ENV);
  console.log('API Key:', context.env.API_KEY ? '***' : 'Not set');
  console.log('Database:', context.env.DATABASE_URL ? 'Connected' : 'Not configured');
}

Cross-Runtime Support ​

The TUI works consistently across all supported runtimes:

bash
# TUI with Bun (fastest)
scriptit --runtime=bun run

# TUI with Deno (secure)
scriptit --runtime=deno run

# TUI with Node.js (compatible)
scriptit --runtime=node run

Best Practices ​

1. Organize Scripts ​

Structure your scripts for better TUI navigation:

scripts/
├── development/
│   ├── setup.js
│   └── test.js
├── deployment/
│   ├── build.js
│   └── deploy.js
└── utilities/
    ├── cleanup.js
    └── backup.js

2. Use Descriptive Names ​

Choose clear, descriptive script names:

javascript
// ✅ Good - clear purpose
export const description = "Deploy application to production";

// ❌ Avoid - unclear purpose
export const description = "Script";

3. Provide Feedback ​

Give users clear feedback during execution:

javascript
export async function execute(context) {
  const console = context.console || global.console;
  
  console.info('🚀 Starting deployment...');
  console.log('📦 Building application...');
  console.log('🔄 Uploading files...');
  console.log('✅ Deployment complete!');
}

4. Handle Errors Gracefully ​

Provide clear error messages:

javascript
export async function execute(context) {
  const console = context.console || global.console;
  
  try {
    // Script logic
    console.log('✅ Operation successful');
  } catch (error) {
    console.error('❌ Operation failed:', error.message);
    throw error; // Re-throw for TUI error handling
  }
}

Released under the MIT License.