UNPKG

@waltcow/claude-code-spec-workflow

Version:

Automated spec-driven workflow for Claude Code. Transforms feature ideas into complete implementations through Requirements โ†’ Design โ†’ Tasks โ†’ Implementation.

173 lines โ€ข 8.11 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const ora_1 = __importDefault(require("ora")); const setup_1 = require("./setup"); const utils_1 = require("./utils"); const program = new commander_1.Command(); program .name('claude-spec-setup') .description('Set up Claude Code Spec Workflow in your project') .version('1.1.2'); program .option('-p, --project <path>', 'Project directory', process.cwd()) .option('-f, --force', 'Force overwrite existing files') .option('-y, --yes', 'Skip confirmation prompts') .action(async (options) => { console.log(chalk_1.default.cyan.bold('๐Ÿš€ Claude Code Spec Workflow Setup')); console.log(chalk_1.default.gray('Claude Code Automated spec-driven development workflow')); console.log(); const projectPath = options.project; const spinner = (0, ora_1.default)('Analyzing project...').start(); try { // Detect project type const projectTypes = await (0, utils_1.detectProjectType)(projectPath); spinner.succeed(`Project analyzed: ${projectPath}`); if (projectTypes.length > 0) { console.log(chalk_1.default.blue(`๐Ÿ“Š Detected project type(s): ${projectTypes.join(', ')}`)); } // Check Claude Code availability const claudeAvailable = await (0, utils_1.validateClaudeCode)(); if (claudeAvailable) { console.log(chalk_1.default.green('โœ“ Claude Code is available')); } else { console.log(chalk_1.default.yellow('โš ๏ธ Claude Code not found. Please install Claude Code first.')); console.log(chalk_1.default.gray(' Visit: https://docs.anthropic.com/claude-code')); } // Check for existing .claude directory const setup = new setup_1.SpecWorkflowSetup(projectPath); const claudeExists = await setup.claudeDirectoryExists(); if (claudeExists && !options.force) { if (!options.yes) { const { proceed } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'proceed', message: '.claude directory already exists. Overwrite?', default: false } ]); if (!proceed) { console.log(chalk_1.default.yellow('Setup cancelled.')); process.exit(0); } } } // Confirm setup if (!options.yes) { console.log(); console.log(chalk_1.default.cyan('This will create:')); console.log(chalk_1.default.gray(' ๐Ÿ“ .claude/ directory structure')); console.log(chalk_1.default.gray(' ๐Ÿ“ 7 slash commands for spec workflow')); console.log(chalk_1.default.gray(' ๐Ÿค– Auto-generated task commands')); console.log(chalk_1.default.gray(' ๐Ÿ“‹ Document templates')); console.log(chalk_1.default.gray(' ๐Ÿ”ง Platform-specific command generation scripts')); console.log(chalk_1.default.gray(' โš™๏ธ Configuration files')); console.log(chalk_1.default.gray(' ๐Ÿ“– CLAUDE.md with workflow instructions')); console.log(); const { confirm } = await inquirer_1.default.prompt([ { type: 'confirm', name: 'confirm', message: 'Proceed with setup?', default: true } ]); if (!confirm) { console.log(chalk_1.default.yellow('Setup cancelled.')); process.exit(0); } } // Run setup const setupSpinner = (0, ora_1.default)('Setting up spec workflow...').start(); await setup.runSetup(); setupSpinner.succeed('Setup complete!'); // Success message console.log(); console.log(chalk_1.default.green.bold('โœ… Spec Workflow installed successfully!')); console.log(); console.log(chalk_1.default.cyan('Available commands:')); console.log(chalk_1.default.gray(' /spec-create <feature-name> - Create a new spec')); console.log(chalk_1.default.gray(' /spec-requirements - Generate requirements')); console.log(chalk_1.default.gray(' /spec-design - Generate design')); console.log(chalk_1.default.gray(' /spec-tasks - Generate tasks')); console.log(chalk_1.default.gray(' /spec-execute <task-id> - Execute tasks')); console.log(chalk_1.default.gray(' /{spec-name}-task-{id} - Auto-generated task commands')); console.log(chalk_1.default.gray(' /spec-status - Show status')); console.log(chalk_1.default.gray(' /spec-list - List all specs')); console.log(); console.log(chalk_1.default.yellow('Next steps:')); console.log(chalk_1.default.gray('1. Run: claude')); console.log(chalk_1.default.gray('2. Try: /spec-create my-feature')); console.log(); console.log(chalk_1.default.blue('๐Ÿ“– For help, see the README or run /spec-list')); } catch (error) { spinner.fail('Setup failed'); console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : error); process.exit(1); } }); // Add test command program .command('test') .description('Test the setup in a temporary directory') .action(async () => { console.log(chalk_1.default.cyan('๐Ÿงช Testing setup...')); const os = await Promise.resolve().then(() => __importStar(require('os'))); const path = await Promise.resolve().then(() => __importStar(require('path'))); const fs = await Promise.resolve().then(() => __importStar(require('fs/promises'))); const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'claude-spec-test-')); try { const setup = new setup_1.SpecWorkflowSetup(tempDir); await setup.runSetup(); console.log(chalk_1.default.green('โœ… Test completed successfully!')); console.log(chalk_1.default.gray(`Test directory: ${tempDir}`)); } catch (error) { console.error(chalk_1.default.red('โŒ Test failed:'), error); process.exit(1); } }); program.parse(); //# sourceMappingURL=cli.js.map