UNPKG

@microfox/cli

Version:

Universal CLI tool for creating modern TypeScript packages with npm availability checking

1 lines • 19 kB
{"version":3,"sources":["../src/commands/kickstart.ts","../src/utils/getProjectRoot.ts","../src/utils/npmChecker.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport readlineSync from 'readline-sync';\nimport inquirer from 'inquirer';\nimport { getWorkingDirectory } from '../utils/getProjectRoot';\nimport { checkPackageNameAndPrompt } from '../utils/npmChecker';\n\nasync function createAgentProject(agentName: string): Promise<void> {\n const workingDir = getWorkingDirectory();\n const agentDir = path.join(workingDir, agentName);\n\n if (fs.existsSync(agentDir)) {\n throw new Error(`Directory already exists at ${agentDir}`);\n }\n\n console.log(\n chalk.blue(\n `šŸš€ Creating agent ${chalk.bold(agentName)} at ${agentDir}\\n`,\n ),\n );\n\n fs.mkdirSync(agentDir, { recursive: true });\n\n const templatePath = path.resolve(__dirname, 'agent-template.txt');\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n\n const fileSections = templateContent.split('--- filename: ').slice(1);\n\n for (const section of fileSections) {\n const lines = section.split('\\n');\n const filePath = lines.shift()!.trim();\n const content = lines.join('\\n').replace(/<%= agentName %>/g, agentName);\n \n const destPath = path.join(agentDir, filePath);\n const destDir = path.dirname(destPath);\n\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`āœ… Created ${filePath}`));\n }\n}\n\nasync function createPackageProject(packageName: string): Promise<void> {\n const simpleName = packageName.includes('/')\n ? packageName.split('/')[1]\n : packageName;\n const titleName = simpleName\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n const description = `A TypeScript SDK for ${titleName}.`;\n const className = simpleName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('') + 'Sdk';\n\n const workingDir = getWorkingDirectory();\n const packageDir = path.join(workingDir, simpleName);\n\n if (fs.existsSync(packageDir)) {\n throw new Error(`Directory already exists at ${packageDir}`);\n }\n\n console.log(\n chalk.blue(\n `šŸš€ Creating package ${chalk.bold(packageName)} at ${packageDir}\\n`,\n ),\n );\n \n fs.mkdirSync(packageDir, { recursive: true });\n\n const templatePath = path.resolve(__dirname, 'package-template.txt');\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n\n const fileSections = templateContent.split('--- filename: ').slice(1);\n\n for (const section of fileSections) {\n const lines = section.split('\\n');\n const filePath = lines.shift()!.trim().replace(/<%= simpleName %>/g, simpleName);\n let content = lines.join('\\n');\n\n content = content.replace(/<%= packageName %>/g, packageName);\n content = content.replace(/<%= simpleName %>/g, simpleName);\n content = content.replace(/<%= titleName %>/g, titleName);\n content = content.replace(/<%= description %>/g, description);\n content = content.replace(/<%= className %>/g, className);\n\n const destPath = path.join(packageDir, filePath);\n const destDir = path.dirname(destPath);\n\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`āœ… Created ${filePath}`));\n }\n\n const docsDir = path.join(packageDir, 'docs');\n const docsConstructors = path.join(docsDir, 'constructors');\n const docsFunctions = path.join(docsDir, 'functions');\n\n fs.mkdirSync(docsDir, { recursive: true });\n fs.mkdirSync(docsConstructors, { recursive: true });\n fs.mkdirSync(docsFunctions, { recursive: true });\n}\n\nasync function createBackgroundAgentProject(agentName: string): Promise<void> {\n const workingDir = getWorkingDirectory();\n const agentDir = path.join(workingDir, agentName);\n \n if (fs.existsSync(agentDir)) {\n throw new Error(`Directory already exists at ${agentDir}`);\n }\n \n console.log(\n chalk.blue(\n `šŸš€ Creating background agent ${chalk.bold(agentName)} at ${agentDir}\\n`,\n ),\n );\n \n fs.mkdirSync(agentDir, { recursive: true });\n \n const templateDir = path.resolve(__dirname, 'background-agent');\n \n const copyTemplates = (src: string, dest: string) => {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name.replace(/\\.txt$/, ''));\n \n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyTemplates(srcPath, destPath);\n } else if (entry.name.endsWith('.txt')) {\n const templateContent = fs.readFileSync(srcPath, 'utf-8');\n const content = templateContent.replace(/<%= agentName %>/g, agentName);\n fs.writeFileSync(destPath, content);\n console.log(chalk.green(`āœ… Created ${path.relative(agentDir, destPath)}`));\n }\n }\n };\n \n copyTemplates(templateDir, agentDir);\n}\n\nexport async function kickstartCommand(): Promise<void> {\n console.log(chalk.cyan(\"šŸš€ Let's kickstart your new project!\\n\"));\n\n const { boilerplateType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'boilerplateType',\n message: 'Select boilerplate type:',\n choices: ['package', 'agent'],\n },\n ]);\n\n if (!boilerplateType) {\n console.log(chalk.yellow('Operation cancelled.'));\n return;\n }\n\n if (boilerplateType === 'agent') {\n const { agentType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'agentType',\n message: 'Select agent type:',\n choices: ['plain', 'background'],\n },\n ]);\n \n if(agentType === 'plain'){\n const agentName = readlineSync.question(\n chalk.yellow('šŸ“¦ Enter agent name: '),\n );\n \n if (!agentName.trim()) {\n throw new Error('Agent name cannot be empty');\n }\n await createAgentProject(agentName.trim());\n \n console.log(\n chalk.green(\n `\\nšŸŽ‰ Successfully created agent ${chalk.bold(agentName)}!`,\n ),\n );\n console.log(chalk.gray(`šŸ“ Located at ${path.join(getWorkingDirectory(), agentName)}`));\n console.log(chalk.yellow('\\nšŸ’” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${agentName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. Configure your env.json'));\n console.log(chalk.yellow(' 4. npm run dev'));\n console.log(chalk.yellow(' 5. Start developing your agent!'));\n\n } else if (agentType === 'background') {\n const agentName = readlineSync.question(\n chalk.yellow('šŸ“¦ Enter agent name: '),\n );\n \n if (!agentName.trim()) {\n throw new Error('Agent name cannot be empty');\n }\n await createBackgroundAgentProject(agentName.trim());\n\n console.log(\n chalk.green(\n `\\nšŸŽ‰ Successfully created background agent ${chalk.bold(agentName)}!`,\n ),\n );\n console.log(chalk.gray(`šŸ“ Located at ${path.join(getWorkingDirectory(), agentName)}`));\n console.log(chalk.yellow('\\nšŸ’” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${agentName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. Configure your env.json'));\n console.log(chalk.yellow(' 4. npm run dev'));\n console.log(chalk.yellow(' 5. Start developing your agent!'));\n }\n\n } else if (boilerplateType === 'package') {\n // Ask for package name interactively\n const packageName = readlineSync.question(\n chalk.yellow('šŸ“¦ Enter package name: '),\n );\n\n if (!packageName.trim()) {\n throw new Error('Package name cannot be empty');\n }\n\n // Check npm availability and get final package name\n const finalPackageName = await checkPackageNameAndPrompt(`@microfox/${packageName.trim()}`);\n await createPackageProject(finalPackageName);\n\n const simpleName = finalPackageName.includes('/')\n ? finalPackageName.split('/')[1]\n : finalPackageName;\n\n console.log(\n chalk.green(\n `\\nšŸŽ‰ Successfully created package ${chalk.bold(finalPackageName)}!`,\n ),\n );\n console.log(chalk.gray(`šŸ“ Located at ${path.join(getWorkingDirectory(), simpleName)}`));\n console.log(chalk.yellow('\\nšŸ’” Next steps:'));\n console.log(chalk.yellow(` 1. cd ${simpleName}`));\n console.log(chalk.yellow(' 2. npm install'));\n console.log(chalk.yellow(' 3. npm run build'));\n console.log(chalk.yellow(' 4. npm test'));\n console.log(chalk.yellow(' 5. Start developing your SDK!'));\n console.log(\n chalk.gray(\n `\\nšŸ“š Your package is ready to be published to npm as \"${finalPackageName}\"`,\n ),\n );\n } else {\n console.log(chalk.red('Invalid boilerplate type selected. Please choose \"package\" or \"agent\".'));\n }\n}\n","export const getWorkingDirectory = () => {\n // Return the current working directory where the CLI is executed\n // This allows creating packages in any directory\n return process.cwd();\n}; ","export async function isPackageNameAvailable(\n packageName: string,\n): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`https://registry.npmjs.org/${packageName}`, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // If we get a 200 response, the package exists\n if (response.ok) {\n return false;\n }\n\n // If we get a 404, the package doesn't exist (available)\n if (response.status === 404) {\n return true;\n }\n\n // For other status codes, assume unavailable for safety\n console.warn(\n `Warning: Unexpected status ${response.status} when checking npm availability for ${packageName}. Proceeding with caution.`,\n );\n return false;\n } catch (error: any) {\n // For network errors, timeouts, etc., assume unavailable for safety\n if (error.name === 'AbortError') {\n console.warn(\n `Warning: Timeout when checking npm availability for ${packageName}. Proceeding with caution.`,\n );\n } else {\n console.warn(\n `Warning: Could not check npm availability for ${packageName}. Proceeding with caution.`,\n );\n }\n return false;\n }\n}\n\nexport async function checkPackageNameAndPrompt(\n packageName: string,\n): Promise<string> {\n const readlineSync = require('readline-sync');\n let currentName = packageName?.startsWith('@microfox/')\n ? packageName\n : `@microfox/${packageName}`;\n\n while (true) {\n console.log(`šŸ” Checking npm availability for \"${currentName}\"...`);\n\n const isAvailable = await isPackageNameAvailable(currentName);\n\n if (isAvailable) {\n console.log(`āœ… Package name \"${currentName}\" is available on npm!`);\n return currentName;\n } else {\n console.log(`āŒ Package name \"${currentName}\" is already taken on npm.`);\n\n const newName = readlineSync.question(\n 'Please enter a new package name: ',\n );\n if (!newName || newName.trim() === '') {\n console.log('āŒ Invalid package name. Please try again.');\n continue;\n }\n\n currentName = newName.trim();\n }\n }\n}\n"],"mappings":"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","names":["readlineSync"]}