UNPKG

create-director-app

Version:

NPX package to clone director scripts from script generation service

131 lines • 5 kB
#!/usr/bin/env node import { program } from "commander"; import chalk from "chalk"; import boxen from "boxen"; import inquirer from "inquirer"; import { fetchTemplate } from "./template-fetcher.js"; import { setupProject } from "./project-setup.js"; import { validateJWT } from "./auth.js"; async function main() { console.log(boxen(chalk.blue.bold("šŸš€ Create Director App\n") + chalk.gray("Generate Stagehand projects from your scripts"), { title: "Welcome", padding: 1, margin: 1, borderStyle: "round", borderColor: "blue", })); program .name("create-director-app") .description("Create projects from script generation service templates") .version("1.0.0") .argument("[token]", "JWT token for authentication") .option("-n, --project-name <name>", "Project name") .parse(); const args = program.args; const options = program.opts(); try { // Get token from argument or option let token = args[0] || options.token; if (!token) { const tokenInput = await inquirer.prompt([ { type: "password", name: "token", message: "Enter your JWT token:", validate: (input) => { if (!input.trim()) { return "Token is required"; } return true; }, }, ]); token = tokenInput.token; } if (!token) { console.error(chalk.red("āŒ Token is required")); process.exit(1); } const isValidToken = validateJWT(token); if (!isValidToken) { console.error(chalk.red("āŒ Invalid JWT token provided")); process.exit(1); } let projectName = options.projectName; if (!projectName) { const nameInput = await inquirer.prompt([ { type: "input", name: "projectName", message: "Enter project name:", default: "my-script-project", validate: (input) => { if (!input.trim()) { return "Project name is required"; } if (!/^[a-zA-Z0-9-_]+$/.test(input.trim())) { return "Project name can only contain letters, numbers, hyphens, and underscores"; } return true; }, }, ]); projectName = nameInput.projectName; } if (!projectName) { console.error(chalk.red("āŒ Project name is required")); process.exit(1); } let googleApiKey = options.googleApiKey; if (!googleApiKey) { const apiKeyInput = await inquirer.prompt([ { type: "password", name: "googleApiKey", message: "Enter your Google API key (will be saved to .env):", mask: "*", validate: (input) => { if (!input.trim()) { return "Google API key is required"; } return true; }, }, ]); googleApiKey = apiKeyInput.googleApiKey; } const endpoint = "https://director.ai/api/script/get"; console.log(chalk.blue("\nšŸ”„ Fetching template...")); const templateData = await fetchTemplate(token, endpoint); console.log(chalk.green("āœ… Template fetched successfully")); console.log(chalk.blue("\nšŸ“¦ Setting up project...")); await setupProject(projectName, templateData, googleApiKey); console.log(boxen(chalk.green.bold("šŸŽ‰ Project created successfully!\n\n") + chalk.white(`Project: ${projectName}\n`) + chalk.white(`Location: ./${projectName}\n\n`) + chalk.gray("Next steps:\n") + chalk.white(`1. cd ${projectName}\n`) + chalk.white("2. pnpm install\n") + chalk.white("3. Follow the README.md for further instructions"), { title: "Success", padding: 1, margin: 1, borderStyle: "round", borderColor: "green", })); } catch (error) { console.error(boxen(chalk.red.bold("āŒ Error\n\n") + chalk.white(error instanceof Error ? error.message : "An unknown error occurred"), { title: "Error", padding: 1, margin: 1, borderStyle: "round", borderColor: "red", })); process.exit(1); } } main().catch(console.error); //# sourceMappingURL=index.js.map