@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
JavaScript
;
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