@agentforge/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/utils/prompts.ts","../src/utils/fs.ts","../src/utils/package-manager.ts","../src/utils/git.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/test.ts","../src/commands/lint.ts","../src/commands/agent/create.ts","../src/commands/agent/list.ts","../src/commands/agent/test.ts","../src/commands/agent/deploy.ts","../src/commands/tool/create.ts","../src/commands/tool/list.ts","../src/commands/tool/test.ts","../src/commands/tool/publish.ts","../src/index.ts"],"names":["fs","path","execa","chalk","testCommand","generateTestContent","capitalize","extractDescription"],"mappings":"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","file":"index.js","sourcesContent":["import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\nexport class Logger {\n private spinner: Ora | null = null;\n\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n success(message: string): void {\n console.log(chalk.green('✔'), message);\n }\n\n warn(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n }\n\n error(message: string): void {\n console.log(chalk.red('✖'), message);\n }\n\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.log(chalk.gray('🐛'), message);\n }\n }\n\n startSpinner(message: string): void {\n this.spinner = ora(message).start();\n }\n\n updateSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.text = message;\n }\n }\n\n succeedSpinner(message?: string): void {\n if (this.spinner) {\n this.spinner.succeed(message);\n this.spinner = null;\n }\n }\n\n failSpinner(message?: string): void {\n if (this.spinner) {\n this.spinner.fail(message);\n this.spinner = null;\n }\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n }\n }\n\n newLine(): void {\n console.log();\n }\n\n divider(): void {\n console.log(chalk.gray('─'.repeat(50)));\n }\n\n header(message: string): void {\n this.newLine();\n console.log(chalk.bold.cyan(message));\n this.divider();\n }\n\n code(code: string): void {\n console.log(chalk.gray(' ' + code));\n }\n\n list(items: string[]): void {\n items.forEach((item) => {\n console.log(chalk.gray(' •'), item);\n });\n }\n}\n\nexport const logger = new Logger();\n\n","import inquirer from 'inquirer';\nimport type { PackageManager } from './package-manager.js';\n\nexport interface ProjectPromptAnswers {\n projectName: string;\n template: 'minimal' | 'full' | 'api' | 'cli';\n packageManager: PackageManager;\n installDependencies: boolean;\n initGit: boolean;\n author?: string;\n description?: string;\n}\n\nexport async function promptProjectSetup(defaults: Partial<ProjectPromptAnswers> = {}): Promise<ProjectPromptAnswers> {\n return inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'Project name:',\n default: defaults.projectName || 'my-agent',\n validate: (input: string) => {\n if (!input) return 'Project name is required';\n if (!/^[a-z0-9-]+$/.test(input)) {\n return 'Project name must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n },\n },\n {\n type: 'list',\n name: 'template',\n message: 'Select a template:',\n choices: [\n { name: 'Minimal Starter - Basic ReAct agent', value: 'minimal' },\n { name: 'Full-Featured App - Multi-agent system with all features', value: 'full' },\n { name: 'API Service - Express/Fastify API with agents', value: 'api' },\n { name: 'CLI Tool - Command-line agent application', value: 'cli' },\n ],\n default: defaults.template || 'minimal',\n },\n {\n type: 'list',\n name: 'packageManager',\n message: 'Package manager:',\n choices: ['pnpm', 'npm', 'yarn'],\n default: defaults.packageManager || 'pnpm',\n },\n {\n type: 'confirm',\n name: 'installDependencies',\n message: 'Install dependencies?',\n default: defaults.installDependencies !== false,\n },\n {\n type: 'confirm',\n name: 'initGit',\n message: 'Initialize git repository?',\n default: defaults.initGit !== false,\n },\n {\n type: 'input',\n name: 'author',\n message: 'Author name (optional):',\n default: defaults.author,\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project description (optional):',\n default: defaults.description,\n },\n ]);\n}\n\nexport interface AgentPromptAnswers {\n name: string;\n pattern: 'react' | 'plan-execute' | 'reflection' | 'multi-agent';\n description?: string;\n generateTests: boolean;\n}\n\nexport async function promptAgentSetup(defaults: Partial<AgentPromptAnswers> = {}): Promise<AgentPromptAnswers> {\n return inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Agent name:',\n default: defaults.name,\n validate: (input: string) => {\n if (!input) return 'Agent name is required';\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\n return 'Agent name must start with a letter and contain only letters and numbers';\n }\n return true;\n },\n },\n {\n type: 'list',\n name: 'pattern',\n message: 'Agent pattern:',\n choices: [\n { name: 'ReAct - Reasoning and Acting', value: 'react' },\n { name: 'Plan-Execute - Planning and Execution', value: 'plan-execute' },\n { name: 'Reflection - Generate, Reflect, Revise', value: 'reflection' },\n { name: 'Multi-Agent - Supervisor and Workers', value: 'multi-agent' },\n ],\n default: defaults.pattern || 'react',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Agent description (optional):',\n default: defaults.description,\n },\n {\n type: 'confirm',\n name: 'generateTests',\n message: 'Generate tests?',\n default: defaults.generateTests !== false,\n },\n ]);\n}\n\nexport interface ToolPromptAnswers {\n name: string;\n category: 'web' | 'data' | 'file' | 'utility';\n description: string;\n generateTests: boolean;\n}\n\nexport async function promptToolSetup(defaults: Partial<ToolPromptAnswers> = {}): Promise<ToolPromptAnswers> {\n return inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Tool name:',\n default: defaults.name,\n validate: (input: string) => {\n if (!input) return 'Tool name is required';\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\n return 'Tool name must start with a letter and contain only letters and numbers';\n }\n return true;\n },\n },\n {\n type: 'list',\n name: 'category',\n message: 'Tool category:',\n choices: [\n { name: 'Web - HTTP, scraping, parsing', value: 'web' },\n { name: 'Data - JSON, CSV, XML processing', value: 'data' },\n { name: 'File - File operations', value: 'file' },\n { name: 'Utility - General utilities', value: 'utility' },\n ],\n default: defaults.category || 'utility',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Tool description:',\n default: defaults.description,\n validate: (input: string) => {\n if (!input) return 'Tool description is required';\n return true;\n },\n },\n {\n type: 'confirm',\n name: 'generateTests',\n message: 'Generate tests?',\n default: defaults.generateTests !== false,\n },\n ]);\n}\n\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.ensureDir(dir);\n}\n\nexport async function copyTemplate(\n templatePath: string,\n targetPath: string,\n replacements: Record<string, string> = {}\n): Promise<void> {\n await fs.ensureDir(targetPath);\n\n const files = await glob('**/*', {\n cwd: templatePath,\n dot: true,\n nodir: true,\n });\n\n for (const file of files) {\n const sourcePath = path.join(templatePath, file);\n const destPath = path.join(targetPath, file);\n\n await fs.ensureDir(path.dirname(destPath));\n\n let content = await fs.readFile(sourcePath, 'utf-8');\n\n // Apply replacements\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`{{${key}}}`, 'g'), value);\n }\n\n await fs.writeFile(destPath, content);\n }\n}\n\nexport async function writeJson(filePath: string, data: any): Promise<void> {\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n\nexport async function readJson<T = any>(filePath: string): Promise<T> {\n return fs.readJson(filePath);\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\nexport async function removeDir(dir: string): Promise<void> {\n await fs.remove(dir);\n}\n\nexport async function findFiles(\n pattern: string,\n cwd: string = process.cwd()\n): Promise<string[]> {\n return glob(pattern, { cwd });\n}\n\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content);\n}\n\nexport function getTemplatePath(template: string): string {\n return path.join(__dirname, '..', '..', 'templates', template);\n}\n\nexport async function isEmptyDir(dir: string): Promise<boolean> {\n if (!(await pathExists(dir))) {\n return true;\n }\n\n const files = await fs.readdir(dir);\n return files.length === 0;\n}\n\n","import { execa } from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn';\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManager> {\n // Check for lock files\n if (await fs.pathExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (await fs.pathExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n if (await fs.pathExists(path.join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Check if package managers are available\n try {\n await execa('pnpm', ['--version']);\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n await execa('yarn', ['--version']);\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n return 'npm';\n}\n\nexport async function installDependencies(\n cwd: string,\n packageManager: PackageManager = 'pnpm'\n): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['install'],\n pnpm: ['install'],\n yarn: ['install'],\n };\n\n await execa(packageManager, commands[packageManager], {\n cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function addDependency(\n cwd: string,\n dependency: string,\n options: {\n dev?: boolean;\n packageManager?: PackageManager;\n } = {}\n): Promise<void> {\n const pm = options.packageManager || (await detectPackageManager(cwd));\n const isDev = options.dev || false;\n\n const commands: Record<PackageManager, string[]> = {\n npm: ['install', isDev ? '--save-dev' : '--save', dependency],\n pnpm: ['add', isDev ? '-D' : '', dependency].filter(Boolean),\n yarn: ['add', isDev ? '--dev' : '', dependency].filter(Boolean),\n };\n\n await execa(pm, commands[pm], {\n cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function runScript(\n cwd: string,\n script: string,\n packageManager: PackageManager = 'pnpm'\n): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['run', script],\n pnpm: ['run', script],\n yarn: ['run', script],\n };\n\n await execa(packageManager, commands[packageManager], {\n cwd,\n stdio: 'inherit',\n });\n}\n\nexport function getInstallCommand(packageManager: PackageManager): string {\n const commands: Record<PackageManager, string> = {\n npm: 'npm install',\n pnpm: 'pnpm install',\n yarn: 'yarn install',\n };\n\n return commands[packageManager];\n}\n\nexport function getRunCommand(packageManager: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n npm: `npm run ${script}`,\n pnpm: `pnpm ${script}`,\n yarn: `yarn ${script}`,\n };\n\n return commands[packageManager];\n}\n\n","import { execa } from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa('git', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isGitRepository(cwd: string): Promise<boolean> {\n try {\n await execa('git', ['rev-parse', '--git-dir'], { cwd });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function initGitRepository(cwd: string): Promise<void> {\n await execa('git', ['init'], { cwd });\n \n // Create .gitignore\n const gitignore = `# Dependencies\nnode_modules/\n.pnp\n.pnp.js\n\n# Testing\ncoverage/\n.nyc_output/\n\n# Production\ndist/\nbuild/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.vscode/\n.idea/\n*.swp\n*.swo\n*~\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\nlogs/\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# Misc\n.cache/\n.temp/\n.tmp/\n`;\n\n await fs.writeFile(path.join(cwd, '.gitignore'), gitignore);\n}\n\nexport async function createInitialCommit(cwd: string): Promise<void> {\n await execa('git', ['add', '.'], { cwd });\n await execa('git', ['commit', '-m', 'Initial commit from AgentForge CLI'], { cwd });\n}\n\nexport async function getGitUserInfo(): Promise<{ name?: string; email?: string }> {\n try {\n const { stdout: name } = await execa('git', ['config', 'user.name']);\n const { stdout: email } = await execa('git', ['config', 'user.email']);\n return { name, email };\n } catch {\n return {};\n }\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { promptProjectSetup } from '../utils/prompts.js';\nimport { copyTemplate, ensureDir, isEmptyDir, writeJson, readJson, getTemplatePath } from '../utils/fs.js';\nimport { installDependencies, getRunCommand, type PackageManager } from '../utils/package-manager.js';\nimport { initGitRepository, createInitialCommit, isGitInstalled } from '../utils/git.js';\n\ninterface CreateOptions {\n template?: 'minimal' | 'full' | 'api' | 'cli';\n packageManager?: PackageManager;\n install?: boolean;\n git?: boolean;\n}\n\nexport async function createCommand(\n projectName: string,\n options: CreateOptions\n): Promise<void> {\n try {\n logger.header('🚀 Create AgentForge Project');\n\n // Validate project name\n if (!projectName) {\n logger.error('Project name is required');\n process.exit(1);\n }\n\n const targetPath = path.join(process.cwd(), projectName);\n\n // Check if directory exists and is not empty\n if (!(await isEmptyDir(targetPath))) {\n logger.error(`Directory ${projectName} already exists and is not empty`);\n process.exit(1);\n }\n\n // Prompt for project setup if not all options provided\n const answers = await promptProjectSetup({\n projectName,\n template: options.template,\n packageManager: options.packageManager,\n installDependencies: options.install,\n initGit: options.git,\n });\n\n logger.newLine();\n logger.info(`Creating project: ${chalk.cyan(answers.projectName)}`);\n logger.info(`Template: ${chalk.cyan(answers.template)}`);\n logger.info(`Package manager: ${chalk.cyan(answers.packageManager)}`);\n logger.newLine();\n\n // Create project directory\n logger.startSpinner('Creating project directory...');\n await ensureDir(targetPath);\n logger.succeedSpinner('Project directory created');\n\n // Copy template\n logger.startSpinner('Copying template files...');\n const templatePath = getTemplatePath(answers.template);\n await copyTemplate(templatePath, targetPath, {\n PROJECT_NAME: answers.projectName,\n AUTHOR: answers.author || '',\n DESCRIPTION: answers.description || `AgentForge project created with ${answers.template} template`,\n PACKAGE_MANAGER: answers.packageManager,\n });\n logger.succeedSpinner('Template files copied');\n\n // Update package.json\n logger.startSpinner('Updating package.json...');\n const packageJsonPath = path.join(targetPath, 'package.json');\n const packageJson = await readJson<any>(packageJsonPath);\n packageJson.name = answers.projectName;\n if (answers.author) {\n packageJson.author = answers.author;\n }\n if (answers.description) {\n packageJson.description = answers.description;\n }\n await writeJson(packageJsonPath, packageJson);\n logger.succeedSpinner('package.json updated');\n\n // Install dependencies\n if (answers.installDependencies) {\n logger.startSpinner('Installing dependencies...');\n try {\n await installDependencies(targetPath, answers.packageManager);\n logger.succeedSpinner('Dependencies installed');\n } catch (error) {\n logger.failSpinner('Failed to install dependencies');\n logger.warn('You can install them manually later');\n }\n }\n\n // Initialize git\n if (answers.initGit && (await isGitInstalled())) {\n logger.startSpinner('Initializing git repository...');\n try {\n await initGitRepository(targetPath);\n await createInitialCommit(targetPath);\n logger.succeedSpinner('Git repository initialized');\n } catch (error) {\n logger.failSpinner('Failed to initialize git');\n logger.warn('You can initialize it manually later');\n }\n }\n\n // Success message\n logger.newLine();\n logger.success(chalk.bold.green('✨ Project created successfully!'));\n logger.newLine();\n logger.header('📝 Next Steps');\n logger.list([\n `cd ${answers.projectName}`,\n answers.installDependencies\n ? getRunCommand(answers.packageManager, 'dev')\n : `${answers.packageManager} install`,\n ]);\n logger.newLine();\n logger.info('Happy coding! 🎉');\n } catch (error: any) {\n logger.error(`Failed to create project: ${error.message}`);\n process.exit(1);\n }\n}\n\n","import { logger } from '../utils/logger.js';\nimport { runScript, detectPackageManager } from '../utils/package-manager.js';\n\ninterface DevOptions {\n port?: string;\n open?: boolean;\n}\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n try {\n logger.header('🚀 Starting Development Server');\n\n const cwd = process.cwd();\n const packageManager = await detectPackageManager(cwd);\n\n logger.info(`Port: ${options.port || '3000'}`);\n logger.info(`Package manager: ${packageManager}`);\n logger.newLine();\n\n logger.startSpinner('Starting development server...');\n\n // Set environment variables\n if (options.port) {\n process.env.PORT = options.port;\n }\n\n await runScript(cwd, 'dev', packageManager);\n\n logger.succeedSpinner('Development server started');\n } catch (error: any) {\n logger.failSpinner('Failed to start development server');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import { logger } from '../utils/logger.js';\nimport { runScript, detectPackageManager } from '../utils/package-manager.js';\n\ninterface BuildOptions {\n minify?: boolean;\n sourcemap?: boolean;\n}\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n try {\n logger.header('📦 Building for Production');\n\n const cwd = process.cwd();\n const packageManager = await detectPackageManager(cwd);\n\n logger.info(`Minify: ${options.minify !== false ? 'Yes' : 'No'}`);\n logger.info(`Sourcemap: ${options.sourcemap !== false ? 'Yes' : 'No'}`);\n logger.newLine();\n\n logger.startSpinner('Building project...');\n\n // Set environment variables\n process.env.NODE_ENV = 'production';\n if (options.minify === false) {\n process.env.NO_MINIFY = 'true';\n }\n if (options.sourcemap === false) {\n process.env.NO_SOURCEMAP = 'true';\n }\n\n await runScript(cwd, 'build', packageManager);\n\n logger.succeedSpinner('Build completed successfully');\n logger.newLine();\n logger.success('✨ Production build ready!');\n } catch (error: any) {\n logger.failSpinner('Build failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import { logger } from '../utils/logger.js';\nimport { runScript, detectPackageManager } from '../utils/package-manager.js';\n\ninterface TestOptions {\n watch?: boolean;\n ui?: boolean;\n coverage?: boolean;\n}\n\nexport async function testCommand(options: TestOptions): Promise<void> {\n try {\n logger.header('🧪 Running Tests');\n\n const cwd = process.cwd();\n const packageManager = await detectPackageManager(cwd);\n\n logger.info(`Watch mode: ${options.watch ? 'Yes' : 'No'}`);\n logger.info(`UI: ${options.ui ? 'Yes' : 'No'}`);\n logger.info(`Coverage: ${options.coverage ? 'Yes' : 'No'}`);\n logger.newLine();\n\n logger.startSpinner('Running tests...');\n\n // Determine which test script to run\n let script = 'test';\n if (options.ui) {\n script = 'test:ui';\n } else if (options.coverage) {\n script = 'test:coverage';\n } else if (options.watch) {\n script = 'test:watch';\n }\n\n await runScript(cwd, script, packageManager);\n\n logger.succeedSpinner('Tests completed');\n } catch (error: any) {\n logger.failSpinner('Tests failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import { logger } from '../utils/logger.js';\nimport { runScript, detectPackageManager } from '../utils/package-manager.js';\n\ninterface LintOptions {\n fix?: boolean;\n format?: boolean;\n}\n\nexport async function lintCommand(options: LintOptions): Promise<void> {\n try {\n logger.header('🔍 Linting Code');\n\n const cwd = process.cwd();\n const packageManager = await detectPackageManager(cwd);\n\n logger.info(`Auto-fix: ${options.fix ? 'Yes' : 'No'}`);\n logger.info(`Format: ${options.format !== false ? 'Yes' : 'No'}`);\n logger.newLine();\n\n // Run linter\n logger.startSpinner('Running linter...');\n try {\n await runScript(cwd, options.fix ? 'lint:fix' : 'lint', packageManager);\n logger.succeedSpinner('Linting completed');\n } catch (error) {\n logger.failSpinner('Linting found issues');\n if (!options.fix) {\n logger.info('Run with --fix to automatically fix issues');\n }\n }\n\n // Run formatter\n if (options.format !== false) {\n logger.startSpinner('Formatting code...');\n try {\n await runScript(cwd, 'format', packageManager);\n logger.succeedSpinner('Formatting completed');\n } catch (error) {\n logger.failSpinner('Formatting failed');\n }\n }\n\n logger.newLine();\n logger.success('✨ Code quality check completed!');\n } catch (error: any) {\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { promptAgentSetup } from '../../utils/prompts.js';\nimport { writeFile, ensureDir } from '../../utils/fs.js';\n\ninterface AgentCreateOptions {\n pattern?: 'react' | 'plan-execute' | 'reflection' | 'multi-agent';\n test?: boolean;\n}\n\nexport async function agentCreateCommand(\n name: string,\n options: AgentCreateOptions\n): Promise<void> {\n try {\n logger.header('🤖 Create Agent');\n\n // Prompt for agent setup\n const answers = await promptAgentSetup({\n name,\n pattern: options.pattern,\n generateTests: options.test,\n });\n\n logger.newLine();\n logger.info(`Creating agent: ${chalk.cyan(answers.name)}`);\n logger.info(`Pattern: ${chalk.cyan(answers.pattern)}`);\n logger.newLine();\n\n const cwd = process.cwd();\n const agentDir = path.join(cwd, 'src', 'agents');\n const agentFile = path.join(agentDir, `${answers.name}.ts`);\n\n // Create agent file\n logger.startSpinner('Creating agent file...');\n await ensureDir(agentDir);\n\n const agentContent = generateAgentContent(answers.name, answers.pattern, answers.description);\n await writeFile(agentFile, agentContent);\n\n logger.succeedSpinner('Agent file created');\n\n // Create test file\n if (answers.generateTests) {\n logger.startSpinner('Creating test file...');\n const testDir = path.join(cwd, 'tests', 'agents');\n const testFile = path.join(testDir, `${answers.name}.test.ts`);\n await ensureDir(testDir);\n\n const testContent = generateTestContent(answers.name, answers.pattern);\n await writeFile(testFile, testContent);\n\n logger.succeedSpinner('Test file created');\n }\n\n logger.newLine();\n logger.success(chalk.bold.green('✨ Agent created successfully!'));\n logger.newLine();\n logger.header('📝 Next Steps');\n logger.list([\n `Edit ${chalk.cyan(`src/agents/${answers.name}.ts`)} to customize your agent`,\n answers.generateTests\n ? `Run ${chalk.cyan(`pnpm test tests/agents/${answers.name}.test.ts`)} to test your agent`\n : '',\n ].filter(Boolean));\n } catch (error: any) {\n logger.error(`Failed to create agent: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction generateAgentContent(\n name: string,\n pattern: string,\n description?: string\n): string {\n const patterns: Record<string, string> = {\n 'react': `import { createReActAgent } from '@agentforge/patterns';\nimport { ChatOpenAI } from '@langchain/openai';\n\n/**\n * ${description || `${name} agent using ReAct pattern`}\n */\nexport async function create${capitalize(name)}Agent() {\n const model = new ChatOpenAI({\n modelName: 'gpt-4',\n temperature: 0,\n });\n\n const agent = createReActAgent({\n model,\n tools: [],\n // Add your configuration here\n });\n\n return agent;\n}\n`,\n 'plan-execute': `import { createPlanExecuteAgent } from '@agentforge/patterns';\nimport { ChatOpenAI } from '@langchain/openai';\n\n/**\n * ${description || `${name} agent using Plan-Execute pattern`}\n */\nexport async function create${capitalize(name)}Agent() {\n const model = new ChatOpenAI({\n modelName: 'gpt-4',\n temperature: 0,\n });\n\n const agent = createPlanExecuteAgent({\n model,\n tools: [],\n // Add your configuration here\n });\n\n return agent;\n}\n`,\n 'reflection': `import { createReflectionAgent } from '@agentforge/patterns';\nimport { ChatOpenAI } from '@langchain/openai';\n\n/**\n * ${description || `${name} agent using Reflection pattern`}\n */\nexport async function create${capitalize(name)}Agent() {\n const model = new ChatOpenAI({\n modelName: 'gpt-4',\n temperature: 0,\n });\n\n const agent = createReflectionAgent({\n model,\n // Add your configuration here\n });\n\n return agent;\n}\n`,\n 'multi-agent': `import { createMultiAgentSystem } from '@agentforge/patterns';\nimport { ChatOpenAI } from '@langchain/openai';\n\n/**\n * ${description || `${name} multi-agent system`}\n */\nexport async function create${capitalize(name)}System() {\n const model = new ChatOpenAI({\n modelName: 'gpt-4',\n temperature: 0,\n });\n\n const system = createMultiAgentSystem({\n model,\n workers: [],\n // Add your configuration here\n });\n\n return system;\n}\n`,\n };\n\n return patterns[pattern] || patterns['react'];\n}\n\nfunction generateTestContent(name: string, pattern: string): string {\n return `import { describe, it, expect } from 'vitest';\nimport { create${capitalize(name)}${pattern === 'multi-agent' ? 'System' : 'Agent'} } from '../../src/agents/${name}.js';\n\ndescribe('${capitalize(name)} ${pattern === 'multi-agent' ? 'System' : 'Agent'}', () => {\n it('should create agent successfully', async () => {\n const agent = await create${capitalize(name)}${pattern === 'multi-agent' ? 'System' : 'Agent'}();\n expect(agent).toBeDefined();\n });\n\n // Add more tests here\n});\n`;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { findFiles, readFile } from '../../utils/fs.js';\n\ninterface AgentListOptions {\n verbose?: boolean;\n}\n\nexport async function agentListCommand(options: AgentListOptions): Promise<void> {\n try {\n logger.header('📋 List Agents');\n\n const cwd = process.cwd();\n const agentDir = path.join(cwd, 'src', 'agents');\n\n // Find all agent files\n const agentFiles = await findFiles('*.ts', agentDir);\n\n if (agentFiles.length === 0) {\n logger.warn('No agents found');\n logger.info(`Create an agent with: ${chalk.cyan('agentforge agent:create <name>')}`);\n return;\n }\n\n logger.info(`Found ${chalk.cyan(agentFiles.length)} agent(s):\\n`);\n\n for (const file of agentFiles) {\n const agentName = path.basename(file, '.ts');\n const agentPath = path.join(agentDir, file);\n\n if (options.verbose) {\n // Read file to extract pattern and description\n const content = await readFile(agentPath);\n const pattern = extractPattern(content);\n const description = extractDescription(content);\n\n logger.info(chalk.bold.cyan(` ${agentName}`));\n if (pattern) {\n logger.info(` Pattern: ${pattern}`);\n }\n if (description) {\n logger.info(` Description: ${description}`);\n }\n logger.info(` Path: ${chalk.gray(agentPath)}`);\n logger.newLine();\n } else {\n logger.info(` • ${chalk.cyan(agentName)}`);\n }\n }\n\n if (!options.verbose) {\n logger.newLine();\n logger.info(`Use ${chalk.cyan('--verbose')} for more details`);\n }\n } catch (error: any) {\n logger.error(`Failed to list agents: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction extractPattern(content: string): string | null {\n const patterns = ['ReAct', 'Plan-Execute', 'Reflection', 'Multi-Agent'];\n for (const pattern of patterns) {\n if (content.includes(`create${pattern.replace('-', '')}Agent`)) {\n return pattern;\n }\n }\n return null;\n}\n\nfunction extractDescription(content: string): string | null {\n const match = content.match(/\\/\\*\\*\\s*\\n\\s*\\*\\s*(.+?)\\s*\\n/);\n return match ? match[1] : null;\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { runScript, detectPackageManager } from '../../utils/package-manager.js';\nimport { pathExists } from '../../utils/fs.js';\n\ninterface AgentTestOptions {\n watch?: boolean;\n}\n\nexport async function agentTestCommand(\n name: string,\n options: AgentTestOptions\n): Promise<void> {\n try {\n logger.header('🧪 Test Agent');\n\n const cwd = process.cwd();\n const testFile = path.join(cwd, 'tests', 'agents', `${name}.test.ts`);\n\n // Check if test file exists\n if (!(await pathExists(testFile))) {\n logger.error(`Test file not found: ${testFile}`);\n logger.info(`Create tests with: ${chalk.cyan(`agentforge agent:create ${name} --test`)}`);\n process.exit(1);\n }\n\n logger.info(`Testing agent: ${chalk.cyan(name)}`);\n logger.info(`Watch mode: ${options.watch ? 'Yes' : 'No'}`);\n logger.newLine();\n\n const packageManager = await detectPackageManager(cwd);\n\n logger.startSpinner('Running tests...');\n\n // Run tests for specific file\n const testCommand = options.watch ? 'test:watch' : 'test';\n process.env.TEST_FILE = testFile;\n\n await runScript(cwd, testCommand, packageManager);\n\n logger.succeedSpinner('Tests completed');\n } catch (error: any) {\n logger.failSpinner('Tests failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\n\ninterface AgentDeployOptions {\n environment?: string;\n dryRun?: boolean;\n}\n\nexport async function agentDeployCommand(\n name: string,\n options: AgentDeployOptions\n): Promise<void> {\n try {\n logger.header('🚀 Deploy Agent');\n\n logger.info(`Agent: ${chalk.cyan(name)}`);\n logger.info(`Environment: ${chalk.cyan(options.environment || 'production')}`);\n logger.info(`Dry run: ${options.dryRun ? 'Yes' : 'No'}`);\n logger.newLine();\n\n if (options.dryRun) {\n logger.warn('Dry run mode - no actual deployment will occur');\n logger.newLine();\n }\n\n logger.startSpinner('Preparing deployment...');\n\n // TODO: Implement actual deployment logic\n // This would typically involve:\n // 1. Building the agent\n // 2. Running tests\n // 3. Packaging the agent\n // 4. Deploying to the target environment (AWS Lambda, Cloud Run, etc.)\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n logger.succeedSpinner('Deployment prepared');\n\n if (!options.dryRun) {\n logger.startSpinner('Deploying agent...');\n await new Promise((resolve) => setTimeout(resolve, 2000));\n logger.succeedSpinner('Agent deployed successfully');\n }\n\n logger.newLine();\n logger.success(chalk.bold.green('✨ Deployment completed!'));\n logger.newLine();\n logger.info('Note: Actual deployment implementation coming soon');\n logger.info('For now, please use the deployment templates in the templates/deployment directory');\n } catch (error: any) {\n logger.failSpinner('Deployment failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { promptToolSetup } from '../../utils/prompts.js';\nimport { writeFile, ensureDir } from '../../utils/fs.js';\n\ninterface ToolCreateOptions {\n category?: 'web' | 'data' | 'file' | 'utility';\n test?: boolean;\n}\n\nexport async function toolCreateCommand(\n name: string,\n options: ToolCreateOptions\n): Promise<void> {\n try {\n logger.header('🔧 Create Tool');\n\n // Prompt for tool setup\n const answers = await promptToolSetup({\n name,\n category: options.category,\n generateTests: options.test,\n });\n\n logger.newLine();\n logger.info(`Creating tool: ${chalk.cyan(answers.name)}`);\n logger.info(`Category: ${chalk.cyan(answers.category)}`);\n logger.newLine();\n\n const cwd = process.cwd();\n const toolDir = path.join(cwd, 'src', 'tools');\n const toolFile = path.join(toolDir, `${answers.name}.ts`);\n\n // Create tool file\n logger.startSpinner('Creating tool file...');\n await ensureDir(toolDir);\n\n const toolContent = generateToolContent(answers.name, answers.category, answers.description);\n await writeFile(toolFile, toolContent);\n\n logger.succeedSpinner('Tool file created');\n\n // Create test file\n if (answers.generateTests) {\n logger.startSpinner('Creating test file...');\n const testDir = path.join(cwd, 'tests', 'tools');\n const testFile = path.join(testDir, `${answers.name}.test.ts`);\n await ensureDir(testDir);\n\n const testContent = generateTestContent(answers.name);\n await writeFile(testFile, testContent);\n\n logger.succeedSpinner('Test file created');\n }\n\n logger.newLine();\n logger.success(chalk.bold.green('✨ Tool created successfully!'));\n logger.newLine();\n logger.header('📝 Next Steps');\n logger.list([\n `Edit ${chalk.cyan(`src/tools/${answers.name}.ts`)} to implement your tool`,\n answers.generateTests\n ? `Run ${chalk.cyan(`pnpm test tests/tools/${answers.name}.test.ts`)} to test your tool`\n : '',\n `Register the tool in your agent's tool registry`,\n ].filter(Boolean));\n } catch (error: any) {\n logger.error(`Failed to create tool: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction generateToolContent(\n name: string,\n category: string,\n description: string\n): string {\n return `import { z } from 'zod';\nimport { createTool } from '@agentforge/core';\n\n/**\n * ${description}\n * Category: ${category}\n */\nexport const ${name}Tool = createTool()\n .name('${name}')\n .description('${description}')\n .category('${category}')\n .schema(\n z.object({\n // Define your input schema here\n input: z.string().describe('Input parameter'),\n })\n )\n .implement(async ({ input }) => {\n // Implement your tool logic here\n return \\`Processed: \\${input}\\`;\n })\n .build();\n`;\n}\n\nfunction generateTestContent(name: string): string {\n return `import { describe, it, expect } from 'vitest';\nimport { ${name}Tool } from '../../src/tools/${name}.js';\n\ndescribe('${capitalize(name)} Tool', () => {\n it('should have correct metadata', () => {\n expect(${name}Tool.name).toBe('${name}');\n expect(${name}Tool.description).toBeDefined();\n });\n\n it('should execute successfully', async () => {\n const result = await ${name}Tool.invoke({\n input: 'test',\n });\n\n expect(result).toBeDefined();\n });\n\n // Add more tests here\n});\n`;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { findFiles, readFile } from '../../utils/fs.js';\n\ninterface ToolListOptions {\n category?: string;\n verbose?: boolean;\n}\n\nexport async function toolListCommand(options: ToolListOptions): Promise<void> {\n try {\n logger.header('📋 List Tools');\n\n const cwd = process.cwd();\n const toolDir = path.join(cwd, 'src', 'tools');\n\n // Find all tool files\n const toolFiles = await findFiles('*.ts', toolDir);\n\n if (toolFiles.length === 0) {\n logger.warn('No tools found');\n logger.info(`Create a tool with: ${chalk.cyan('agentforge tool:create <name>')}`);\n return;\n }\n\n let filteredTools = toolFiles;\n\n // Filter by category if specified\n if (options.category) {\n filteredTools = [];\n for (const file of toolFiles) {\n const toolPath = path.join(toolDir, file);\n const content = await readFile(toolPath);\n const category = extractCategory(content);\n if (category === options.category) {\n filteredTools.push(file);\n }\n }\n }\n\n if (filteredTools.length === 0) {\n logger.warn(`No tools found in category: ${options.category}`);\n return;\n }\n\n logger.info(`Found ${chalk.cyan(filteredTools.length)} tool(s):\\n`);\n\n for (const file of filteredTools) {\n const toolName = path.basename(file, '.ts');\n const toolPath = path.join(toolDir, file);\n\n if (options.verbose) {\n // Read file to extract category and description\n const content = await readFile(toolPath);\n const category = extractCategory(content);\n const description = extractDescription(content);\n\n logger.info(chalk.bold.cyan(` ${toolName}`));\n if (category) {\n logger.info(` Category: ${category}`);\n }\n if (description) {\n logger.info(` Description: ${description}`);\n }\n logger.info(` Path: ${chalk.gray(toolPath)}`);\n logger.newLine();\n } else {\n logger.info(` • ${chalk.cyan(toolName)}`);\n }\n }\n\n if (!options.verbose) {\n logger.newLine();\n logger.info(`Use ${chalk.cyan('--verbose')} for more details`);\n }\n } catch (error: any) {\n logger.error(`Failed to list tools: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction extractCategory(content: string): string | null {\n const match = content.match(/Category:\\s*(\\w+)/);\n return match ? match[1] : null;\n}\n\nfunction extractDescription(content: string): string | null {\n const match = content.match(/\\/\\*\\*\\s*\\n\\s*\\*\\s*(.+?)\\s*\\n/);\n return match ? match[1] : null;\n}\n\n","import path from 'path';\nimport chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { runScript, detectPackageManager } from '../../utils/package-manager.js';\nimport { pathExists } from '../../utils/fs.js';\n\ninterface ToolTestOptions {\n watch?: boolean;\n}\n\nexport async function toolTestCommand(\n name: string,\n options: ToolTestOptions\n): Promise<void> {\n try {\n logger.header('🧪 Test Tool');\n\n const cwd = process.cwd();\n const testFile = path.join(cwd, 'tests', 'tools', `${name}.test.ts`);\n\n // Check if test file exists\n if (!(await pathExists(testFile))) {\n logger.error(`Test file not found: ${testFile}`);\n logger.info(`Create tests with: ${chalk.cyan(`agentforge tool:create ${name} --test`)}`);\n process.exit(1);\n }\n\n logger.info(`Testing tool: ${chalk.cyan(name)}`);\n logger.info(`Watch mode: ${options.watch ? 'Yes' : 'No'}`);\n logger.newLine();\n\n const packageManager = await detectPackageManager(cwd);\n\n logger.startSpinner('Running tests...');\n\n // Run tests for specific file\n const testCommand = options.watch ? 'test:watch' : 'test';\n process.env.TEST_FILE = testFile;\n\n await runScript(cwd, testCommand, packageManager);\n\n logger.succeedSpinner('Tests completed');\n } catch (error: any) {\n logger.failSpinner('Tests failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import chalk from 'chalk';\nimport { logger } from '../../utils/logger.js';\nimport { runScript, detectPackageManager } from '../../utils/package-manager.js';\n\ninterface ToolPublishOptions {\n tag?: string;\n dryRun?: boolean;\n}\n\nexport async function toolPublishCommand(\n name: string,\n options: ToolPublishOptions\n): Promise<void> {\n try {\n logger.header('📦 Publish Tool');\n\n logger.info(`Tool: ${chalk.cyan(name)}`);\n logger.info(`Tag: ${chalk.cyan(options.tag || 'latest')}`);\n logger.info(`Dry run: ${options.dryRun ? 'Yes' : 'No'}`);\n logger.newLine();\n\n if (options.dryRun) {\n logger.warn('Dry run mode - no actual publishing will occur');\n logger.newLine();\n }\n\n const cwd = process.cwd();\n const packageManager = await detectPackageManager(cwd);\n\n // Run tests first\n logger.startSpinner('Running tests...');\n try {\n await runScript(cwd, 'test', packageManager);\n logger.succeedSpinner('Tests passed');\n } catch (error) {\n logger.failSpinner('Tests failed');\n logger.error('Cannot publish tool with failing tests');\n process.exit(1);\n }\n\n // Build the tool\n logger.startSpinner('Building tool...');\n try {\n await runScript(cwd, 'build', packageManager);\n logger.succeedSpinner('Build completed');\n } catch (error) {\n logger.failSpinner('Build failed');\n process.exit(1);\n }\n\n // Publish to npm\n if (!options.dryRun) {\n logger.startSpinner('Publishing to npm...');\n \n // TODO: Implement actual npm publish logic\n // This would typically involve:\n // 1. Checking npm credentials\n // 2. Updating version\n // 3. Publishing to npm registry\n \n await new Promise((resolve) => setTimeout(resolve, 2000));\n logger.succeedSpinner('Published to npm');\n }\n\n logger.newLine();\n logger.success(chalk.bold.green('✨ Tool published successfully!'));\n logger.newLine();\n logger.info('Note: Actual npm publishing implementation coming soon');\n logger.info('For now, please use npm publish manually');\n } catch (error: any) {\n logger.failSpinner('Publishing failed');\n logger.error(error.message);\n process.exit(1);\n }\n}\n\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createCommand } from './commands/create.js';\nimport { devCommand } from './commands/dev.js';\nimport { buildCommand } from './commands/build.js';\nimport { testCommand } from './commands/test.js';\nimport { lintCommand } from './commands/lint.js';\nimport { agentCreateCommand } from './commands/agent/create.js';\nimport { agentListCommand } from './commands/agent/list.js';\nimport { agentTestCommand } from './commands/agent/test.js';\nimport { agentDeployCommand } from './commands/agent/deploy.js';\nimport { toolCreateCommand } from './commands/tool/create.js';\nimport { toolListCommand } from './commands/tool/list.js';\nimport { toolTestCommand } from './commands/tool/test.js';\nimport { toolPublishCommand } from './commands/tool/publish.js';\n\nconst program = new Command();\n\nprogram\n .name('agentforge')\n .description('CLI tool for AgentForge - scaffolding, development, and deployment')\n .version('0.1.0');\n\n// Project scaffolding\nprogram\n .command('create <project-name>')\n .description('Create a new AgentForge project')\n .option('-t, --template <template>', 'Project template (minimal, full, api, cli)', 'minimal')\n .option('-p, --package-manager <pm>', 'Package manager (npm, pnpm, yarn)', 'pnpm')\n .option('--no-install', 'Skip dependency installation')\n .option('--no-git', 'Skip git initialization')\n .action(createCommand);\n\n// Development commands\nprogram\n .command('dev')\n .description('Start development server with hot reload')\n .option('-p, --port <port>', 'Port number', '3000')\n .option('--no-open', 'Do not open browser')\n .action(devCommand);\n\nprogram\n .command('build')\n .description('Build for production')\n .option('--no-minify', 'Skip minification')\n .option('--no-sourcemap', 'Skip sourcemap generation')\n .action(buildCommand);\n\nprogram\n .command('test')\n .description('Run tests with coverage')\n .option('-w, --watch', 'Watch mode')\n .option('--ui', 'Open test UI')\n .option('--coverage', 'Generate coverage report')\n .action(testCommand);\n\nprogram\n .command('lint')\n .description('Lint and format code')\n .option('--fix', 'Auto-fix issues')\n .option('--no-format', 'Skip formatting')\n .action(lintCommand);\n\n// Agent management\nconst agent = program.command('agent').description('Manage agents');\n\nagent\n .command('create <name>')\n .description('Create a new agent')\n .option('-p, --pattern <pattern>', 'Agent pattern (react, plan-execute, reflection, multi-agent)', 'react')\n .option('--no-test', 'Skip test generation')\n .action(agentCreateCommand);\n\nagent\n .command('list')\n .description('List all agents')\n .option('-v, --verbose', 'Show detailed information')\n .action(agentListCommand);\n\nagent\n .command('test <name>')\n .description('Test a specific agent')\n .option('-w, --watch', 'Watch mode')\n .action(agentTestCommand);\n\nagent\n .command('deploy <name>')\n .description('Deploy an agent')\n .option('-e, --environment <env>', 'Deployment environment', 'production')\n .option('--dry-run', 'Dry run without actual deployment')\n .action(agentDeployCommand);\n\n// Tool management\nconst tool = program.command('tool').description('Manage tools');\n\ntool\n .command('create <name>')\n .description('Create a new tool')\n .option('-c, --category <category>', 'Tool category (web, data, file, utility)', 'utility')\n .option('--no-test', 'Skip test generation')\n .action(toolCreateCommand);\n\ntool\n .command('list')\n .description('List all tools')\n .option('-c, --category <category>', 'Filter by category')\n .option('-v, --verbose', 'Show detailed information')\n .action(toolListCommand);\n\ntool\n .command('test <name>')\n .description('Test a specific tool')\n .option('-w, --watch', 'Watch mode')\n .action(toolTestCommand);\n\ntool\n .command('publish <name>')\n .description('Publish a tool to npm')\n .option('--tag <tag>', 'npm tag', 'latest')\n .option('--dry-run', 'Dry run without actual publishing')\n .action(toolPublishCommand);\n\n// Error handling\nprogram.exitOverride();\n\nexport async function run() {\n try {\n await program.parseAsync(process.argv);\n } catch (error: any) {\n if (error.code !== 'commander.help' && error.code !== 'commander.version') {\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n }\n}\n\n// Export for testing\nexport { program };\n\n"]}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@agentforge/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for AgentForge - scaffolding, development, and deployment",
5
+ "type": "module",
6
+ "bin": {
7
+ "agentforge": "./bin/agentforge.js"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "bin",
19
+ "templates"
20
+ ],
21
+ "keywords": [
22
+ "agentforge",
23
+ "cli",
24
+ "scaffolding",
25
+ "agent",
26
+ "ai",
27
+ "llm",
28
+ "langchain",
29
+ "langgraph"
30
+ ],
31
+ "author": "Tom Van Schoor",
32
+ "license": "MIT",
33
+ "homepage": "https://tvscoundrel.github.io/agentforge/",
34
+ "bugs": {
35
+ "url": "https://github.com/TVScoundrel/agentforge/issues"
36
+ },
37
+ "dependencies": {
38
+ "commander": "^12.1.0",
39
+ "inquirer": "^12.3.0",
40
+ "chalk": "^5.3.0",
41
+ "ora": "^8.1.1",
42
+ "execa": "^9.5.2",
43
+ "fs-extra": "^11.2.0",
44
+ "zod": "^3.24.1",
45
+ "dotenv": "^16.4.7",
46
+ "glob": "^11.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/fs-extra": "^11.0.4",
50
+ "@types/inquirer": "^9.0.7",
51
+ "@types/node": "^22.10.5",
52
+ "tsup": "^8.3.5",
53
+ "typescript": "^5.7.2",
54
+ "vitest": "^2.1.8",
55
+ "@vitest/ui": "^2.1.8",
56
+ "@vitest/coverage-v8": "^2.1.8",
57
+ "eslint": "^9.17.0",
58
+ "@eslint/js": "^9.17.0",
59
+ "typescript-eslint": "^8.19.1",
60
+ "prettier": "^3.4.2"
61
+ },
62
+ "engines": {
63
+ "node": ">=18.0.0"
64
+ },
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "https://github.com/TVScoundrel/agentforge.git",
68
+ "directory": "packages/cli"
69
+ },
70
+ "scripts": {
71
+ "build": "tsup",
72
+ "dev": "tsup --watch",
73
+ "test": "vitest",
74
+ "test:ui": "vitest --ui",
75
+ "test:coverage": "vitest --coverage",
76
+ "typecheck": "tsc --noEmit",
77
+ "lint": "eslint src",
78
+ "lint:fix": "eslint src --fix",
79
+ "format": "prettier --write \"src/**/*.ts\""
80
+ }
81
+ }
@@ -0,0 +1,163 @@
1
+ # AgentForge Project Templates
2
+
3
+ This directory contains project templates for the `agentforge create` command.
4
+
5
+ ## Available Templates
6
+
7
+ ### 1. Minimal (`minimal/`)
8
+
9
+ A minimal starter template with just the essentials.
10
+
11
+ **Features:**
12
+ - Basic ReAct agent setup
13
+ - TypeScript configuration
14
+ - Build and test scripts
15
+ - Minimal dependencies
16
+
17
+ **Best for:**
18
+ - Quick prototypes
19
+ - Learning AgentForge
20
+ - Simple agent applications
21
+
22
+ **Usage:**
23
+ ```bash
24
+ agentforge create my-project --template minimal
25
+ ```
26
+
27
+ ---
28
+
29
+ ### 2. Full (`full/`)
30
+
31
+ A full-featured template with tools, tests, and best practices.
32
+
33
+ **Features:**
34
+ - ReAct agent with example tool
35
+ - Comprehensive test suite
36
+ - Environment configuration
37
+ - Logging and error handling
38
+ - Example tool implementation
39
+ - Test coverage setup
40
+
41
+ **Best for:**
42
+ - Production applications
43
+ - Complex agent systems
44
+ - Projects requiring multiple tools
45
+
46
+ **Usage:**
47
+ ```bash
48
+ agentforge create my-project --template full
49
+ ```
50
+
51
+ ---
52
+
53
+ ### 3. API (`api/`)
54
+
55
+ A REST API service template with Express.js.
56
+
57
+ **Features:**
58
+ - Express.js server
59
+ - Agent API endpoints
60
+ - Health check endpoint
61
+ - CORS support
62
+ - Request logging
63
+ - Error handling middleware
64
+
65
+ **Best for:**
66
+ - Web services
67
+ - API backends
68
+ - Microservices
69
+ - Integration with frontend apps
70
+
71
+ **Usage:**
72
+ ```bash
73
+ agentforge create my-api --template api
74
+ ```
75
+
76
+ **Endpoints:**
77
+ - `GET /health` - Health check
78
+ - `POST /api/agent/chat` - Chat with agent
79
+
80
+ ---
81
+
82
+ ### 4. CLI (`cli/`)
83
+
84
+ A command-line interface template with Commander.js.
85
+
86
+ **Features:**
87
+ - Interactive chat command
88
+ - File analysis command
89
+ - Colored output (chalk)
90
+ - Spinners and progress (ora)
91
+ - Interactive prompts (inquirer)
92
+ - Commander.js framework
93
+
94
+ **Best for:**
95
+ - Command-line tools
96
+ - Developer utilities
97
+ - Automation scripts
98
+ - Interactive applications
99
+
100
+ **Usage:**
101
+ ```bash
102
+ agentforge create my-cli --template cli
103
+ ```
104
+
105
+ **Commands:**
106
+ - `chat` - Interactive chat session
107
+ - `analyze <file>` - Analyze files with AI
108
+
109
+ ---
110
+
111
+ ## Template Structure
112
+
113
+ Each template includes:
114
+
115
+ ```
116
+ template-name/
117
+ ├── package.json # Dependencies and scripts
118
+ ├── tsconfig.json # TypeScript configuration
119
+ ├── .gitignore # Git ignore rules
120
+ ├── .env.example # Environment variables (if needed)
121
+ ├── README.md # Template-specific documentation
122
+ ├── src/ # Source code
123
+ │ └── ...
124
+ └── tests/ # Test files (if applicable)
125
+ └── ...
126
+ ```
127
+
128
+ ## Template Variables
129
+
130
+ Templates use the following placeholders that are replaced during project creation:
131
+
132
+ - `{{PROJECT_NAME}}` - Project name
133
+ - `{{PROJECT_DESCRIPTION}}` - Project description
134
+ - `{{AUTHOR_NAME}}` - Author name (from git config)
135
+ - `{{AUTHOR_EMAIL}}` - Author email (from git config)
136
+
137
+ ## Creating Custom Templates
138
+
139
+ To create a custom template:
140
+
141
+ 1. Create a new directory in `templates/`
142
+ 2. Add all necessary files with template variables
143
+ 3. Include a `README.md` with usage instructions
144
+ 4. Test the template with `agentforge create`
145
+
146
+ ## Template Comparison
147
+
148
+ | Feature | Minimal | Full | API | CLI |
149
+ |---------|---------|------|-----|-----|
150
+ | Agent Setup | ✅ | ✅ | ✅ | ✅ |
151
+ | Example Tools | ❌ | ✅ | ❌ | ❌ |
152
+ | Tests | ❌ | ✅ | ❌ | ❌ |
153
+ | Environment Config | ❌ | ✅ | ✅ | ✅ |
154
+ | Express Server | ❌ | ❌ | ✅ | ❌ |
155
+ | CLI Framework | ❌ | ❌ | ❌ | ✅ |
156
+ | Interactive Prompts | ❌ | ❌ | ❌ | ✅ |
157
+ | API Endpoints | ❌ | ❌ | ✅ | ❌ |
158
+ | Logging | ❌ | ✅ | ✅ | ✅ |
159
+
160
+ ## License
161
+
162
+ MIT
163
+
@@ -0,0 +1,13 @@
1
+ # OpenAI Configuration
2
+ OPENAI_API_KEY=your-api-key-here
3
+ OPENAI_MODEL=gpt-4
4
+
5
+ # LangSmith Configuration (optional)
6
+ LANGCHAIN_TRACING_V2=false
7
+ LANGCHAIN_API_KEY=your-langsmith-api-key
8
+ LANGCHAIN_PROJECT={{PROJECT_NAME}}
9
+
10
+ # Application Configuration
11
+ NODE_ENV=development
12
+ LOG_LEVEL=info
13
+
@@ -0,0 +1,153 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ {{PROJECT_DESCRIPTION}}
4
+
5
+ A REST API service powered by AgentForge agents.
6
+
7
+ ## Features
8
+
9
+ - ✅ Express.js REST API
10
+ - ✅ ReAct agent integration
11
+ - ✅ Health check endpoint
12
+ - ✅ CORS support
13
+ - ✅ Error handling
14
+ - ✅ Request logging
15
+ - ✅ Environment configuration
16
+
17
+ ## Getting Started
18
+
19
+ ### Prerequisites
20
+
21
+ - Node.js 18+
22
+ - pnpm (recommended) or npm
23
+ - OpenAI API key
24
+
25
+ ### Installation
26
+
27
+ ```bash
28
+ pnpm install
29
+ ```
30
+
31
+ ### Configuration
32
+
33
+ 1. Copy `.env.example` to `.env`:
34
+ ```bash
35
+ cp .env.example .env
36
+ ```
37
+
38
+ 2. Add your OpenAI API key to `.env`:
39
+ ```
40
+ OPENAI_API_KEY=your-api-key-here
41
+ PORT=3000
42
+ ```
43
+
44
+ ### Development
45
+
46
+ ```bash
47
+ # Run in development mode with hot reload
48
+ pnpm dev
49
+
50
+ # Build for production
51
+ pnpm build
52
+
53
+ # Start production server
54
+ pnpm start
55
+
56
+ # Run tests
57
+ pnpm test
58
+
59
+ # Type check
60
+ pnpm typecheck
61
+ ```
62
+
63
+ ## API Endpoints
64
+
65
+ ### Health Check
66
+ ```bash
67
+ GET /health
68
+ ```
69
+
70
+ Response:
71
+ ```json
72
+ {
73
+ "status": "healthy",
74
+ "timestamp": "2026-01-06T12:00:00.000Z",
75
+ "uptime": 123.456
76
+ }
77
+ ```
78
+
79
+ ### Chat with Agent
80
+ ```bash
81
+ POST /api/agent/chat
82
+ Content-Type: application/json
83
+
84
+ {
85
+ "message": "Hello, how can you help me?"
86
+ }
87
+ ```
88
+
89
+ Response:
90
+ ```json
91
+ {
92
+ "success": true,
93
+ "response": "I'm an AI assistant. I can help you with..."
94
+ }
95
+ ```
96
+
97
+ ## Project Structure
98
+
99
+ ```
100
+ {{PROJECT_NAME}}/
101
+ ├── src/
102
+ │ ├── server.ts # Express server setup
103
+ │ └── routes/
104
+ │ ├── agent.ts # Agent API routes
105
+ │ └── health.ts # Health check routes
106
+ ├── .env.example # Environment variables template
107
+ ├── package.json
108
+ ├── tsconfig.json
109
+ └── README.md
110
+ ```
111
+
112
+ ## Adding Routes
113
+
114
+ Create a new route file in `src/routes/`:
115
+
116
+ ```typescript
117
+ import { Router } from 'express';
118
+
119
+ const router = Router();
120
+
121
+ router.get('/my-endpoint', async (req, res) => {
122
+ // Handle request
123
+ res.json({ message: 'Success' });
124
+ });
125
+
126
+ export { router as myRouter };
127
+ ```
128
+
129
+ Then register it in `src/server.ts`:
130
+
131
+ ```typescript
132
+ import { myRouter } from './routes/my-route.js';
133
+ app.use('/api/my-route', myRouter);
134
+ ```
135
+
136
+ ## Deployment
137
+
138
+ See the [deployment guides](../../templates/deployment/) for deploying to:
139
+ - AWS Lambda (serverless)
140
+ - Google Cloud Run
141
+ - Azure Container Apps
142
+ - Docker + Kubernetes
143
+
144
+ ## Learn More
145
+
146
+ - [AgentForge Documentation](../../docs/)
147
+ - [Express.js Documentation](https://expressjs.com/)
148
+ - [API Best Practices](../../docs/guides/api-best-practices.md)
149
+
150
+ ## License
151
+
152
+ MIT
153
+
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "{{PROJECT_NAME}}",
3
+ "version": "0.1.0",
4
+ "description": "{{PROJECT_DESCRIPTION}}",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "dev": "tsx watch src/server.ts",
10
+ "build": "tsup",
11
+ "start": "node dist/server.js",
12
+ "test": "vitest",
13
+ "test:watch": "vitest --watch",
14
+ "typecheck": "tsc --noEmit",
15
+ "lint": "eslint .",
16
+ "lint:fix": "eslint . --fix",
17
+ "format": "prettier --write ."
18
+ },
19
+ "dependencies": {
20
+ "@agentforge/core": "workspace:*",
21
+ "@agentforge/patterns": "workspace:*",
22
+ "@langchain/openai": "^0.3.14",
23
+ "langchain": "^0.3.7",
24
+ "zod": "^3.24.1",
25
+ "dotenv": "^16.4.7",
26
+ "express": "^4.21.2",
27
+ "cors": "^2.8.5"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.10.2",
31
+ "@types/express": "^5.0.0",
32
+ "@types/cors": "^2.8.17",
33
+ "eslint": "^9.17.0",
34
+ "prettier": "^3.4.2",
35
+ "tsup": "^8.3.5",
36
+ "tsx": "^4.21.0",
37
+ "typescript": "^5.7.2",
38
+ "vitest": "^2.1.8"
39
+ }
40
+ }
41
+