@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.
- package/README.md +225 -0
- package/bin/agentforge.js +9 -0
- package/dist/index.cjs +1114 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1103 -0
- package/dist/index.js.map +1 -0
- package/package.json +81 -0
- package/templates/README.md +163 -0
- package/templates/api/.env.example +13 -0
- package/templates/api/README.md +153 -0
- package/templates/api/package.json +41 -0
- package/templates/api/src/routes/agent.ts +54 -0
- package/templates/api/src/routes/health.ts +15 -0
- package/templates/api/src/server.ts +41 -0
- package/templates/api/tsconfig.json +10 -0
- package/templates/cli/.env.example +13 -0
- package/templates/cli/README.md +164 -0
- package/templates/cli/package.json +44 -0
- package/templates/cli/src/cli.ts +31 -0
- package/templates/cli/src/commands/analyze.ts +65 -0
- package/templates/cli/src/commands/chat.ts +65 -0
- package/templates/cli/tsconfig.json +10 -0
- package/templates/full/.env.example +13 -0
- package/templates/full/README.md +151 -0
- package/templates/full/package.json +40 -0
- package/templates/full/src/index.ts +53 -0
- package/templates/full/src/tools/example.ts +20 -0
- package/templates/full/tests/example.test.ts +17 -0
- package/templates/full/tsconfig.json +10 -0
- package/templates/minimal/README.md +64 -0
- package/templates/minimal/package.json +35 -0
- package/templates/minimal/src/index.ts +40 -0
- package/templates/minimal/tsconfig.json +10 -0
|
@@ -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
|
+
|