@ace-sdk/cli
Version:
ACE CLI - Command-line tool for intelligent pattern learning and playbook management
75 lines ⢠3.43 kB
JavaScript
/**
* Domains Command - List available pattern domains
*
* Lists all domains from the server's by_domain statistics,
* enabling users to discover valid domain names for filtering
* ace search with --allowed-domains or --blocked-domains.
*
* @package @ace-sdk/cli
*/
import { globalOptions } from '../cli.js';
import { createContext } from '../types/config.js';
import { ACEServerClient } from '../services/server-client.js';
import { Logger } from '../services/logger.js';
import chalk from 'chalk';
export async function domainsCommand(options) {
const logger = new Logger(globalOptions);
let spinner = logger.spinner('Fetching available domains...');
try {
// Create context using 4-tier precedence (flags > env > .claude/settings.json > error)
const context = await createContext({ org: globalOptions.org, project: globalOptions.project });
const client = new ACEServerClient(context, logger);
const minPatterns = options.minPatterns ?? 1;
const status = await client.getAnalytics();
const byDomain = status.by_domain || {};
// Filter and sort domains
const domains = Object.entries(byDomain)
.filter(([_, count]) => count >= minPatterns)
.map(([name, count]) => ({ name, count }))
.sort((a, b) => b.count - a.count);
const totalPatterns = Object.values(byDomain).reduce((a, b) => a + b, 0);
spinner?.succeed('Domains retrieved');
if (logger.isJson()) {
logger.output({
domains,
total_domains: domains.length,
total_patterns: totalPatterns
});
return;
}
if (domains.length === 0) {
logger.info(chalk.yellow('\nNo domains found with patterns.'));
logger.info(chalk.dim('Run ce-ace bootstrap or ce-ace learn to create patterns.\n'));
return;
}
// Header
logger.info('');
logger.info(chalk.bold(`š ${domains.length} Domains (${totalPatterns} total patterns)`));
logger.info(chalk.dim('ā'.repeat(60)));
// Domain list with visual bar chart
const maxNameLen = Math.max(...domains.map(d => d.name.length));
const maxCount = Math.max(...domains.map(d => d.count));
for (const domain of domains) {
const paddedName = domain.name.padEnd(maxNameLen);
const barLen = Math.ceil((domain.count / maxCount) * 20);
const bar = 'ā'.repeat(barLen);
logger.info(` ${chalk.cyan(paddedName)} ${chalk.dim(domain.count.toString().padStart(3))} ${chalk.green(bar)}`);
}
logger.info('');
logger.info(chalk.dim('Usage with search:'));
logger.info(chalk.dim(` ce-ace search "query" --allowed-domains "${domains[0]?.name || 'domain-name'}"`));
logger.info(chalk.dim(` ce-ace search "query" --blocked-domains "${domains[0]?.name || 'domain-name'}"`));
logger.info('');
}
catch (error) {
spinner?.fail('Failed to fetch domains');
if (logger.isJson()) {
logger.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
}
else {
logger.error(chalk.red(`\nā Error: ${error instanceof Error ? error.message : String(error)}\n`));
}
process.exit(1);
}
}
//# sourceMappingURL=domains.js.map