@fromsvenwithlove/devops-issues-cli
Version:
AI-powered CLI tool and library for Azure DevOps work item management with Claude agents
115 lines (97 loc) • 3.14 kB
JavaScript
import inquirer from 'inquirer';
import chalk from 'chalk';
import { getConfig, ConfigError } from '../config/index.js';
import { AzureDevOpsClient } from '../api/azure-client.js';
import {
formatWorkItemsAsTable,
formatWorkItemsAsJson,
formatWorkItemsMinimal,
formatSummary
} from '../utils/formatter.js';
import { mainMenuPrompt, stateFilterPrompt, outputFormatPrompt } from './prompts.js';
import { TreeNavigator } from '../explorer/tree-navigator.js';
export async function runInteractiveMode() {
console.log(chalk.bold.blue('\nAzure DevOps Issue Tracker\n'));
try {
// Get configuration
const config = getConfig();
// Create and connect client
const client = new AzureDevOpsClient(config);
await client.connect();
// Main interactive loop
let shouldContinue = true;
while (shouldContinue) {
const { action } = await inquirer.prompt(mainMenuPrompt);
switch (action) {
case 'list-all':
await listAllIssues(client);
break;
case 'filter-state':
await filterByState(client);
break;
case 'explore':
await exploreIssues(client);
break;
case 'exit':
shouldContinue = false;
console.log(chalk.green('\nGoodbye!\n'));
break;
}
}
} catch (error) {
if (error instanceof ConfigError) {
console.error(chalk.red('Configuration Error:'));
console.error(error.message);
process.exit(1);
} else {
console.error(chalk.red('Error:'), error.message);
process.exit(3);
}
}
}
async function listAllIssues(client) {
const { format } = await inquirer.prompt(outputFormatPrompt);
const workItems = await client.getAssignedWorkItems();
displayResults(workItems, format);
}
async function filterByState(client) {
const { state } = await inquirer.prompt(stateFilterPrompt);
const { format } = await inquirer.prompt(outputFormatPrompt);
let options = {};
if (state === 'active-new') {
// Special case for Active and New
options.multiState = ['Active', 'New'];
} else if (state !== 'all') {
options.state = state;
}
const workItems = await client.getAssignedWorkItems(options);
displayResults(workItems, format);
}
async function exploreIssues(client) {
const workItems = await client.getAssignedWorkItems();
if (workItems.length === 0) {
console.log(chalk.green('\n✅ No work items found\n'));
return;
}
const navigator = new TreeNavigator(workItems);
await navigator.navigate();
}
function displayResults(workItems, format) {
if (workItems.length === 0) {
console.log(chalk.green('\n✅ No work items found\n'));
return;
}
console.log(''); // Empty line for better formatting
switch (format) {
case 'json':
console.log(formatWorkItemsAsJson(workItems));
break;
case 'minimal':
console.log(formatWorkItemsMinimal(workItems));
break;
default:
console.log(formatWorkItemsAsTable(workItems));
console.log(formatSummary(workItems));
}
console.log(''); // Empty line after results
}