create-director-app
Version:
NPX package to clone director scripts from script generation service
131 lines ⢠5 kB
JavaScript
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