repostruc
Version:
Advanced CLI tool to visualize and analyze repository structure
81 lines (71 loc) • 3.31 kB
JavaScript
import chalk from "chalk";
import { Command } from "commander";
import { DEFAULT_OUTPUT } from "./src/constants.js";
import { RepoStructure } from "./src/repo-structure.js";
import { initCommand, checkCommand } from "./src/cli-commands.js";
const program = new Command();
program
.name("repostruc")
.description("Advanced CLI tool to visualize and analyze repository structure")
.version("0.3.0")
.argument("[directory]", "directory to analyze", ".")
.option("-o, --output <file>", "output file name", DEFAULT_OUTPUT)
.option("-i, --ignore <patterns>", "comma-separated patterns to ignore")
.option("--include <patterns>", "comma-separated patterns to include")
.option("--stats", "show detailed statistics")
.option("--files", "show complete file list")
.option("--sizes", "show file/directory sizes")
.option("--no-gitignore", "disable .gitignore support")
.option("--no-default-patterns", "disable default ignore patterns")
.option("--hidden", "include hidden files and directories")
.option("-d, --depth <number>", "maximum depth to traverse", parseInt)
.option("-f, --format <type>", "output format (txt, json, markdown)", "txt")
.option("--group-by-type", "group files by type in file list")
.option("--timestamps", "show file modification timestamps")
.option("--permissions", "show file permissions (Unix-style)")
.option("--exclude-empty", "exclude empty directories")
.option("--follow-symlinks", "follow symbolic links")
.option("--git-status", "show git status for files")
.option("--no-color", "disable colored output")
.option("--color-file", "enable colors in output file (may show ANSI codes)")
.option("--no-print", "don't print structure to terminal")
.option("--no-file", "don't save output to file, only print to terminal")
.option("--save-config", "save current options as default configuration")
.option("--debug", "enable debug output")
.action(async (directory, options) => {
try {
if (options.debug) {
console.log(chalk.gray('Debug: Options received:'), options);
console.log(chalk.gray('Debug: Directory:', directory));
}
// Store directory in options for later use
options.directory = directory;
const analyzer = new RepoStructure(options);
if (options.saveConfig) {
await analyzer.generateConfig();
return;
}
if (options.file === false) {
await analyzer.printOutput(directory);
} else {
await analyzer.saveOutput(directory);
}
} catch (error) {
console.error(chalk.red("Error:"), error.message);
if (options.debug) {
console.error(chalk.gray("Stack trace:"), error.stack);
}
process.exit(1);
}
});
// Add additional commands
program
.command("init")
.description("Initialize a .repostrucrc.json configuration file")
.action(initCommand);
program
.command("check")
.description("Check configuration and analyze potential issues")
.action(checkCommand);
program.parse();