#!/usr/bin/env node import { Command } from 'commander'; import { createRequire } from 'module'; import { Logger } from './utils/logger.js'; // For ESM, we need to create require to load package.json // In CommonJS build, import.meta.url is undefined, so we use __filename fallback let requireUrl: string; if (typeof import.meta !== 'undefined' && import.meta.url) { requireUrl = import.meta.url; } else if (typeof __filename !== 'undefined') { requireUrl = __filename; } else { requireUrl = `file://${process.cwd()}/package.json`; } const require = createRequire(requireUrl); const packageJson = require('../package.json'); const program = new Command(); const logger = new Logger(); // Global options state interface GlobalOptions { verbose?: boolean | undefined; quiet?: boolean | undefined; dryRun?: boolean | undefined; } let globalOptions: GlobalOptions = {}; program .name('claudekit') .description('CLI tools for claudekit development workflow') .version(packageJson.version) .option('-v, --verbose', 'enable verbose output') .option('-q, --quiet', 'suppress non-error output') .option('-d, --dry-run', 'perform a dry run without making changes') .hook('preAction', (thisCommand) => { // Capture global options before any command runs const opts = thisCommand.opts(); globalOptions = { verbose: opts['verbose'] as boolean | undefined, quiet: opts['quiet'] as boolean | undefined, dryRun: opts['dryRun'] as boolean | undefined, }; // Configure logger based on global options if (globalOptions.quiet === true) { logger.setLevel('error'); } else if (globalOptions.verbose === true) { logger.setLevel('debug'); } }); // Setup command - initializes claudekit in a project program .command('setup') .description('Initialize claudekit in the current directory') .option('-f, --force', 'overwrite existing configuration') .option('-t, --template