import { isValidRemoteValue } from './validation.js';
export interface CliCommandPackOptions {
format?: string;
removeComments?: boolean;
removeEmptyLines?: boolean;
showLineNumbers?: boolean;
fileSummary?: boolean;
directoryStructure?: boolean;
includePatterns?: string;
ignorePatterns?: string;
outputParsable?: boolean;
compress?: boolean;
}
// Escape a string for safe use in shell commands
const shellEscape = (value: string): string => `'${value.replace(/'/g, "'\\''")}'`;
export function generateCliCommand(repositoryUrl: string | undefined, packOptions?: CliCommandPackOptions): string {
const parts: string[] = ['npx repomix'];
// Add remote repository URL (only for valid remote values, not uploaded file names)
if (repositoryUrl && isValidRemoteValue(repositoryUrl)) {
parts.push(`--remote ${shellEscape(repositoryUrl)}`);
}
// Only add options if packOptions is provided
if (packOptions) {
// Format (only add if not default 'xml')
if (packOptions.format && packOptions.format !== 'xml') {
parts.push(`--style ${packOptions.format}`);
}
// Boolean flags that enable features
if (packOptions.removeComments) {
parts.push('--remove-comments');
}
if (packOptions.removeEmptyLines) {
parts.push('--remove-empty-lines');
}
if (packOptions.showLineNumbers) {
parts.push('--output-show-line-numbers');
}
if (packOptions.outputParsable) {
parts.push('--parsable-style');
}
if (packOptions.compress) {
parts.push('--compress');
}
// Boolean flags that disable defaults (fileSummary and directoryStructure default to true)
if (packOptions.fileSummary === false) {
parts.push('--no-file-summary');
}
if (packOptions.directoryStructure === false) {
parts.push('--no-directory-structure');
}
// String options
if (packOptions.includePatterns?.trim()) {
parts.push(`--include ${shellEscape(packOptions.includePatterns.trim())}`);
}
if (packOptions.ignorePatterns?.trim()) {
parts.push(`--ignore ${shellEscape(packOptions.ignorePatterns.trim())}`);
}
}
return parts.join(' ');
}