@agentforge-ai/cli 0.5.0 → 0.5.2

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.
Files changed (43) hide show
  1. package/dist/default/agentforge.config.ts +78 -0
  2. package/dist/default/convex/agents.ts +16 -16
  3. package/dist/default/convex/apiKeys.ts +7 -7
  4. package/dist/default/convex/cronJobs.ts +12 -12
  5. package/dist/default/convex/files.ts +7 -7
  6. package/dist/default/convex/folders.ts +11 -11
  7. package/dist/default/convex/heartbeat.ts +20 -20
  8. package/dist/default/convex/mastraIntegration.ts +3 -2
  9. package/dist/default/convex/mcpConnections.ts +5 -5
  10. package/dist/default/convex/messages.ts +4 -4
  11. package/dist/default/convex/projects.ts +10 -10
  12. package/dist/default/convex/schema.ts +150 -83
  13. package/dist/default/convex/sessions.ts +12 -12
  14. package/dist/default/convex/settings.ts +3 -3
  15. package/dist/default/convex/skills.ts +8 -8
  16. package/dist/default/convex/threads.ts +9 -9
  17. package/dist/default/convex/usage.ts +16 -16
  18. package/dist/default/convex/vault.ts +50 -33
  19. package/dist/default/package.json +1 -0
  20. package/dist/default/tsconfig.json +1 -0
  21. package/dist/index.js +691 -84
  22. package/dist/index.js.map +1 -1
  23. package/package.json +2 -1
  24. package/templates/default/agentforge.config.ts +78 -0
  25. package/templates/default/convex/agents.ts +16 -16
  26. package/templates/default/convex/apiKeys.ts +7 -7
  27. package/templates/default/convex/cronJobs.ts +12 -12
  28. package/templates/default/convex/files.ts +7 -7
  29. package/templates/default/convex/folders.ts +11 -11
  30. package/templates/default/convex/heartbeat.ts +20 -20
  31. package/templates/default/convex/mastraIntegration.ts +3 -2
  32. package/templates/default/convex/mcpConnections.ts +5 -5
  33. package/templates/default/convex/messages.ts +4 -4
  34. package/templates/default/convex/projects.ts +10 -10
  35. package/templates/default/convex/schema.ts +150 -83
  36. package/templates/default/convex/sessions.ts +12 -12
  37. package/templates/default/convex/settings.ts +3 -3
  38. package/templates/default/convex/skills.ts +8 -8
  39. package/templates/default/convex/threads.ts +9 -9
  40. package/templates/default/convex/usage.ts +16 -16
  41. package/templates/default/convex/vault.ts +50 -33
  42. package/templates/default/package.json +1 -0
  43. package/templates/default/tsconfig.json +1 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/create.ts","../src/commands/run.ts","../src/commands/deploy.ts","../src/lib/convex-client.ts","../src/lib/display.ts","../src/commands/agents.ts","../src/commands/chat.ts","../src/commands/sessions.ts","../src/commands/skills.ts","../src/commands/cron.ts","../src/commands/mcp.ts","../src/commands/files.ts","../src/commands/projects.ts","../src/commands/config.ts","../src/commands/vault.ts","../src/commands/keys.ts","../src/commands/status.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create.js';\nimport { runProject } from './commands/run.js';\nimport { deployProject } from './commands/deploy.js';\nimport { registerAgentsCommand } from './commands/agents.js';\nimport { registerChatCommand } from './commands/chat.js';\nimport { registerSessionsCommand, registerThreadsCommand } from './commands/sessions.js';\nimport { registerSkillsCommand } from './commands/skills.js';\nimport { registerCronCommand } from './commands/cron.js';\nimport { registerMcpCommand } from './commands/mcp.js';\nimport { registerFilesCommand } from './commands/files.js';\nimport { registerProjectsCommand } from './commands/projects.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerVaultCommand } from './commands/vault.js';\nimport { registerKeysCommand } from './commands/keys.js';\nimport { registerStatusCommand } from './commands/status.js';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, resolve } from 'node:path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('agentforge')\n .description('AgentForge — NanoClaw: A minimalist agent framework powered by Mastra + Convex')\n .version(pkg.version);\n\n// ─── Project Lifecycle ───────────────────────────────────────────\nprogram\n .command('create')\n .argument('<project-name>', 'Name of the project to create')\n .description('Create a new AgentForge project')\n .option('-t, --template <template>', 'Project template to use', 'default')\n .action(async (projectName: string, options: { template: string }) => {\n await createProject(projectName, options);\n });\n\nprogram\n .command('run')\n .description('Start the local development environment')\n .option('-p, --port <port>', 'Port for the dev server', '3000')\n .action(async (options: { port: string }) => {\n await runProject(options);\n });\n\nprogram\n .command('deploy')\n .description('Deploy the Convex backend to production')\n .option('--env <path>', 'Path to environment file', '.env.production')\n .option('--dry-run', 'Preview deployment without executing', false)\n .option('--rollback', 'Rollback to previous deployment', false)\n .option('--force', 'Skip confirmation prompts', false)\n .action(async (options: { env: string; dryRun: boolean; rollback: boolean; force: boolean }) => {\n await deployProject(options);\n });\n\n// ─── Agent Management ────────────────────────────────────────────\nregisterAgentsCommand(program);\n\n// ─── Chat ────────────────────────────────────────────────────────\nregisterChatCommand(program);\n\n// ─── Sessions & Threads ──────────────────────────────────────────\nregisterSessionsCommand(program);\nregisterThreadsCommand(program);\n\n// ─── Skills ──────────────────────────────────────────────────────\nregisterSkillsCommand(program);\n\n// ─── Cron Jobs ───────────────────────────────────────────────────\nregisterCronCommand(program);\n\n// ─── MCP Connections ─────────────────────────────────────────────\nregisterMcpCommand(program);\n\n// ─── Files & Folders ─────────────────────────────────────────────\nregisterFilesCommand(program);\n\n// ─── Projects / Workspaces ───────────────────────────────────────\nregisterProjectsCommand(program);\n\n// ─── Configuration ───────────────────────────────────────────────\nregisterConfigCommand(program);\n\n// ─── Vault (Secrets) ─────────────────────────────────────────────\nregisterVaultCommand(program);\n\n// ─── AI Provider Keys ────────────────────────────────────────────\nregisterKeysCommand(program);\n\n// ─── Status, Dashboard, Logs, Heartbeat ──────────────────────────\nregisterStatusCommand(program);\n\nprogram.parse();\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport { execSync } from 'node:child_process';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Options for the create command.\n */\nexport interface CreateOptions {\n /** The project template to use. */\n template: string;\n}\n\n/**\n * Creates a new AgentForge project from a template.\n *\n * @param projectName - The name of the project to create.\n * @param options - Options for the create command.\n */\nexport async function createProject(\n projectName: string,\n options: CreateOptions\n): Promise<void> {\n const targetDir = path.resolve(process.cwd(), projectName);\n\n // Check if directory already exists\n if (await fs.pathExists(targetDir)) {\n console.error(`Error: Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n console.log(`\\n🔨 Creating AgentForge project: ${projectName}\\n`);\n\n // Resolve template directory\n // tsup publicDir copies templates/ contents into dist/, so dist/default/ exists\n // When running from dist/index.js, __dirname is dist/, so we check:\n // 1. dist/<template> (built bundle — tsup publicDir)\n // 2. ../templates/<template> (development — running from src/)\n // 3. ../../templates/<template> (fallback)\n const searchDirs = [\n path.resolve(__dirname, options.template), // dist/default (built)\n path.resolve(__dirname, '..', 'templates', options.template), // packages/cli/templates/default (dev)\n path.resolve(__dirname, '..', '..', 'templates', options.template), // fallback\n ];\n\n let templateDir = '';\n for (const dir of searchDirs) {\n if (await fs.pathExists(path.join(dir, 'package.json'))) {\n templateDir = dir;\n break;\n }\n }\n\n if (!templateDir) {\n console.error(`Error: Template \"${options.template}\" not found.`);\n console.error(`Searched in:`);\n searchDirs.forEach(d => console.error(` - ${d}`));\n process.exit(1);\n }\n\n // Copy template to target directory\n await fs.copy(templateDir, targetDir);\n\n // Update package.json with project name\n const pkgPath = path.join(targetDir, 'package.json');\n if (await fs.pathExists(pkgPath)) {\n const pkg = await fs.readJson(pkgPath);\n pkg.name = projectName;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n }\n\n // Update dashboard package.json name\n const dashPkgPath = path.join(targetDir, 'dashboard', 'package.json');\n if (await fs.pathExists(dashPkgPath)) {\n const dashPkg = await fs.readJson(dashPkgPath);\n dashPkg.name = `${projectName}-dashboard`;\n await fs.writeJson(dashPkgPath, dashPkg, { spaces: 2 });\n }\n\n console.log(` ✅ Project scaffolded at ./${projectName}`);\n\n // Install root dependencies\n console.log(`\\n📦 Installing dependencies...\\n`);\n try {\n execSync('pnpm install', {\n cwd: targetDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Dependencies installed`);\n } catch {\n console.warn(\n `\\n ⚠️ Could not install dependencies. Run \"cd ${projectName} && pnpm install\" manually.`\n );\n }\n\n // Install dashboard dependencies\n const dashDir = path.join(targetDir, 'dashboard');\n if (await fs.pathExists(dashDir)) {\n console.log(`\\n📦 Installing dashboard dependencies...\\n`);\n try {\n execSync('pnpm install', {\n cwd: dashDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Dashboard dependencies installed`);\n } catch {\n console.warn(\n `\\n ⚠️ Could not install dashboard dependencies. Run \"cd ${projectName}/dashboard && pnpm install\" manually.`\n );\n }\n }\n\n // Initialize Convex\n console.log(`\\n⚡ Initializing Convex...\\n`);\n try {\n execSync('npx convex dev --once', {\n cwd: targetDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Convex initialized`);\n } catch {\n console.warn(\n `\\n ⚠️ Convex initialization skipped. Run \"npx convex dev\" to set up your backend.`\n );\n }\n\n console.log(`\n🎉 AgentForge project \"${projectName}\" created successfully!\n\nNext steps:\n cd ${projectName}\n\n # Start the Convex backend\n npx convex dev\n\n # In another terminal, launch the dashboard\n agentforge dashboard\n\n # Or chat with your agent from the CLI\n agentforge chat\n\n # Check system status\n agentforge status\n\nDocumentation: https://github.com/Agentic-Engineering-Agency/agentforge\n`);\n}\n","import { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'fs-extra';\n\n/**\n * Options for the run command.\n */\nexport interface RunOptions {\n /** The port for the dev server. */\n port: string;\n}\n\n/**\n * Starts the local development environment for an AgentForge project.\n *\n * This command starts the Convex development server and watches for file changes.\n *\n * @param options - Options for the run command.\n */\nexport async function runProject(options: RunOptions): Promise<void> {\n const projectDir = process.cwd();\n\n // Verify we're in an AgentForge project\n const pkgPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(pkgPath))) {\n console.error(\n 'Error: No package.json found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n const convexDir = path.join(projectDir, 'convex');\n if (!(await fs.pathExists(convexDir))) {\n console.error(\n 'Error: No convex/ directory found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n console.log(`\\n🚀 Starting AgentForge development server...\\n`);\n console.log(` Convex dev server starting on port ${options.port}...`);\n\n // Start the Convex dev server\n const convexProcess = spawn('npx', ['convex', 'dev'], {\n cwd: projectDir,\n stdio: 'inherit',\n shell: true,\n });\n\n convexProcess.on('error', (err) => {\n console.error(`Failed to start Convex dev server: ${err.message}`);\n process.exit(1);\n });\n\n convexProcess.on('close', (code) => {\n if (code !== 0) {\n console.error(`Convex dev server exited with code ${code}`);\n }\n });\n\n // Handle graceful shutdown\n const shutdown = () => {\n console.log('\\n\\n👋 Shutting down AgentForge dev server...');\n convexProcess.kill('SIGTERM');\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport fs from 'fs-extra';\n\n/**\n * Options for the deploy command.\n */\nexport interface DeployOptions {\n /** Path to the environment file. */\n env: string;\n /** Preview deployment without executing. */\n dryRun: boolean;\n /** Rollback to previous deployment. */\n rollback: boolean;\n /** Skip confirmation prompts. */\n force: boolean;\n}\n\n/**\n * Parses a .env file and returns key-value pairs.\n *\n * @param filePath - Absolute path to the .env file.\n * @returns A record of environment variable key-value pairs.\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const content = fs.readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Remove surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) {\n vars[key] = value;\n }\n }\n\n return vars;\n}\n\n/**\n * Deploys an AgentForge project's Convex backend to production.\n *\n * Handles environment variable configuration, provides deployment status\n * feedback, and supports rollback capabilities.\n *\n * @param options - Options for the deploy command.\n */\nexport async function deployProject(options: DeployOptions): Promise<void> {\n const projectDir = process.cwd();\n\n // Validate project structure\n const pkgPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(pkgPath))) {\n console.error(\n 'Error: No package.json found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n const convexDir = path.join(projectDir, 'convex');\n if (!(await fs.pathExists(convexDir))) {\n console.error(\n 'Error: No convex/ directory found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n // Handle rollback mode\n if (options.rollback) {\n console.log('\\n🔄 Rolling back to previous Convex deployment...\\n');\n try {\n execSync('npx convex deploy --rollback', {\n cwd: projectDir,\n stdio: 'inherit',\n });\n console.log('\\n ✅ Rollback completed successfully.');\n } catch {\n console.error('\\n ❌ Rollback failed.');\n process.exit(1);\n }\n return;\n }\n\n // Resolve and validate env file\n const envPath = path.resolve(projectDir, options.env);\n const envExists = await fs.pathExists(envPath);\n\n // Parse env vars if file exists\n let envVars: Record<string, string> = {};\n if (envExists) {\n envVars = parseEnvFile(envPath);\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log('\\n🔍 Dry run — previewing deployment plan:\\n');\n console.log(` Project directory: ${projectDir}`);\n console.log(` Convex directory: ${convexDir}`);\n console.log(` Environment file: ${envExists ? envPath : '(not found, skipping env vars)'}`);\n\n if (Object.keys(envVars).length > 0) {\n console.log(`\\n Environment variables to set (${Object.keys(envVars).length}):`);\n for (const key of Object.keys(envVars)) {\n console.log(` • ${key}=${envVars[key].slice(0, 4)}${'*'.repeat(Math.max(0, envVars[key].length - 4))}`);\n }\n } else {\n console.log('\\n No environment variables to set.');\n }\n\n console.log('\\n ℹ️ No changes were made (dry run).\\n');\n return;\n }\n\n // Require env file for actual deployment\n if (!envExists) {\n console.error(\n `Error: Environment file \"${options.env}\" not found. Create it or use --env to specify a different path.`\n );\n process.exit(1);\n }\n\n // Confirmation prompt (unless --force)\n if (!options.force) {\n console.log('\\n🚀 Deployment plan:\\n');\n console.log(` Project: ${projectDir}`);\n console.log(` Env file: ${envPath}`);\n console.log(` Env vars: ${Object.keys(envVars).length} variable(s)`);\n console.log('\\n Use --force to skip this confirmation.\\n');\n\n // In a real CLI, we'd use prompts here. For now, auto-proceed.\n // The --force flag is the recommended path for CI/CD.\n }\n\n console.log('\\n📦 Deploying AgentForge project to production...\\n');\n\n // Step 1: Push environment variables\n if (Object.keys(envVars).length > 0) {\n console.log(' Setting environment variables...');\n for (const [key, value] of Object.entries(envVars)) {\n try {\n execSync(`npx convex env set ${key} \"${value}\"`, {\n cwd: projectDir,\n stdio: 'pipe',\n });\n console.log(` ✅ ${key}`);\n } catch {\n console.error(` ❌ Failed to set ${key}`);\n }\n }\n console.log('');\n }\n\n // Step 2: Deploy\n console.log(' Deploying Convex backend...');\n try {\n execSync('npx convex deploy', {\n cwd: projectDir,\n stdio: 'inherit',\n });\n console.log('\\n ✅ Deployment completed successfully!');\n console.log(' Use \"agentforge deploy --rollback\" to revert if needed.\\n');\n } catch {\n console.error('\\n ❌ Deployment failed.');\n console.error(' Check the Convex dashboard for details.');\n process.exit(1);\n }\n}\n","import fs from 'fs-extra';\nimport path from 'node:path';\n\n/**\n * Safely get the current working directory.\n * Returns null if the CWD has been deleted or is inaccessible.\n */\nfunction safeCwd(): string | null {\n try {\n return process.cwd();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the Convex deployment URL from the project's .env files.\n * Called lazily — only when a command actually needs Convex.\n */\nfunction getConvexUrl(): string {\n const cwd = safeCwd();\n if (!cwd) {\n throw new Error(\n 'Current directory does not exist or is not accessible.\\n' +\n 'Please navigate to a valid AgentForge project directory and try again.'\n );\n }\n const envFiles = ['.env.local', '.env', '.env.production'];\n\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(/CONVEX_URL\\s*=\\s*(.+)/);\n if (match) {\n return match[1].trim().replace(/[\"']/g, '');\n }\n }\n }\n\n // Also check .convex/deployment.json\n const convexEnv = path.join(cwd, '.convex', 'deployment.json');\n if (fs.existsSync(convexEnv)) {\n try {\n const data = JSON.parse(fs.readFileSync(convexEnv, 'utf-8'));\n if (data.url) return data.url;\n } catch {\n // ignore\n }\n }\n\n throw new Error(\n 'CONVEX_URL not found. Run `npx convex dev` first, or set CONVEX_URL in your .env file.'\n );\n}\n\n/**\n * Create a Convex HTTP client connected to the project's deployment.\n * The ConvexHttpClient import is deferred to avoid triggering\n * process.cwd() at module load time (which crashes if CWD is gone).\n */\nexport async function createClient(): Promise<import('convex/browser').ConvexHttpClient> {\n const { ConvexHttpClient } = await import('convex/browser');\n const url = getConvexUrl();\n return new ConvexHttpClient(url);\n}\n\n/**\n * Safely call a Convex query/mutation and handle errors gracefully.\n */\nexport async function safeCall<T>(\n fn: () => Promise<T>,\n errorMessage: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error: any) {\n if (error.message?.includes('CONVEX_URL not found')) {\n console.error('\\n❌ Not connected to Convex.');\n console.error(' Run `npx convex dev` in your project directory first.\\n');\n } else if (error.message?.includes('Current directory does not exist')) {\n console.error(`\\n❌ ${error.message}\\n`);\n } else if (error.message?.includes('fetch failed') || error.message?.includes('ECONNREFUSED')) {\n console.error('\\n❌ Cannot reach Convex deployment.');\n console.error(' Make sure `npx convex dev` is running.\\n');\n } else {\n console.error(`\\n❌ ${errorMessage}`);\n console.error(` ${error.message}\\n`);\n }\n process.exit(1);\n }\n}\n","/**\n * CLI Display Helpers — Consistent formatting for all commands\n */\n\nexport const colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nexport function success(msg: string) {\n console.log(`${colors.green}✔${colors.reset} ${msg}`);\n}\n\nexport function error(msg: string) {\n console.error(`${colors.red}✖${colors.reset} ${msg}`);\n}\n\nexport function warn(msg: string) {\n console.log(`${colors.yellow}⚠${colors.reset} ${msg}`);\n}\n\nexport function info(msg: string) {\n console.log(`${colors.blue}ℹ${colors.reset} ${msg}`);\n}\n\nexport function header(title: string) {\n console.log(`\\n${colors.bold}${colors.cyan}${title}${colors.reset}\\n`);\n}\n\nexport function dim(msg: string) {\n console.log(`${colors.dim}${msg}${colors.reset}`);\n}\n\n/**\n * Print a table from an array of objects\n */\nexport function table(data: Record<string, any>[], columns?: string[]) {\n if (data.length === 0) {\n dim(' (no items)');\n return;\n }\n\n const cols = columns ?? Object.keys(data[0]);\n const widths: Record<string, number> = {};\n\n for (const col of cols) {\n widths[col] = Math.max(\n col.length,\n ...data.map((row) => String(row[col] ?? '').length)\n );\n }\n\n // Header\n const headerRow = cols.map((c) => c.toUpperCase().padEnd(widths[c])).join(' ');\n console.log(` ${colors.bold}${headerRow}${colors.reset}`);\n console.log(` ${cols.map((c) => '─'.repeat(widths[c])).join('──')}`);\n\n // Rows\n for (const row of data) {\n const line = cols.map((c) => String(row[c] ?? '').padEnd(widths[c])).join(' ');\n console.log(` ${line}`);\n }\n console.log();\n}\n\n/**\n * Print key-value details\n */\nexport function details(data: Record<string, any>) {\n const maxKey = Math.max(...Object.keys(data).map((k) => k.length));\n for (const [key, value] of Object.entries(data)) {\n const label = `${colors.dim}${key.padEnd(maxKey)}${colors.reset}`;\n console.log(` ${label} ${value}`);\n }\n console.log();\n}\n\n/**\n * Format a timestamp to a readable date string\n */\nexport function formatDate(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\n/**\n * Truncate a string to a max length\n */\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + '…';\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => rl.question(question, (ans) => { rl.close(); resolve(ans.trim()); }));\n}\n\nexport function registerAgentsCommand(program: Command) {\n const agents = program.command('agents').description('Manage agents');\n\n agents\n .command('list')\n .description('List all agents')\n .option('--active', 'Show only active agents')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('agents:list' as any, {}),\n 'Failed to list agents'\n );\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n header('Agents');\n if (!result || (result as any[]).length === 0) {\n info('No agents found. Create one with: agentforge agents create');\n return;\n }\n const filtered = opts.active ? (result as any[]).filter((a: any) => a.isActive) : result;\n table(\n (filtered as any[]).map((a: any) => ({\n ID: a.id,\n Name: a.name,\n Model: a.model,\n Provider: a.provider || 'openai',\n Active: a.isActive ? '✔' : '✖',\n Created: formatDate(a.createdAt),\n }))\n );\n });\n\n agents\n .command('create')\n .description('Create a new agent (interactive)')\n .option('--name <name>', 'Agent name')\n .option('--model <model>', 'Model identifier (e.g., openai:gpt-4o-mini)')\n .option('--instructions <text>', 'System instructions')\n .action(async (opts) => {\n const name = opts.name || await prompt('Agent name: ');\n const model = opts.model || await prompt('Model (e.g., openai:gpt-4o-mini): ');\n const instructions = opts.instructions || await prompt('Instructions: ');\n\n if (!name || !model || !instructions) {\n error('Name, model, and instructions are required.');\n process.exit(1);\n }\n\n const provider = model.includes(':') ? model.split(':')[0] : 'openai';\n const agentId = name.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('agents:create' as any, {\n id: agentId,\n name,\n instructions,\n model,\n provider,\n isActive: true,\n }),\n 'Failed to create agent'\n );\n success(`Agent \"${name}\" created with ID: ${agentId}`);\n });\n\n agents\n .command('inspect')\n .argument('<id>', 'Agent ID')\n .description('Show detailed agent information')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) {\n error(`Agent \"${id}\" not found.`);\n process.exit(1);\n }\n header(`Agent: ${(agent as any).name}`);\n const a = agent as any;\n details({\n 'ID': a.id,\n 'Name': a.name,\n 'Model': a.model,\n 'Provider': a.provider || 'openai',\n 'Active': a.isActive ? 'Yes' : 'No',\n 'Temperature': a.temperature ?? 'default',\n 'Max Tokens': a.maxTokens ?? 'default',\n 'Created': formatDate(a.createdAt),\n 'Updated': formatDate(a.updatedAt),\n });\n if (a.description) info(`Description: ${a.description}`);\n console.log(` Instructions:\\n ${a.instructions.split('\\n').join('\\n ')}\\n`);\n });\n\n agents\n .command('edit')\n .argument('<id>', 'Agent ID')\n .option('--name <name>', 'New name')\n .option('--model <model>', 'New model')\n .option('--instructions <text>', 'New instructions')\n .description('Edit an agent')\n .action(async (id, opts) => {\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n\n const updates: Record<string, any> = {};\n if (opts.name) updates.name = opts.name;\n if (opts.model) {\n updates.model = opts.model;\n updates.provider = opts.model.includes(':') ? opts.model.split(':')[0] : 'openai';\n }\n if (opts.instructions) updates.instructions = opts.instructions;\n\n if (Object.keys(updates).length === 0) {\n const a = agent as any;\n const name = await prompt(`Name [${a.name}]: `);\n const model = await prompt(`Model [${a.model}]: `);\n const instr = await prompt(`Instructions [keep current]: `);\n if (name) updates.name = name;\n if (model) { updates.model = model; updates.provider = model.includes(':') ? model.split(':')[0] : 'openai'; }\n if (instr) updates.instructions = instr;\n }\n\n if (Object.keys(updates).length === 0) { info('No changes made.'); return; }\n\n await safeCall(\n () => client.mutation('agents:update' as any, { _id: (agent as any)._id, ...updates }),\n 'Failed to update agent'\n );\n success(`Agent \"${id}\" updated.`);\n });\n\n agents\n .command('delete')\n .argument('<id>', 'Agent ID')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete an agent')\n .action(async (id, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete agent \"${id}\"? (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(\n () => client.mutation('agents:remove' as any, { _id: (agent as any)._id }),\n 'Failed to delete agent'\n );\n success(`Agent \"${id}\" deleted.`);\n });\n\n agents\n .command('enable')\n .argument('<id>', 'Agent ID')\n .description('Enable an agent')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('agents:update' as any, { _id: (agent as any)._id, isActive: true }), 'Failed');\n success(`Agent \"${id}\" enabled.`);\n });\n\n agents\n .command('disable')\n .argument('<id>', 'Agent ID')\n .description('Disable an agent')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('agents:update' as any, { _id: (agent as any)._id, isActive: false }), 'Failed');\n success(`Agent \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, success, error, info, dim, colors } from '../lib/display.js';\nimport readline from 'node:readline';\n\nexport function registerChatCommand(program: Command) {\n program\n .command('chat')\n .argument('[agent-id]', 'Agent ID to chat with')\n .option('-s, --session <id>', 'Resume an existing session')\n .description('Start an interactive chat session with an agent')\n .action(async (agentId, opts) => {\n const client = await createClient();\n\n if (!agentId && !opts.session) {\n const agents = await safeCall(() => client.query('agents:list' as any, {}), 'Failed to list agents');\n if (!agents || (agents as any[]).length === 0) {\n error('No agents found. Create one first: agentforge agents create');\n process.exit(1);\n }\n header('Available Agents');\n (agents as any[]).forEach((a: any, i: number) => {\n console.log(` ${colors.cyan}${i + 1}.${colors.reset} ${a.name} ${colors.dim}(${a.id})${colors.reset}`);\n });\n console.log();\n const rl2 = readline.createInterface({ input: process.stdin, output: process.stdout });\n const choice = await new Promise<string>((r) => rl2.question('Select agent (number or ID): ', (a) => { rl2.close(); r(a.trim()); }));\n const idx = parseInt(choice) - 1;\n agentId = idx >= 0 && idx < (agents as any[]).length ? (agents as any[])[idx].id : choice;\n }\n\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id: agentId }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${agentId}\" not found.`); process.exit(1); }\n\n const a = agent as any;\n header(`Chat with ${a.name}`);\n dim(` Model: ${a.model} | Provider: ${a.provider || 'openai'}`);\n dim(` Type \"exit\" or \"quit\" to end. \"/new\" for new thread. \"/history\" for messages.`);\n console.log();\n\n let threadId = await safeCall(\n () => client.mutation('threads:create' as any, { agentId: a.id, status: 'active' }),\n 'Failed to create thread'\n );\n\n const history: Array<{ role: string; content: string }> = [];\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: `${colors.green}You${colors.reset} > ` });\n rl.prompt();\n\n rl.on('line', async (line) => {\n const input = line.trim();\n if (!input) { rl.prompt(); return; }\n if (input === 'exit' || input === 'quit') { success('Session ended. Goodbye!'); process.exit(0); }\n if (input === '/new') {\n threadId = await safeCall(() => client.mutation('threads:create' as any, { agentId: a.id, status: 'active' }), 'Failed');\n history.length = 0;\n info('New thread started.');\n rl.prompt();\n return;\n }\n if (input === '/history') {\n history.forEach((m) => {\n const prefix = m.role === 'user' ? `${colors.green}You${colors.reset}` : `${colors.cyan}${a.name}${colors.reset}`;\n console.log(` ${prefix}: ${m.content}`);\n });\n if (history.length === 0) dim(' (no messages yet)');\n console.log();\n rl.prompt();\n return;\n }\n\n history.push({ role: 'user', content: input });\n await safeCall(() => client.mutation('messages:send' as any, { threadId, role: 'user', content: input }), 'Failed to send');\n\n process.stdout.write(`${colors.cyan}${a.name}${colors.reset} > `);\n try {\n const response = await safeCall(\n () => client.action('mastraIntegration:generateResponse' as any, { agentId: a.id, threadId, message: input }),\n 'Failed to get response'\n );\n const text = (response as any)?.text || (response as any)?.content || String(response);\n console.log(text);\n history.push({ role: 'assistant', content: text });\n } catch {\n console.log(`${colors.yellow}[Configure your LLM API key in .env to get responses]${colors.reset}`);\n }\n console.log();\n rl.prompt();\n });\n\n rl.on('close', () => { console.log(); info('Session ended.'); process.exit(0); });\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\n\nexport function registerSessionsCommand(program: Command) {\n const sessions = program.command('sessions').description('Manage sessions');\n\n sessions\n .command('list')\n .option('--status <status>', 'Filter by status (active, ended)')\n .option('--json', 'Output as JSON')\n .description('List all sessions')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('sessions:list' as any, {}), 'Failed to list sessions');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Sessions');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No sessions found.'); return; }\n const filtered = opts.status ? items.filter((s: any) => s.status === opts.status) : items;\n table(filtered.map((s: any) => ({\n ID: s._id?.slice(-8) || 'N/A',\n Name: s.name || 'Unnamed',\n Agent: s.agentId,\n Status: s.status,\n Started: formatDate(s.startedAt),\n 'Last Activity': formatDate(s.lastActivityAt),\n })));\n });\n\n sessions\n .command('inspect')\n .argument('<id>', 'Session ID')\n .description('Show session details')\n .action(async (id) => {\n const client = await createClient();\n const session = await safeCall(() => client.query('sessions:getById' as any, { id }), 'Failed to fetch session');\n if (!session) { error(`Session \"${id}\" not found.`); process.exit(1); }\n const s = session as any;\n header(`Session: ${s.name || 'Unnamed'}`);\n details({ ID: s._id, Name: s.name, Agent: s.agentId, Status: s.status, Started: formatDate(s.startedAt), 'Last Activity': formatDate(s.lastActivityAt) });\n });\n\n sessions\n .command('end')\n .argument('<id>', 'Session ID')\n .description('End an active session')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('sessions:update' as any, { _id: id, status: 'ended' }), 'Failed to end session');\n success(`Session \"${id}\" ended.`);\n });\n}\n\nexport function registerThreadsCommand(program: Command) {\n const threads = program.command('threads').description('Manage conversation threads');\n\n threads\n .command('list')\n .option('--agent <id>', 'Filter by agent ID')\n .option('--json', 'Output as JSON')\n .description('List all threads')\n .action(async (opts) => {\n const client = await createClient();\n const args = opts.agent ? { agentId: opts.agent } : {};\n const result = await safeCall(() => client.query('threads:list' as any, args), 'Failed to list threads');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Threads');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No threads found.'); return; }\n table(items.map((t: any) => ({\n ID: t._id?.slice(-8) || 'N/A',\n Name: t.name || 'Unnamed',\n Agent: t.agentId,\n Status: t.status,\n Created: formatDate(t.createdAt),\n })));\n });\n\n threads\n .command('inspect')\n .argument('<id>', 'Thread ID')\n .description('Show thread messages')\n .action(async (id) => {\n const client = await createClient();\n const messages = await safeCall(() => client.query('messages:listByThread' as any, { threadId: id }), 'Failed to fetch messages');\n header(`Thread: ${id}`);\n const items = (messages as any[]) || [];\n if (items.length === 0) { info('No messages in this thread.'); return; }\n items.forEach((m: any) => {\n const role = m.role === 'user' ? '\\x1b[32mUser\\x1b[0m' : m.role === 'assistant' ? '\\x1b[36mAssistant\\x1b[0m' : `\\x1b[33m${m.role}\\x1b[0m`;\n console.log(` ${role}: ${m.content}`);\n });\n console.log();\n });\n\n threads\n .command('delete')\n .argument('<id>', 'Thread ID')\n .description('Delete a thread and its messages')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('threads:remove' as any, { _id: id }), 'Failed to delete thread');\n success(`Thread \"${id}\" deleted.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, dim, colors, formatDate } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerSkillsCommand(program: Command) {\n const skills = program.command('skills').description('Manage agent skills');\n\n skills\n .command('list')\n .option('--installed', 'Show only installed skills')\n .option('--json', 'Output as JSON')\n .description('List all skills')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('skills:list' as any, {}), 'Failed to list skills');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Skills');\n\n // Also check local skills directory\n const localSkills: string[] = [];\n const skillsDir = path.join(process.cwd(), 'skills');\n if (fs.existsSync(skillsDir)) {\n const dirs = fs.readdirSync(skillsDir).filter((d: string) => fs.statSync(path.join(skillsDir, d)).isDirectory());\n localSkills.push(...dirs);\n }\n\n const items = (result as any[]) || [];\n if (items.length === 0 && localSkills.length === 0) {\n info('No skills found. Install one with: agentforge skills install <name>');\n info('Or create one with: agentforge skills create');\n return;\n }\n\n if (localSkills.length > 0) {\n dim(' Local Skills:');\n localSkills.forEach((s) => {\n const configPath = path.join(skillsDir, s, 'config.json');\n let desc = '';\n if (fs.existsSync(configPath)) {\n try { desc = JSON.parse(fs.readFileSync(configPath, 'utf-8')).description || ''; } catch {}\n }\n console.log(` ${colors.cyan}●${colors.reset} ${s} ${colors.dim}${desc}${colors.reset}`);\n });\n console.log();\n }\n\n if (items.length > 0) {\n const filtered = opts.installed ? items.filter((s: any) => s.isInstalled) : items;\n table(filtered.map((s: any) => ({\n Name: s.name,\n Category: s.category,\n Version: s.version,\n Installed: s.isInstalled ? '✔' : '✖',\n Agent: s.agentId || 'all',\n })));\n }\n });\n\n skills\n .command('create')\n .description('Create a new skill (interactive)')\n .option('--name <name>', 'Skill name')\n .option('--description <desc>', 'Skill description')\n .option('--category <cat>', 'Category (utility, web, file, data, integration, ai, custom)')\n .action(async (opts) => {\n const name = opts.name || await prompt('Skill name (kebab-case): ');\n const description = opts.description || await prompt('Description: ');\n const category = opts.category || await prompt('Category (utility/web/file/data/integration/ai/custom): ') || 'custom';\n\n if (!name) { error('Skill name is required.'); process.exit(1); }\n\n const skillDir = path.join(process.cwd(), 'skills', name);\n if (fs.existsSync(skillDir)) { error(`Skill \"${name}\" already exists at ${skillDir}`); process.exit(1); }\n\n fs.mkdirSync(skillDir, { recursive: true });\n\n // config.json\n fs.writeFileSync(path.join(skillDir, 'config.json'), JSON.stringify({\n name, version: '1.0.0', description, category, author: 'User',\n tools: [name], dependencies: [],\n agentInstructions: `You have access to the ${name} skill. ${description}`,\n }, null, 2));\n\n // index.ts\n fs.writeFileSync(path.join(skillDir, 'index.ts'), `import { z } from 'zod';\n\n/**\n * ${name} — AgentForge Skill\n * ${description}\n */\nexport const tools = [\n {\n name: '${name}',\n description: '${description}',\n inputSchema: z.object({\n input: z.string().describe('Input for ${name}'),\n }),\n outputSchema: z.object({\n result: z.string(),\n success: z.boolean(),\n }),\n handler: async (params: { input: string }) => {\n // TODO: Implement your skill logic here\n return { result: \\`Processed: \\${params.input}\\`, success: true };\n },\n },\n];\n\nexport default { tools };\n`);\n\n // SKILL.md\n fs.writeFileSync(path.join(skillDir, 'SKILL.md'), `# ${name}\\n\\n${description}\\n\\n## Usage\\n\\nAsk your agent: \"Use the ${name} tool to [your request]\"\\n\\n## Configuration\\n\\nEdit \\`skills/${name}/config.json\\` to customize.\\n`);\n\n success(`Skill \"${name}\" created at skills/${name}/`);\n info('Files created: index.ts, config.json, SKILL.md');\n info(`Edit skills/${name}/index.ts to implement your tool logic.`);\n });\n\n skills\n .command('install')\n .argument('<name>', 'Skill name to install')\n .description('Install a skill')\n .action(async (name) => {\n const client = await createClient();\n await safeCall(\n () => client.mutation('skills:create' as any, {\n name, category: 'custom', version: '1.0.0', isInstalled: true,\n }),\n 'Failed to install skill'\n );\n success(`Skill \"${name}\" installed.`);\n });\n\n skills\n .command('remove')\n .argument('<name>', 'Skill name to remove')\n .description('Remove a skill')\n .action(async (name) => {\n const skillDir = path.join(process.cwd(), 'skills', name);\n if (fs.existsSync(skillDir)) {\n const confirm = await prompt(`Remove skill \"${name}\" and delete files? (y/N): `);\n if (confirm.toLowerCase() === 'y') {\n fs.removeSync(skillDir);\n success(`Skill \"${name}\" removed from disk.`);\n }\n }\n // Also remove from Convex\n const client = await createClient();\n try {\n const skills = await client.query('skills:list' as any, {});\n const skill = (skills as any[]).find((s: any) => s.name === name);\n if (skill) {\n await client.mutation('skills:remove' as any, { _id: skill._id });\n success(`Skill \"${name}\" removed from database.`);\n }\n } catch { /* ignore if not in db */ }\n });\n\n skills\n .command('search')\n .argument('<query>', 'Search query')\n .description('Search available skills')\n .action(async (query) => {\n header('Skill Search Results');\n // Search built-in examples\n const examples = [\n { name: 'web-search', desc: 'Search the web for information', cat: 'web' },\n { name: 'calculator', desc: 'Evaluate mathematical expressions', cat: 'utility' },\n { name: 'file-reader', desc: 'Read file contents', cat: 'file' },\n { name: 'http-request', desc: 'Make HTTP requests', cat: 'web' },\n { name: 'json-transformer', desc: 'Transform JSON data', cat: 'data' },\n { name: 'text-summarizer', desc: 'Summarize text into key points', cat: 'ai' },\n { name: 'csv-parser', desc: 'Parse CSV into structured JSON', cat: 'data' },\n ];\n const q = query.toLowerCase();\n const matches = examples.filter((e) => e.name.includes(q) || e.desc.toLowerCase().includes(q) || e.cat.includes(q));\n if (matches.length === 0) { info(`No skills matching \"${query}\". Try: agentforge skills create`); return; }\n table(matches.map((e) => ({ Name: e.name, Description: e.desc, Category: e.cat })));\n info('Install with: agentforge skills install <name>');\n info('Or see examples: check skills/skill-creator/SKILL.md');\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerCronCommand(program: Command) {\n const cron = program.command('cron').description('Manage cron jobs');\n\n cron\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all cron jobs')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('cronJobs:list' as any, {}), 'Failed to list cron jobs');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Cron Jobs');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No cron jobs. Create one with: agentforge cron create'); return; }\n table(items.map((c: any) => ({\n ID: c._id?.slice(-8) || 'N/A',\n Name: c.name,\n Schedule: c.schedule,\n Agent: c.agentId,\n Enabled: c.isEnabled ? '✔' : '✖',\n 'Last Run': c.lastRunAt ? formatDate(c.lastRunAt) : 'Never',\n 'Next Run': c.nextRunAt ? formatDate(c.nextRunAt) : 'N/A',\n })));\n });\n\n cron\n .command('create')\n .description('Create a new cron job (interactive)')\n .option('--name <name>', 'Job name')\n .option('--schedule <cron>', 'Cron expression')\n .option('--agent <id>', 'Agent ID')\n .option('--action <action>', 'Action to execute')\n .action(async (opts) => {\n const name = opts.name || await prompt('Job name: ');\n const schedule = opts.schedule || await prompt('Cron schedule (e.g., \"0 */5 * * * *\" for every 5 min): ');\n const agentId = opts.agent || await prompt('Agent ID: ');\n const action = opts.action || await prompt('Action (message to send to agent): ');\n\n if (!name || !schedule || !agentId || !action) {\n error('All fields are required.'); process.exit(1);\n }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('cronJobs:create' as any, { name, schedule, agentId, action, isEnabled: true }),\n 'Failed to create cron job'\n );\n success(`Cron job \"${name}\" created.`);\n });\n\n cron\n .command('delete')\n .argument('<id>', 'Cron job ID')\n .description('Delete a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:remove' as any, { _id: id }), 'Failed to delete');\n success(`Cron job \"${id}\" deleted.`);\n });\n\n cron\n .command('enable')\n .argument('<id>', 'Cron job ID')\n .description('Enable a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:update' as any, { _id: id, isEnabled: true }), 'Failed');\n success(`Cron job \"${id}\" enabled.`);\n });\n\n cron\n .command('disable')\n .argument('<id>', 'Cron job ID')\n .description('Disable a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:update' as any, { _id: id, isEnabled: false }), 'Failed');\n success(`Cron job \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerMcpCommand(program: Command) {\n const mcp = program.command('mcp').description('Manage MCP connections');\n\n mcp\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all MCP connections')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('mcpConnections:list' as any, {}), 'Failed to list connections');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('MCP Connections');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No connections. Add one with: agentforge mcp add'); return; }\n table(items.map((c: any) => ({\n ID: c._id?.slice(-8) || 'N/A',\n Name: c.name,\n Type: c.type,\n Endpoint: c.endpoint,\n Connected: c.isConnected ? '✔' : '✖',\n Enabled: c.isEnabled ? '✔' : '✖',\n })));\n });\n\n mcp\n .command('add')\n .description('Add a new MCP connection (interactive)')\n .option('--name <name>', 'Connection name')\n .option('--type <type>', 'Connection type (stdio, sse, http)')\n .option('--endpoint <url>', 'Endpoint URL or command')\n .action(async (opts) => {\n const name = opts.name || await prompt('Connection name: ');\n const type = opts.type || await prompt('Type (stdio/sse/http): ');\n const endpoint = opts.endpoint || await prompt('Endpoint (URL or command): ');\n\n if (!name || !type || !endpoint) { error('All fields required.'); process.exit(1); }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('mcpConnections:create' as any, {\n name, type, endpoint, isConnected: false, isEnabled: true,\n }),\n 'Failed to add connection'\n );\n success(`MCP connection \"${name}\" added.`);\n });\n\n mcp\n .command('remove')\n .argument('<id>', 'Connection ID')\n .description('Remove an MCP connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:remove' as any, { _id: id }), 'Failed');\n success(`Connection \"${id}\" removed.`);\n });\n\n mcp\n .command('test')\n .argument('<id>', 'Connection ID')\n .description('Test an MCP connection')\n .action(async (id) => {\n info(`Testing connection \"${id}\"...`);\n const client = await createClient();\n const conns = await safeCall(() => client.query('mcpConnections:list' as any, {}), 'Failed');\n const conn = (conns as any[]).find((c: any) => c._id === id || c._id?.endsWith(id));\n if (!conn) { error(`Connection \"${id}\" not found.`); process.exit(1); }\n\n // Simple connectivity test\n if (conn.type === 'http' || conn.type === 'sse') {\n try {\n const res = await fetch(conn.endpoint, { method: 'HEAD', signal: AbortSignal.timeout(5000) });\n if (res.ok) {\n success(`Connection \"${conn.name}\" is reachable (HTTP ${res.status}).`);\n await client.mutation('mcpConnections:update' as any, { _id: conn._id, isConnected: true });\n } else {\n error(`Connection \"${conn.name}\" returned HTTP ${res.status}.`);\n }\n } catch (e: any) {\n error(`Connection \"${conn.name}\" failed: ${e.message}`);\n }\n } else {\n info(`Connection type \"${conn.type}\" — manual verification required.`);\n info(`Endpoint: ${conn.endpoint}`);\n }\n });\n\n mcp\n .command('enable')\n .argument('<id>', 'Connection ID')\n .description('Enable a connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:update' as any, { _id: id, isEnabled: true }), 'Failed');\n success(`Connection \"${id}\" enabled.`);\n });\n\n mcp\n .command('disable')\n .argument('<id>', 'Connection ID')\n .description('Disable a connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:update' as any, { _id: id, isEnabled: false }), 'Failed');\n success(`Connection \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, formatDate } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nexport function registerFilesCommand(program: Command) {\n const files = program.command('files').description('Manage files');\n\n files\n .command('list')\n .argument('[folder]', 'Folder ID to list files from')\n .option('--json', 'Output as JSON')\n .description('List files')\n .action(async (folder, opts) => {\n const client = await createClient();\n const args = folder ? { folderId: folder } : {};\n const result = await safeCall(() => client.query('files:list' as any, args), 'Failed to list files');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Files');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No files. Upload one with: agentforge files upload <path>'); return; }\n table(items.map((f: any) => ({\n ID: f._id?.slice(-8) || 'N/A',\n Name: f.name,\n Type: f.mimeType,\n Size: formatSize(f.size),\n Folder: f.folderId || 'root',\n Created: formatDate(f.createdAt),\n })));\n });\n\n files\n .command('upload')\n .argument('<filepath>', 'Path to file to upload')\n .option('--folder <id>', 'Folder ID to upload to')\n .option('--project <id>', 'Project ID to associate with')\n .description('Upload a file')\n .action(async (filepath, opts) => {\n const absPath = path.resolve(filepath);\n if (!fs.existsSync(absPath)) { error(`File not found: ${absPath}`); process.exit(1); }\n\n const stat = fs.statSync(absPath);\n const name = path.basename(absPath);\n const ext = path.extname(absPath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n '.txt': 'text/plain', '.md': 'text/markdown', '.json': 'application/json',\n '.js': 'text/javascript', '.ts': 'text/typescript', '.py': 'text/x-python',\n '.pdf': 'application/pdf', '.png': 'image/png', '.jpg': 'image/jpeg',\n '.csv': 'text/csv', '.html': 'text/html', '.xml': 'text/xml',\n };\n const mimeType = mimeTypes[ext] || 'application/octet-stream';\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('files:create' as any, {\n name, mimeType, size: stat.size,\n folderId: opts.folder, projectId: opts.project,\n }),\n 'Failed to upload file metadata'\n );\n success(`File \"${name}\" registered (${formatSize(stat.size)}, ${mimeType}).`);\n info('Note: File content storage requires Convex file storage or R2 integration.');\n });\n\n files\n .command('delete')\n .argument('<id>', 'File ID')\n .description('Delete a file')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('files:remove' as any, { _id: id }), 'Failed to delete file');\n success(`File \"${id}\" deleted.`);\n });\n\n // Folders subcommand\n const folders = program.command('folders').description('Manage folders');\n\n folders\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all folders')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('folders:list' as any, {}), 'Failed to list folders');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Folders');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No folders. Create one with: agentforge folders create <name>'); return; }\n table(items.map((f: any) => ({\n ID: f._id?.slice(-8) || 'N/A',\n Name: f.name,\n Parent: f.parentId || 'root',\n Created: formatDate(f.createdAt),\n })));\n });\n\n folders\n .command('create')\n .argument('<name>', 'Folder name')\n .option('--parent <id>', 'Parent folder ID')\n .description('Create a folder')\n .action(async (name, opts) => {\n const client = await createClient();\n await safeCall(\n () => client.mutation('folders:create' as any, { name, parentId: opts.parent }),\n 'Failed to create folder'\n );\n success(`Folder \"${name}\" created.`);\n });\n\n folders\n .command('delete')\n .argument('<id>', 'Folder ID')\n .description('Delete a folder')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('folders:remove' as any, { _id: id }), 'Failed to delete folder');\n success(`Folder \"${id}\" deleted.`);\n });\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerProjectsCommand(program: Command) {\n const projects = program.command('projects').description('Manage projects and workspaces');\n\n projects\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all projects')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('projects:list' as any, {}), 'Failed to list projects');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Projects');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No projects. Create one with: agentforge projects create <name>'); return; }\n table(items.map((p: any) => ({\n ID: p._id?.slice(-8) || 'N/A',\n Name: p.name,\n Status: p.status,\n Description: (p.description || '').slice(0, 40),\n Created: formatDate(p.createdAt),\n })));\n });\n\n projects\n .command('create')\n .argument('<name>', 'Project name')\n .option('-d, --description <desc>', 'Project description')\n .description('Create a new project')\n .action(async (name, opts) => {\n const description = opts.description || await prompt('Description (optional): ');\n const client = await createClient();\n await safeCall(\n () => client.mutation('projects:create' as any, { name, description, status: 'active' }),\n 'Failed to create project'\n );\n success(`Project \"${name}\" created.`);\n });\n\n projects\n .command('inspect')\n .argument('<id>', 'Project ID')\n .description('Show project details')\n .action(async (id) => {\n const client = await createClient();\n const projects = await safeCall(() => client.query('projects:list' as any, {}), 'Failed');\n const project = (projects as any[]).find((p: any) => p._id === id || p._id?.endsWith(id));\n if (!project) { error(`Project \"${id}\" not found.`); process.exit(1); }\n header(`Project: ${project.name}`);\n details({\n ID: project._id,\n Name: project.name,\n Status: project.status,\n Description: project.description || 'N/A',\n Created: formatDate(project.createdAt),\n Updated: formatDate(project.updatedAt),\n });\n });\n\n projects\n .command('delete')\n .argument('<id>', 'Project ID')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete a project')\n .action(async (id, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete project \"${id}\"? (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n await safeCall(() => client.mutation('projects:remove' as any, { _id: id }), 'Failed');\n success(`Project \"${id}\" deleted.`);\n });\n\n projects\n .command('switch')\n .argument('<id>', 'Project ID to switch to')\n .description('Set the active project')\n .action(async (id) => {\n const client = await createClient();\n // Verify project exists\n const projects = await safeCall(() => client.query('projects:list' as any, {}), 'Failed');\n const project = (projects as any[]).find((p: any) => p._id === id || p._id?.endsWith(id));\n if (!project) { error(`Project \"${id}\" not found.`); process.exit(1); }\n // Store active project in settings\n await safeCall(\n () => client.mutation('settings:set' as any, { userId: 'cli', key: 'activeProject', value: project._id }),\n 'Failed to switch project'\n );\n success(`Switched to project \"${project.name}\".`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, details, colors } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerConfigCommand(program: Command) {\n const config = program.command('config').description('Manage configuration');\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n header('Configuration');\n\n // Check local .env files\n const cwd = process.cwd();\n const envFiles = ['.env', '.env.local', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n console.log(` ${colors.cyan}${envFile}${colors.reset}`);\n const content = fs.readFileSync(envPath, 'utf-8');\n content.split('\\n').forEach((line) => {\n if (line.trim() && !line.startsWith('#')) {\n const [key, ...rest] = line.split('=');\n const value = rest.join('=').trim();\n const masked = key.toLowerCase().includes('key') || key.toLowerCase().includes('secret') || key.toLowerCase().includes('token')\n ? value.slice(0, 4) + '****' + value.slice(-4)\n : value;\n console.log(` ${colors.dim}${key.trim()}${colors.reset} = ${masked}`);\n }\n });\n console.log();\n }\n }\n\n // Check Convex config\n const convexDir = path.join(cwd, '.convex');\n if (fs.existsSync(convexDir)) {\n info('Convex: Configured');\n } else {\n info('Convex: Not configured (run `npx convex dev`)');\n }\n\n // Check skills directory\n const skillsDir = path.join(cwd, 'skills');\n if (fs.existsSync(skillsDir)) {\n const skills = fs.readdirSync(skillsDir).filter((d: string) => fs.statSync(path.join(skillsDir, d)).isDirectory());\n info(`Skills: ${skills.length} installed (${skills.join(', ')})`);\n } else {\n info('Skills: None installed');\n }\n });\n\n config\n .command('set')\n .argument('<key>', 'Configuration key')\n .argument('<value>', 'Configuration value')\n .option('--env <file>', 'Environment file to update', '.env.local')\n .description('Set a configuration value')\n .action(async (key, value, opts) => {\n const envPath = path.join(process.cwd(), opts.env);\n let content = '';\n if (fs.existsSync(envPath)) {\n content = fs.readFileSync(envPath, 'utf-8');\n }\n\n const lines = content.split('\\n');\n const idx = lines.findIndex((l) => l.startsWith(`${key}=`));\n if (idx >= 0) {\n lines[idx] = `${key}=${value}`;\n } else {\n lines.push(`${key}=${value}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n'));\n success(`Set ${key} in ${opts.env}`);\n });\n\n config\n .command('get')\n .argument('<key>', 'Configuration key')\n .description('Get a configuration value')\n .action(async (key) => {\n const cwd = process.cwd();\n const envFiles = ['.env.local', '.env', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(new RegExp(`^${key}=(.+)$`, 'm'));\n if (match) {\n console.log(match[1].trim());\n return;\n }\n }\n }\n error(`Key \"${key}\" not found in any .env file.`);\n });\n\n config\n .command('init')\n .description('Initialize configuration for a new project')\n .action(async () => {\n header('Project Configuration');\n const convexUrl = await prompt('Convex URL (from `npx convex dev`): ');\n const provider = await prompt('LLM Provider (openai/openrouter/anthropic/google): ') || 'openai';\n const apiKey = await prompt(`${provider.toUpperCase()} API Key: `);\n\n const envContent = [\n `# AgentForge Configuration`,\n `CONVEX_URL=${convexUrl}`,\n ``,\n `# LLM Provider`,\n `LLM_PROVIDER=${provider}`,\n ];\n\n if (provider === 'openai') envContent.push(`OPENAI_API_KEY=${apiKey}`);\n else if (provider === 'openrouter') envContent.push(`OPENROUTER_API_KEY=${apiKey}`);\n else if (provider === 'anthropic') envContent.push(`ANTHROPIC_API_KEY=${apiKey}`);\n else if (provider === 'google') envContent.push(`GOOGLE_API_KEY=${apiKey}`);\n\n fs.writeFileSync(path.join(process.cwd(), '.env.local'), envContent.join('\\n') + '\\n');\n success('Configuration saved to .env.local');\n info('Run `npx convex dev` to start the Convex backend.');\n });\n\n config\n .command('provider')\n .argument('<provider>', 'LLM provider to configure (openai, openrouter, anthropic, google, xai)')\n .description('Configure an LLM provider')\n .action(async (provider) => {\n const keyNames: Record<string, string> = {\n openai: 'OPENAI_API_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GOOGLE_API_KEY',\n xai: 'XAI_API_KEY',\n };\n const keyName = keyNames[provider.toLowerCase()];\n if (!keyName) {\n error(`Unknown provider \"${provider}\". Supported: ${Object.keys(keyNames).join(', ')}`);\n process.exit(1);\n }\n const apiKey = await prompt(`${keyName}: `);\n if (!apiKey) { error('API key is required.'); process.exit(1); }\n\n const envPath = path.join(process.cwd(), '.env.local');\n let content = '';\n if (fs.existsSync(envPath)) content = fs.readFileSync(envPath, 'utf-8');\n\n const lines = content.split('\\n');\n const idx = lines.findIndex((l) => l.startsWith(`${keyName}=`));\n if (idx >= 0) lines[idx] = `${keyName}=${apiKey}`;\n else lines.push(`${keyName}=${apiKey}`);\n\n // Also set LLM_PROVIDER\n const provIdx = lines.findIndex((l) => l.startsWith('LLM_PROVIDER='));\n if (provIdx >= 0) lines[provIdx] = `LLM_PROVIDER=${provider}`;\n else lines.push(`LLM_PROVIDER=${provider}`);\n\n fs.writeFileSync(envPath, lines.join('\\n'));\n success(`Provider \"${provider}\" configured.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, dim, colors, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nfunction promptSecret(q: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n // Disable echo for secret input\n if (process.stdin.isTTY) {\n process.stdout.write(q);\n let input = '';\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf-8');\n const onData = (char: string) => {\n if (char === '\\n' || char === '\\r') {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n console.log();\n rl.close();\n resolve(input);\n } else if (char === '\\u0003') {\n process.exit();\n } else if (char === '\\u007F') {\n input = input.slice(0, -1);\n process.stdout.clearLine(0);\n process.stdout.cursorTo(0);\n process.stdout.write(q + '*'.repeat(input.length));\n } else {\n input += char;\n process.stdout.write('*');\n }\n };\n process.stdin.on('data', onData);\n } else {\n rl.question(q, (ans) => { rl.close(); resolve(ans.trim()); });\n }\n });\n}\n\nexport function registerVaultCommand(program: Command) {\n const vault = program.command('vault').description('Manage secrets securely');\n\n vault\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all stored secrets (values hidden)')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed to list secrets');\n if (opts.json) {\n const safe = ((result as any[]) || []).map((s: any) => ({ ...s, encryptedValue: undefined }));\n console.log(JSON.stringify(safe, null, 2));\n return;\n }\n header('Vault — Stored Secrets');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No secrets stored. Add one with: agentforge vault set <name> <value>'); return; }\n table(items.map((s: any) => ({\n Name: s.name,\n Category: s.category || 'general',\n Provider: s.provider || 'N/A',\n 'Last Rotated': s.lastRotatedAt ? formatDate(s.lastRotatedAt) : 'Never',\n Created: formatDate(s.createdAt),\n })));\n });\n\n vault\n .command('set')\n .argument('<name>', 'Secret name (e.g., OPENAI_API_KEY)')\n .argument('[value]', 'Secret value (omit for secure prompt)')\n .option('--category <cat>', 'Category (api_key, token, secret, credential)', 'api_key')\n .option('--provider <provider>', 'Provider name (openai, anthropic, etc.)')\n .description('Store a secret securely')\n .action(async (name, value, opts) => {\n if (!value) {\n value = await promptSecret(`Enter value for ${name}: `);\n }\n if (!value) { error('Value is required.'); process.exit(1); }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('vault:store' as any, {\n name,\n encryptedValue: value,\n category: opts.category,\n provider: opts.provider,\n }),\n 'Failed to store secret'\n );\n success(`Secret \"${name}\" stored securely.`);\n });\n\n vault\n .command('get')\n .argument('<name>', 'Secret name')\n .option('--reveal', 'Show the actual value (use with caution)')\n .description('Retrieve a secret')\n .action(async (name, opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n\n if (opts.reveal) {\n const value = await safeCall(\n () => client.query('vault:getDecrypted' as any, { _id: secret._id }),\n 'Failed to retrieve secret'\n );\n console.log(value);\n } else {\n const masked = secret.encryptedValue\n ? secret.encryptedValue.slice(0, 4) + '****' + secret.encryptedValue.slice(-4)\n : '****';\n info(`${name} = ${masked}`);\n dim(' Use --reveal to show the full value.');\n }\n });\n\n vault\n .command('delete')\n .argument('<name>', 'Secret name')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete a secret')\n .action(async (name, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete secret \"${name}\"? This cannot be undone. (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('vault:remove' as any, { _id: secret._id }), 'Failed');\n success(`Secret \"${name}\" deleted.`);\n });\n\n vault\n .command('rotate')\n .argument('<name>', 'Secret name')\n .description('Rotate a secret (set a new value)')\n .action(async (name) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n\n const newValue = await promptSecret(`Enter new value for ${name}: `);\n if (!newValue) { error('Value is required.'); process.exit(1); }\n\n await safeCall(\n () => client.mutation('vault:rotate' as any, { _id: secret._id, newValue }),\n 'Failed to rotate secret'\n );\n success(`Secret \"${name}\" rotated.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient } from '../lib/convex-client.js';\nimport { header, success, error, info, dim, table } from '../lib/display.js';\n\nfunction safeCall<T>(fn: () => Promise<T>, msg: string): Promise<T> {\n return fn().catch((e: any) => { error(`${msg}: ${e.message}`); process.exit(1); });\n}\n\nfunction formatDate(ts: number): string {\n return new Date(ts).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 12) return key.substring(0, 4) + '****';\n return key.substring(0, 8) + '...' + key.substring(key.length - 4);\n}\n\nfunction promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n const readline = require('readline');\n if (process.stdin.isTTY) {\n process.stdout.write(question);\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n let input = '';\n const onData = (char: string) => {\n if (char === '\\n' || char === '\\r' || char === '\\u0004') {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n resolve(input);\n } else if (char === '\\u0003') {\n process.exit(0);\n } else if (char === '\\u007f' || char === '\\b') {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else {\n input += char;\n process.stdout.write('*');\n }\n };\n process.stdin.on('data', onData);\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (ans: string) => { rl.close(); resolve(ans.trim()); });\n }\n });\n}\n\nconst PROVIDERS = [\n { id: 'openai', name: 'OpenAI', prefix: 'sk-' },\n { id: 'anthropic', name: 'Anthropic', prefix: 'sk-ant-' },\n { id: 'openrouter', name: 'OpenRouter', prefix: 'sk-or-' },\n { id: 'google', name: 'Google AI', prefix: 'AIza' },\n { id: 'xai', name: 'xAI', prefix: 'xai-' },\n { id: 'groq', name: 'Groq', prefix: 'gsk_' },\n { id: 'together', name: 'Together AI', prefix: '' },\n { id: 'perplexity', name: 'Perplexity', prefix: 'pplx-' },\n];\n\nexport function registerKeysCommand(program: Command) {\n const keys = program.command('keys').description('Manage AI provider API keys');\n\n keys\n .command('list')\n .option('--provider <provider>', 'Filter by provider')\n .option('--json', 'Output as JSON')\n .description('List all configured API keys')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:list' as any, opts.provider ? { provider: opts.provider } : {}),\n 'Failed to list API keys'\n );\n\n const items = (result as any[]) || [];\n\n if (opts.json) {\n const safe = items.map((k: any) => ({ ...k, encryptedKey: maskKey(k.encryptedKey) }));\n console.log(JSON.stringify(safe, null, 2));\n return;\n }\n\n header('API Keys');\n\n if (items.length === 0) {\n info('No API keys configured.');\n dim(' Add one with: agentforge keys add <provider> [key]');\n dim('');\n dim(' Supported providers:');\n PROVIDERS.forEach(p => dim(` ${p.id.padEnd(12)} ${p.name}`));\n return;\n }\n\n table(items.map((k: any) => ({\n Provider: k.provider,\n Name: k.keyName,\n Key: maskKey(k.encryptedKey),\n Active: k.isActive ? '✓' : '✗',\n Created: formatDate(k.createdAt),\n 'Last Used': k.lastUsedAt ? formatDate(k.lastUsedAt) : 'Never',\n })));\n });\n\n keys\n .command('add')\n .argument('<provider>', `Provider (${PROVIDERS.map(p => p.id).join(', ')})`)\n .argument('[key]', 'API key value (omit for secure prompt)')\n .option('--name <name>', 'Key display name')\n .description('Add an AI provider API key')\n .action(async (provider, key, opts) => {\n const providerInfo = PROVIDERS.find(p => p.id === provider);\n if (!providerInfo) {\n error(`Unknown provider \"${provider}\". Supported: ${PROVIDERS.map(p => p.id).join(', ')}`);\n process.exit(1);\n }\n\n if (!key) {\n key = await promptSecret(`Enter ${providerInfo.name} API key: `);\n }\n if (!key) { error('API key is required.'); process.exit(1); }\n\n if (providerInfo.prefix && !key.startsWith(providerInfo.prefix)) {\n info(`Warning: ${providerInfo.name} keys typically start with \"${providerInfo.prefix}\".`);\n }\n\n const keyName = opts.name || `${providerInfo.name} Key`;\n const client = await createClient();\n await safeCall(\n () => client.mutation('apiKeys:create' as any, {\n provider,\n keyName,\n encryptedKey: key,\n }),\n 'Failed to store API key'\n );\n success(`${providerInfo.name} API key \"${keyName}\" stored successfully.`);\n });\n\n keys\n .command('remove')\n .argument('<provider>', 'Provider name')\n .option('-f, --force', 'Skip confirmation')\n .description('Remove an API key')\n .action(async (provider, opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:list' as any, { provider }),\n 'Failed to list keys'\n );\n const items = (result as any[]) || [];\n if (items.length === 0) { error(`No API keys found for \"${provider}\".`); process.exit(1); }\n\n // If multiple keys, remove the first one (or we could add selection)\n const target = items[0];\n\n if (!opts.force) {\n const readline = require('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`Delete \"${target.keyName}\" for ${provider}? (y/N): `, (ans: string) => { rl.close(); resolve(ans.trim()); });\n });\n if (answer.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n\n await safeCall(\n () => client.mutation('apiKeys:remove' as any, { id: target._id }),\n 'Failed to remove API key'\n );\n success(`API key \"${target.keyName}\" removed.`);\n });\n\n keys\n .command('test')\n .argument('<provider>', 'Provider to test')\n .description('Test an API key by making a simple request')\n .action(async (provider) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:getActiveForProvider' as any, { provider }),\n 'Failed to get key'\n );\n\n if (!result) { error(`No active API key for \"${provider}\". Add one with: agentforge keys add ${provider}`); process.exit(1); }\n\n const key = (result as any).encryptedKey;\n info(`Testing ${provider} API key...`);\n\n try {\n let ok = false;\n if (provider === 'openai') {\n const res = await fetch('https://api.openai.com/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else if (provider === 'anthropic') {\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: { 'x-api-key': key, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'claude-3-haiku-20240307', max_tokens: 1, messages: [{ role: 'user', content: 'hi' }] }),\n });\n ok = res.ok;\n } else if (provider === 'openrouter') {\n const res = await fetch('https://openrouter.ai/api/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else if (provider === 'google') {\n const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${key}`);\n ok = res.ok;\n } else if (provider === 'groq') {\n const res = await fetch('https://api.groq.com/openai/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else {\n info(`No test endpoint configured for \"${provider}\". Key is stored.`);\n return;\n }\n\n if (ok) {\n success(`${provider} API key is valid and working.`);\n await safeCall(\n () => client.mutation('apiKeys:updateLastUsed' as any, { id: (result as any)._id }),\n 'Failed to update last used'\n );\n } else {\n error(`${provider} API key returned an error. Check that the key is valid.`);\n }\n } catch (e: any) {\n error(`Connection failed: ${e.message}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, details, success, error, info, dim, colors } from '../lib/display.js';\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'fs-extra';\nimport readline from 'node:readline';\n\nexport function registerStatusCommand(program: Command) {\n program\n .command('status')\n .description('Show system health and connection status')\n .action(async () => {\n header('AgentForge Status');\n\n const cwd = process.cwd();\n const checks: Record<string, string> = {};\n\n checks['Project Root'] = fs.existsSync(path.join(cwd, 'package.json')) ? '✔ Found' : '✖ Not found';\n checks['Convex Dir'] = fs.existsSync(path.join(cwd, 'convex')) ? '✔ Found' : '✖ Not found';\n checks['Skills Dir'] = fs.existsSync(path.join(cwd, 'skills')) ? '✔ Found' : '✖ Not configured';\n checks['Dashboard Dir'] = fs.existsSync(path.join(cwd, 'dashboard')) ? '✔ Found' : '✖ Not found';\n checks['Env Config'] = fs.existsSync(path.join(cwd, '.env.local')) || fs.existsSync(path.join(cwd, '.env'))\n ? '✔ Found' : '✖ Not found';\n\n // Check Convex connection\n try {\n const client = await createClient();\n const agents = await client.query('agents:list' as any, {});\n checks['Convex Connection'] = `✔ Connected (${(agents as any[])?.length || 0} agents)`;\n } catch {\n checks['Convex Connection'] = '✖ Not connected (run `npx convex dev`)';\n }\n\n // Check LLM provider\n const envFiles = ['.env.local', '.env'];\n let provider = 'Not configured';\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(/LLM_PROVIDER=(.+)/);\n if (match) { provider = match[1].trim(); break; }\n if (content.includes('OPENAI_API_KEY=')) { provider = 'openai'; break; }\n if (content.includes('OPENROUTER_API_KEY=')) { provider = 'openrouter'; break; }\n }\n }\n checks['LLM Provider'] = provider !== 'Not configured' ? `✔ ${provider}` : '✖ Not configured';\n\n details(checks);\n });\n\n program\n .command('dashboard')\n .description('Launch the web dashboard')\n .option('-p, --port <port>', 'Port for the dashboard', '3000')\n .option('--install', 'Install dashboard dependencies before starting')\n .action(async (opts) => {\n const cwd = process.cwd();\n\n // Search for the dashboard in multiple locations (in priority order)\n const searchPaths = [\n path.join(cwd, 'dashboard'), // 1. Bundled in project (agentforge create)\n path.join(cwd, 'packages', 'web'), // 2. Monorepo structure\n path.join(cwd, 'node_modules', '@agentforge-ai', 'web'), // 3. Installed as dependency\n ];\n\n let dashDir = '';\n for (const p of searchPaths) {\n if (fs.existsSync(path.join(p, 'package.json'))) {\n dashDir = p;\n break;\n }\n }\n\n if (!dashDir) {\n error('Dashboard not found!');\n console.log();\n info('The dashboard should be in your project\\'s ./dashboard/ directory.');\n info('If you created this project with an older version of AgentForge,');\n info('you can add it manually:');\n console.log();\n console.log(` ${colors.cyan}# Option 1: Recreate the project${colors.reset}`);\n console.log(` agentforge create my-project`);\n console.log();\n console.log(` ${colors.cyan}# Option 2: Clone the dashboard from the repo${colors.reset}`);\n console.log(` git clone https://github.com/Agentic-Engineering-Agency/agentforge /tmp/af`);\n console.log(` cp -r /tmp/af/packages/web ./dashboard`);\n console.log(` cd dashboard && pnpm install`);\n console.log();\n return;\n }\n\n // Check if node_modules exists, if not install\n const nodeModulesExists = fs.existsSync(path.join(dashDir, 'node_modules'));\n if (!nodeModulesExists || opts.install) {\n header('AgentForge Dashboard — Installing Dependencies');\n info(`Installing in ${path.relative(cwd, dashDir) || '.'}...`);\n console.log();\n\n const installChild = spawn('pnpm', ['install'], {\n cwd: dashDir,\n stdio: 'inherit',\n shell: true,\n });\n\n await new Promise<void>((resolve, reject) => {\n installChild.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`pnpm install exited with code ${code}`));\n });\n installChild.on('error', reject);\n });\n\n console.log();\n success('Dependencies installed.');\n console.log();\n }\n\n // Read the Convex URL from .env.local and inject it into the dashboard\n const envPath = path.join(cwd, '.env.local');\n if (fs.existsSync(envPath)) {\n const envContent = fs.readFileSync(envPath, 'utf-8');\n const convexUrlMatch = envContent.match(/CONVEX_URL=(.+)/);\n if (convexUrlMatch) {\n const dashEnvPath = path.join(dashDir, '.env.local');\n const dashEnvContent = `VITE_CONVEX_URL=${convexUrlMatch[1].trim()}\\n`;\n fs.writeFileSync(dashEnvPath, dashEnvContent);\n }\n }\n\n header('AgentForge Dashboard');\n info(`Starting dashboard on port ${opts.port}...`);\n info(`Open ${colors.cyan}http://localhost:${opts.port}${colors.reset} in your browser.`);\n console.log();\n\n const child = spawn('pnpm', ['dev', '--port', opts.port], {\n cwd: dashDir,\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('error', (err) => {\n error(`Failed to start dashboard: ${err.message}`);\n });\n });\n\n program\n .command('logs')\n .description('Show recent activity logs')\n .option('-n, --lines <count>', 'Number of log entries', '20')\n .option('--agent <id>', 'Filter by agent ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n const client = await createClient();\n const args: Record<string, any> = {};\n if (opts.agent) args.agentId = opts.agent;\n\n const result = await safeCall(\n () => client.query('usage:list' as any, args),\n 'Failed to fetch logs'\n );\n\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Activity Logs');\n const items = ((result as any[]) || []).slice(0, parseInt(opts.lines));\n if (items.length === 0) { info('No activity logs found.'); return; }\n\n items.forEach((log: any) => {\n const time = new Date(log.timestamp || log.createdAt).toLocaleString();\n const agent = log.agentId || 'system';\n const action = log.action || log.type || 'unknown';\n const tokens = log.tokensUsed ? `${log.tokensUsed} tokens` : '';\n console.log(` ${colors.dim}${time}${colors.reset} ${colors.cyan}${agent}${colors.reset} ${action} ${tokens}`);\n });\n console.log();\n });\n\n program\n .command('heartbeat')\n .description('Check and resume pending agent tasks')\n .option('--agent <id>', 'Check specific agent')\n .action(async (opts) => {\n const client = await createClient();\n header('Heartbeat Check');\n\n const args: Record<string, any> = {};\n if (opts.agent) args.agentId = opts.agent;\n\n const result = await safeCall(\n () => client.query('heartbeat:listPending' as any, args),\n 'Failed to check heartbeat'\n );\n\n const items = (result as any[]) || [];\n if (items.length === 0) {\n success('All tasks complete. No pending work.');\n return;\n }\n\n info(`Found ${items.length} pending task(s):`);\n items.forEach((task: any, i: number) => {\n console.log(` ${colors.yellow}${i + 1}.${colors.reset} [${task.agentId}] ${task.taskDescription || 'Unnamed task'}`);\n console.log(` ${colors.dim}Status: ${task.status} | Thread: ${task.threadId || 'N/A'}${colors.reset}`);\n });\n console.log();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((r) => rl.question('Resume pending tasks? (y/N): ', (a) => { rl.close(); r(a.trim()); }));\n if (answer.toLowerCase() === 'y') {\n for (const task of items) {\n info(`Resuming task for agent \"${task.agentId}\"...`);\n await safeCall(\n () => client.mutation('heartbeat:resume' as any, { _id: task._id }),\n 'Failed to resume task'\n );\n }\n success('All pending tasks resumed.');\n }\n });\n}\n"],"mappings":"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","names":["pkg","path","fs","path","execSync","fs","fs","path","error","resolve","program","readline","program","a","program","fs","path","readline","prompt","program","skills","readline","prompt","program","readline","prompt","program","fs","path","program","readline","prompt","program","projects","fs","path","readline","prompt","program","readline","prompt","resolve","program","safeCall","formatDate","promptSecret","resolve","readline","program","spawn","path","fs","readline","program","resolve","fileURLToPath","__filename","__dirname"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/create.ts","../src/commands/run.ts","../src/commands/deploy.ts","../src/lib/credentials.ts","../src/lib/cloud-client.ts","../src/lib/convex-client.ts","../src/lib/display.ts","../src/commands/agents.ts","../src/commands/chat.ts","../src/commands/sessions.ts","../src/commands/skills.ts","../src/commands/cron.ts","../src/commands/mcp.ts","../src/commands/files.ts","../src/commands/projects.ts","../src/commands/config.ts","../src/commands/vault.ts","../src/commands/keys.ts","../src/commands/status.ts","../src/commands/login.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create.js';\nimport { runProject } from './commands/run.js';\nimport { deployProject } from './commands/deploy.js';\nimport { registerAgentsCommand } from './commands/agents.js';\nimport { registerChatCommand } from './commands/chat.js';\nimport { registerSessionsCommand, registerThreadsCommand } from './commands/sessions.js';\nimport { registerSkillsCommand } from './commands/skills.js';\nimport { registerCronCommand } from './commands/cron.js';\nimport { registerMcpCommand } from './commands/mcp.js';\nimport { registerFilesCommand } from './commands/files.js';\nimport { registerProjectsCommand } from './commands/projects.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerVaultCommand } from './commands/vault.js';\nimport { registerKeysCommand } from './commands/keys.js';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerLoginCommand } from './commands/login.js';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, resolve } from 'node:path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('agentforge')\n .description('AgentForge — NanoClaw: A minimalist agent framework powered by Mastra + Convex')\n .version(pkg.version);\n\n// ─── Project Lifecycle ───────────────────────────────────────────\nprogram\n .command('create')\n .argument('<project-name>', 'Name of the project to create')\n .description('Create a new AgentForge project')\n .option('-t, --template <template>', 'Project template to use', 'default')\n .action(async (projectName: string, options: { template: string }) => {\n await createProject(projectName, options);\n });\n\nprogram\n .command('run')\n .description('Start the local development environment')\n .option('-p, --port <port>', 'Port for the dev server', '3000')\n .action(async (options: { port: string }) => {\n await runProject(options);\n });\n\nprogram\n .command('deploy')\n .description('Deploy the project to production')\n .option('--env <path>', 'Path to environment file', '.env.production')\n .option('--dry-run', 'Preview deployment without executing', false)\n .option('--rollback', 'Rollback to previous deployment', false)\n .option('--force', 'Skip confirmation prompts', false)\n .option('--provider <provider>', 'Deployment provider (convex or cloud)', 'convex')\n .option('--project <projectId>', 'Project ID for cloud deployments')\n .option('--version <tag>', 'Version tag for the deployment')\n .action(async (options: { \n env: string; \n dryRun: boolean; \n rollback: boolean; \n force: boolean;\n provider: 'convex' | 'cloud';\n project?: string;\n version?: string;\n }) => {\n await deployProject(options);\n });\n\n// ─── Cloud Authentication ────────────────────────────────────────\nregisterLoginCommand(program);\n\n// ─── Agent Management ────────────────────────────────────────────\nregisterAgentsCommand(program);\n\n// ─── Chat ────────────────────────────────────────────────────────\nregisterChatCommand(program);\n\n// ─── Sessions & Threads ──────────────────────────────────────────\nregisterSessionsCommand(program);\nregisterThreadsCommand(program);\n\n// ─── Skills ──────────────────────────────────────────────────────\nregisterSkillsCommand(program);\n\n// ─── Cron Jobs ───────────────────────────────────────────────────\nregisterCronCommand(program);\n\n// ─── MCP Connections ─────────────────────────────────────────────\nregisterMcpCommand(program);\n\n// ─── Files & Folders ─────────────────────────────────────────────\nregisterFilesCommand(program);\n\n// ─── Projects / Workspaces ───────────────────────────────────────\nregisterProjectsCommand(program);\n\n// ─── Configuration ───────────────────────────────────────────────\nregisterConfigCommand(program);\n\n// ─── Vault (Secrets) ─────────────────────────────────────────────\nregisterVaultCommand(program);\n\n// ─── AI Provider Keys ────────────────────────────────────────────\nregisterKeysCommand(program);\n\n// ─── Status, Dashboard, Logs, Heartbeat ──────────────────────────\nregisterStatusCommand(program);\n\nprogram.parse();\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport { execSync } from 'node:child_process';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Options for the create command.\n */\nexport interface CreateOptions {\n /** The project template to use. */\n template: string;\n}\n\n/**\n * Creates a new AgentForge project from a template.\n *\n * @param projectName - The name of the project to create.\n * @param options - Options for the create command.\n */\nexport async function createProject(\n projectName: string,\n options: CreateOptions\n): Promise<void> {\n const targetDir = path.resolve(process.cwd(), projectName);\n\n // Check if directory already exists\n if (await fs.pathExists(targetDir)) {\n console.error(`Error: Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n console.log(`\\n🔨 Creating AgentForge project: ${projectName}\\n`);\n\n // Resolve template directory\n // tsup publicDir copies templates/ contents into dist/, so dist/default/ exists\n // When running from dist/index.js, __dirname is dist/, so we check:\n // 1. dist/<template> (built bundle — tsup publicDir)\n // 2. ../templates/<template> (development — running from src/)\n // 3. ../../templates/<template> (fallback)\n const searchDirs = [\n path.resolve(__dirname, options.template), // dist/default (built)\n path.resolve(__dirname, '..', 'templates', options.template), // packages/cli/templates/default (dev)\n path.resolve(__dirname, '..', '..', 'templates', options.template), // fallback\n ];\n\n let templateDir = '';\n for (const dir of searchDirs) {\n if (await fs.pathExists(path.join(dir, 'package.json'))) {\n templateDir = dir;\n break;\n }\n }\n\n if (!templateDir) {\n console.error(`Error: Template \"${options.template}\" not found.`);\n console.error(`Searched in:`);\n searchDirs.forEach(d => console.error(` - ${d}`));\n process.exit(1);\n }\n\n // Copy template to target directory\n await fs.copy(templateDir, targetDir);\n\n // Update package.json with project name\n const pkgPath = path.join(targetDir, 'package.json');\n if (await fs.pathExists(pkgPath)) {\n const pkg = await fs.readJson(pkgPath);\n pkg.name = projectName;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n }\n\n // Update dashboard package.json name\n const dashPkgPath = path.join(targetDir, 'dashboard', 'package.json');\n if (await fs.pathExists(dashPkgPath)) {\n const dashPkg = await fs.readJson(dashPkgPath);\n dashPkg.name = `${projectName}-dashboard`;\n await fs.writeJson(dashPkgPath, dashPkg, { spaces: 2 });\n }\n\n console.log(` ✅ Project scaffolded at ./${projectName}`);\n\n // Install root dependencies\n console.log(`\\n📦 Installing dependencies...\\n`);\n try {\n execSync('pnpm install', {\n cwd: targetDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Dependencies installed`);\n } catch {\n console.warn(\n `\\n ⚠️ Could not install dependencies. Run \"cd ${projectName} && pnpm install\" manually.`\n );\n }\n\n // Install dashboard dependencies\n const dashDir = path.join(targetDir, 'dashboard');\n if (await fs.pathExists(dashDir)) {\n console.log(`\\n📦 Installing dashboard dependencies...\\n`);\n try {\n execSync('pnpm install', {\n cwd: dashDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Dashboard dependencies installed`);\n } catch {\n console.warn(\n `\\n ⚠️ Could not install dashboard dependencies. Run \"cd ${projectName}/dashboard && pnpm install\" manually.`\n );\n }\n }\n\n // Initialize Convex\n console.log(`\\n⚡ Initializing Convex...\\n`);\n try {\n execSync('npx convex dev --once', {\n cwd: targetDir,\n stdio: 'inherit',\n });\n console.log(`\\n ✅ Convex initialized`);\n } catch {\n console.warn(\n `\\n ⚠️ Convex initialization skipped. Run \"npx convex dev\" to set up your backend.`\n );\n }\n\n console.log(`\n🎉 AgentForge project \"${projectName}\" created successfully!\n\nNext steps:\n cd ${projectName}\n\n # Start the Convex backend\n npx convex dev\n\n # In another terminal, launch the dashboard\n agentforge dashboard\n\n # Or chat with your agent from the CLI\n agentforge chat\n\n # Check system status\n agentforge status\n\nDocumentation: https://github.com/Agentic-Engineering-Agency/agentforge\n`);\n}\n","import { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'fs-extra';\n\n/**\n * Options for the run command.\n */\nexport interface RunOptions {\n /** The port for the dev server. */\n port: string;\n}\n\n/**\n * Starts the local development environment for an AgentForge project.\n *\n * This command starts the Convex development server and watches for file changes.\n *\n * @param options - Options for the run command.\n */\nexport async function runProject(options: RunOptions): Promise<void> {\n const projectDir = process.cwd();\n\n // Verify we're in an AgentForge project\n const pkgPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(pkgPath))) {\n console.error(\n 'Error: No package.json found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n const convexDir = path.join(projectDir, 'convex');\n if (!(await fs.pathExists(convexDir))) {\n console.error(\n 'Error: No convex/ directory found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n console.log(`\\n🚀 Starting AgentForge development server...\\n`);\n console.log(` Convex dev server starting on port ${options.port}...`);\n\n // Start the Convex dev server\n const convexProcess = spawn('npx', ['convex', 'dev'], {\n cwd: projectDir,\n stdio: 'inherit',\n shell: true,\n });\n\n convexProcess.on('error', (err) => {\n console.error(`Failed to start Convex dev server: ${err.message}`);\n process.exit(1);\n });\n\n convexProcess.on('close', (code) => {\n if (code !== 0) {\n console.error(`Convex dev server exited with code ${code}`);\n }\n });\n\n // Handle graceful shutdown\n const shutdown = () => {\n console.log('\\n\\n👋 Shutting down AgentForge dev server...');\n convexProcess.kill('SIGTERM');\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport prompts from 'prompts';\nimport { CloudClient, CloudClientError, type AgentConfig } from '../lib/cloud-client.js';\nimport { readCredentials, getCloudUrl } from '../lib/credentials.js';\n\n/**\n * Options for the deploy command.\n */\nexport interface DeployOptions {\n /** Path to the environment file. */\n env: string;\n /** Preview deployment without executing. */\n dryRun: boolean;\n /** Rollback to previous deployment. */\n rollback: boolean;\n /** Skip confirmation prompts. */\n force: boolean;\n /** Deployment provider: convex (default) or cloud. */\n provider: 'convex' | 'cloud';\n /** Project ID for cloud deployments. */\n project?: string;\n /** Version tag for the deployment. */\n version?: string;\n}\n\n/**\n * Configuration file format for agentforge.config.ts or agentforge.json\n */\nexport interface AgentForgeConfig {\n projectId?: string;\n agents?: AgentConfig[];\n cloudUrl?: string;\n}\n\n/**\n * Parses a .env file and returns key-value pairs.\n *\n * @param filePath - Absolute path to the .env file.\n * @returns A record of environment variable key-value pairs.\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const content = fs.readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Remove surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) {\n vars[key] = value;\n }\n }\n\n return vars;\n}\n\n/**\n * Read agentforge configuration from agentforge.config.ts or agentforge.json\n */\nexport async function readAgentForgeConfig(projectDir: string): Promise<AgentForgeConfig | null> {\n // Try agentforge.config.ts first\n const tsConfigPath = path.join(projectDir, 'agentforge.config.ts');\n if (await fs.pathExists(tsConfigPath)) {\n try {\n // For now, we'll read it as a simple module that exports default\n // In production, this might need a dynamic import or esbuild\n const content = await fs.readFile(tsConfigPath, 'utf-8');\n return parseConfigFromContent(content, projectDir);\n } catch {\n // Fall through to JSON\n }\n }\n\n // Try agentforge.json\n const jsonConfigPath = path.join(projectDir, 'agentforge.json');\n if (await fs.pathExists(jsonConfigPath)) {\n try {\n const content = await fs.readFile(jsonConfigPath, 'utf-8');\n return JSON.parse(content) as AgentForgeConfig;\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Parse config from TypeScript file content\n * This is a simplified parser - in production you might use ts-node or esbuild\n */\nfunction parseConfigFromContent(content: string, projectDir: string): AgentForgeConfig | null {\n const config: AgentForgeConfig = {};\n\n // Extract projectId\n const projectIdMatch = content.match(/projectId\\s*:\\s*[\"']([^\"']+)[\"']/);\n if (projectIdMatch) {\n config.projectId = projectIdMatch[1];\n }\n\n // Try to read agents from the convex/agents.ts file if present\n const agentsPath = path.join(projectDir, 'convex', 'agents.ts');\n if (fs.existsSync(agentsPath)) {\n try {\n const agentsContent = fs.readFileSync(agentsPath, 'utf-8');\n config.agents = parseAgentsFromConvex(agentsContent);\n } catch {\n // Ignore\n }\n }\n\n // Extract cloudUrl\n const cloudUrlMatch = content.match(/cloudUrl\\s*:\\s*[\"']([^\"']+)[\"']/);\n if (cloudUrlMatch) {\n config.cloudUrl = cloudUrlMatch[1];\n }\n\n return Object.keys(config).length > 0 ? config : null;\n}\n\n/**\n * Parse agent definitions from convex/agents.ts\n * This is a simplified parser for common patterns\n */\nfunction parseAgentsFromConvex(content: string): AgentConfig[] {\n const agents: AgentConfig[] = [];\n\n // Look for agent objects in the content\n // Pattern: { id: \"...\", name: \"...\", instructions: \"...\", model: \"...\" }\n const agentPattern = /\\{\\s*id:\\s*[\"']([^\"']+)[\"']\\s*,\\s*name:\\s*[\"']([^\"']+)[\"']([\\s\\S]*?)\\}/g;\n \n let match;\n while ((match = agentPattern.exec(content)) !== null) {\n const id = match[1];\n const name = match[2];\n const rest = match[3];\n\n const agent: AgentConfig = { id, name, instructions: '', model: 'gpt-4o-mini' };\n\n const instructionsMatch = rest.match(/instructions:\\s*[\"']([^\"']+)[\"']/);\n if (instructionsMatch) agent.instructions = instructionsMatch[1];\n\n const modelMatch = rest.match(/model:\\s*[\"']([^\"']+)[\"']/);\n if (modelMatch) agent.model = modelMatch[1];\n\n const providerMatch = rest.match(/provider:\\s*[\"']([^\"']+)[\"']/);\n if (providerMatch) agent.provider = providerMatch[1];\n\n const descriptionMatch = rest.match(/description:\\s*[\"']([^\"']+)[\"']/);\n if (descriptionMatch) agent.description = descriptionMatch[1];\n\n agents.push(agent);\n }\n\n return agents;\n}\n\n/**\n * Deploy to AgentForge Cloud\n */\nasync function deployToCloud(\n options: DeployOptions,\n projectDir: string\n): Promise<void> {\n console.log('\\n☁️ Deploying to AgentForge Cloud...\\n');\n\n // 1. Read credentials\n const credentials = await readCredentials();\n if (!credentials?.apiKey) {\n console.error(chalk.red('✖'), 'Not authenticated with AgentForge Cloud.');\n console.error(' Run \"agentforge login\" to authenticate.\\n');\n process.exit(1);\n }\n\n // 2. Read local configuration\n const spinner = ora('Reading agent configuration...').start();\n const config = await readAgentForgeConfig(projectDir);\n\n // 3. Resolve project ID\n let projectId = options.project || config?.projectId;\n \n if (!projectId) {\n spinner.stop();\n console.error(chalk.red('✖'), 'No project ID specified.');\n console.error(' Use --project flag or set projectId in agentforge.config.ts\\n');\n process.exit(1);\n }\n\n // 4. Extract agents from config\n let agents = config?.agents || [];\n \n if (agents.length === 0) {\n spinner.stop();\n console.error(chalk.red('✖'), 'No agents found in configuration.');\n console.error(' Define agents in agentforge.config.ts or convex/agents.ts\\n');\n process.exit(1);\n }\n\n spinner.succeed(`Found ${agents.length} agent(s) to deploy`);\n\n // 5. Handle dry-run mode\n if (options.dryRun) {\n console.log('\\n' + chalk.blue('ℹ'), 'Dry run - no changes will be made\\n');\n console.log(' Project ID:', chalk.cyan(projectId));\n console.log(' Cloud URL:', chalk.cyan(credentials.cloudUrl || 'https://cloud.agentforge.ai'));\n console.log(' Agents:');\n for (const agent of agents) {\n console.log(` • ${chalk.bold(agent.name)} (${agent.model})`);\n }\n console.log();\n return;\n }\n\n // 6. Create Cloud client\n const cloudSpinner = ora('Connecting to AgentForge Cloud...').start();\n const client = new CloudClient(\n credentials.cloudUrl || process.env.AGENTFORGE_CLOUD_URL,\n credentials.apiKey\n );\n\n // Verify authentication\n try {\n await client.authenticate();\n cloudSpinner.succeed('Connected to AgentForge Cloud');\n } catch (err: any) {\n cloudSpinner.fail('Failed to connect to AgentForge Cloud');\n if (err instanceof CloudClientError) {\n console.error(chalk.red('✖'), err.message);\n } else {\n console.error(chalk.red('✖'), err.message || err);\n }\n process.exit(1);\n }\n\n // 7. Verify project exists\n const projectSpinner = ora('Verifying project...').start();\n try {\n await client.getProject(projectId);\n projectSpinner.succeed(`Project verified: ${chalk.cyan(projectId)}`);\n } catch (err: any) {\n projectSpinner.fail('Project verification failed');\n if (err.status === 404) {\n console.error(chalk.red('✖'), `Project \"${projectId}\" not found.`);\n console.error(' Check the project ID or create the project in the dashboard.\\n');\n } else {\n console.error(chalk.red('✖'), err.message || err);\n }\n process.exit(1);\n }\n\n // 8. Create deployment\n const version = options.version || `v${Date.now()}`;\n const deploySpinner = ora('Creating deployment...').start();\n\n let deploymentId: string;\n try {\n const response = await client.createDeployment({\n projectId,\n agents,\n version,\n });\n deploymentId = response.deploymentId;\n deploySpinner.succeed(`Deployment created: ${chalk.cyan(deploymentId)}`);\n } catch (err: any) {\n deploySpinner.fail('Failed to create deployment');\n if (err instanceof CloudClientError) {\n console.error(chalk.red('✖'), err.message);\n } else {\n console.error(chalk.red('✖'), err.message || err);\n }\n process.exit(1);\n }\n\n // 9. Poll deployment status\n console.log('\\n📦 Deploying agents...\\n');\n const pollSpinner = ora('Waiting for deployment to complete...').start();\n\n const maxAttempts = 60; // 3 minutes max (3s * 60)\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n let status;\n try {\n status = await client.getDeploymentStatus(deploymentId);\n attempts++;\n } catch (err: any) {\n // Continue polling on network errors, but track failures\n attempts++;\n if (attempts >= maxAttempts) {\n pollSpinner.fail('Deployment status check timed out');\n console.error();\n console.error(chalk.yellow('⚠'), 'The deployment may still be in progress.');\n console.error(` Check status at: https://cloud.agentforge.ai/projects/${projectId}/deployments/${deploymentId}`);\n console.error();\n process.exit(1);\n }\n await new Promise((resolve) => setTimeout(resolve, 3000));\n continue;\n }\n\n if (status.status === 'completed') {\n pollSpinner.succeed('Deployment completed successfully!');\n console.log();\n console.log(chalk.green('✔'), `Deployed to ${chalk.bold(`https://cloud.agentforge.ai/projects/${projectId}`)}`);\n if (status.url) {\n console.log(chalk.green('✔'), `Deployment URL: ${chalk.cyan(status.url)}`);\n }\n console.log();\n return;\n } else if (status.status === 'failed') {\n pollSpinner.fail('Deployment failed');\n console.error();\n console.error(chalk.red('✖'), 'Error:', status.errorMessage || 'Unknown error');\n console.error();\n process.exit(1);\n } else if (status.progress !== undefined) {\n pollSpinner.text = `Deploying... ${status.progress}%`;\n } else {\n const statuses: Record<string, string> = {\n pending: 'Waiting to start...',\n building: 'Building...',\n deploying: 'Deploying...',\n };\n pollSpinner.text = statuses[status.status] || `Status: ${status.status}`;\n }\n\n // Wait 3 seconds before polling again\n await new Promise((resolve) => setTimeout(resolve, 3000));\n }\n\n pollSpinner.fail('Deployment timed out');\n process.exit(1);\n}\n\n/**\n * Deploy to Convex (original behavior)\n */\nasync function deployToConvex(options: DeployOptions): Promise<void> {\n const projectDir = process.cwd();\n\n // Validate project structure\n const pkgPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(pkgPath))) {\n console.error(\n 'Error: No package.json found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n const convexDir = path.join(projectDir, 'convex');\n if (!(await fs.pathExists(convexDir))) {\n console.error(\n 'Error: No convex/ directory found. Are you in an AgentForge project directory?'\n );\n process.exit(1);\n }\n\n // Handle rollback mode\n if (options.rollback) {\n console.log('\\n🔄 Rolling back to previous Convex deployment...\\n');\n try {\n execSync('npx convex deploy --rollback', {\n cwd: projectDir,\n stdio: 'inherit',\n });\n console.log('\\n ✅ Rollback completed successfully.');\n } catch {\n console.error('\\n ❌ Rollback failed.');\n process.exit(1);\n }\n return;\n }\n\n // Resolve and validate env file\n const envPath = path.resolve(projectDir, options.env);\n const envExists = await fs.pathExists(envPath);\n\n // Parse env vars if file exists\n let envVars: Record<string, string> = {};\n if (envExists) {\n envVars = parseEnvFile(envPath);\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log('\\n🔍 Dry run — previewing deployment plan:\\n');\n console.log(` Project directory: ${projectDir}`);\n console.log(` Convex directory: ${convexDir}`);\n console.log(` Environment file: ${envExists ? envPath : '(not found, skipping env vars)'}`);\n\n if (Object.keys(envVars).length > 0) {\n console.log(`\\n Environment variables to set (${Object.keys(envVars).length}):`);\n for (const key of Object.keys(envVars)) {\n console.log(` • ${key}=${envVars[key].slice(0, 4)}${'*'.repeat(Math.max(0, envVars[key].length - 4))}`);\n }\n } else {\n console.log('\\n No environment variables to set.');\n }\n\n console.log('\\n ℹ️ No changes were made (dry run).\\n');\n return;\n }\n\n // Require env file for actual deployment\n if (!envExists) {\n console.error(\n `Error: Environment file \"${options.env}\" not found. Create it or use --env to specify a different path.`\n );\n process.exit(1);\n }\n\n // Confirmation prompt (unless --force)\n if (!options.force) {\n console.log('\\n🚀 Deployment plan:\\n');\n console.log(` Project: ${projectDir}`);\n console.log(` Env file: ${envPath}`);\n console.log(` Env vars: ${Object.keys(envVars).length} variable(s)`);\n console.log('\\n Use --force to skip this confirmation.\\n');\n\n // In a real CLI, we'd use prompts here. For now, auto-proceed.\n // The --force flag is the recommended path for CI/CD.\n }\n\n console.log('\\n📦 Deploying AgentForge project to production...\\n');\n\n // Step 1: Push environment variables\n if (Object.keys(envVars).length > 0) {\n console.log(' Setting environment variables...');\n for (const [key, value] of Object.entries(envVars)) {\n try {\n execSync(`npx convex env set ${key} \"${value}\"`, {\n cwd: projectDir,\n stdio: 'pipe',\n });\n console.log(` ✅ ${key}`);\n } catch {\n console.error(` ❌ Failed to set ${key}`);\n }\n }\n console.log('');\n }\n\n // Step 2: Deploy\n console.log(' Deploying Convex backend...');\n try {\n execSync('npx convex deploy', {\n cwd: projectDir,\n stdio: 'inherit',\n });\n console.log('\\n ✅ Deployment completed successfully!');\n console.log(' Use \"agentforge deploy --rollback\" to revert if needed.\\n');\n } catch {\n console.error('\\n ❌ Deployment failed.');\n console.error(' Check the Convex dashboard for details.');\n process.exit(1);\n }\n}\n\n/**\n * Deploys an AgentForge project to production.\n *\n * Handles environment variable configuration, provides deployment status\n * feedback, and supports rollback capabilities.\n *\n * @param options - Options for the deploy command.\n */\nexport async function deployProject(options: DeployOptions): Promise<void> {\n const projectDir = process.cwd();\n\n // Route to appropriate provider\n if (options.provider === 'cloud') {\n await deployToCloud(options, projectDir);\n } else {\n await deployToConvex(options);\n }\n}\n","import fs from 'fs-extra';\nimport path from 'node:path';\nimport os from 'node:os';\n\n/**\n * AgentForge Cloud credentials storage\n * Stored in ~/.agentforge/credentials.json\n */\n\nexport interface Credentials {\n /** API key for AgentForge Cloud */\n apiKey: string;\n /** Cloud URL (defaults to https://cloud.agentforge.ai) */\n cloudUrl: string;\n /** User email or identifier */\n userEmail?: string;\n /** User display name */\n userName?: string;\n /** Token expiration timestamp */\n expiresAt?: number;\n /** Last refreshed timestamp */\n refreshedAt?: number;\n}\n\nconst CREDENTIALS_DIR = path.join(os.homedir(), '.agentforge');\nconst CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, 'credentials.json');\nconst DEFAULT_CLOUD_URL = 'https://cloud.agentforge.ai';\n\n/**\n * Ensure the credentials directory exists\n */\nasync function ensureCredentialsDir(): Promise<void> {\n await fs.ensureDir(CREDENTIALS_DIR);\n // Set restrictive permissions (owner read/write only)\n try {\n await fs.chmod(CREDENTIALS_DIR, 0o700);\n } catch {\n // Ignore permission errors on Windows\n }\n}\n\n/**\n * Read credentials from the secure storage\n */\nexport async function readCredentials(): Promise<Credentials | null> {\n try {\n if (!(await fs.pathExists(CREDENTIALS_FILE))) {\n return null;\n }\n const content = await fs.readFile(CREDENTIALS_FILE, 'utf-8');\n const creds = JSON.parse(content) as Credentials;\n // Ensure cloudUrl has a default\n if (!creds.cloudUrl) {\n creds.cloudUrl = DEFAULT_CLOUD_URL;\n }\n return creds;\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Write credentials to secure storage\n */\nexport async function writeCredentials(credentials: Credentials): Promise<void> {\n await ensureCredentialsDir();\n const data: Credentials = {\n ...credentials,\n cloudUrl: credentials.cloudUrl || DEFAULT_CLOUD_URL,\n refreshedAt: Date.now(),\n };\n await fs.writeFile(CREDENTIALS_FILE, JSON.stringify(data, null, 2), 'utf-8');\n // Set restrictive permissions (owner read/write only)\n try {\n await fs.chmod(CREDENTIALS_FILE, 0o600);\n } catch {\n // Ignore permission errors on Windows\n }\n}\n\n/**\n * Delete credentials (logout)\n */\nexport async function deleteCredentials(): Promise<boolean> {\n try {\n if (await fs.pathExists(CREDENTIALS_FILE)) {\n await fs.remove(CREDENTIALS_FILE);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if user is authenticated\n */\nexport async function isAuthenticated(): Promise<boolean> {\n const creds = await readCredentials();\n return creds !== null && creds.apiKey !== undefined;\n}\n\n/**\n * Get the cloud URL (from credentials or default)\n */\nexport async function getCloudUrl(): Promise<string> {\n const creds = await readCredentials();\n return creds?.cloudUrl || process.env.AGENTFORGE_CLOUD_URL || DEFAULT_CLOUD_URL;\n}\n\n/**\n * Get API key (returns null if not authenticated)\n */\nexport async function getApiKey(): Promise<string | null> {\n const creds = await readCredentials();\n return creds?.apiKey || null;\n}\n\n/**\n * Get the credentials file path\n */\nexport function getCredentialsPath(): string {\n return CREDENTIALS_FILE;\n}\n\n/**\n * Check if credentials are expired\n */\nexport function isExpired(credentials: Credentials): boolean {\n if (!credentials.expiresAt) return false;\n return Date.now() >= credentials.expiresAt;\n}\n\n/**\n * Update credentials with new data\n */\nexport async function updateCredentials(updates: Partial<Credentials>): Promise<Credentials | null> {\n const current = await readCredentials();\n if (!current) return null;\n const updated = { ...current, ...updates, refreshedAt: Date.now() };\n await writeCredentials(updated);\n return updated;\n}\n","import type { Credentials } from './credentials.js';\nimport { getCloudUrl, getApiKey, readCredentials } from './credentials.js';\n\n/**\n * AgentForge Cloud API Client\n * \n * Handles all HTTP communication with the AgentForge Cloud API.\n * Supports both REST API endpoints and Convex HTTP actions.\n */\n\nexport interface Project {\n id: string;\n name: string;\n description?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface AgentConfig {\n id?: string;\n name: string;\n description?: string;\n instructions: string;\n model: string;\n provider?: string;\n tools?: any;\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n config?: Record<string, any>;\n}\n\nexport interface Deployment {\n id: string;\n projectId: string;\n status: 'pending' | 'building' | 'deploying' | 'completed' | 'failed' | 'rolled_back';\n version: string;\n agents: AgentConfig[];\n url?: string;\n createdAt: number;\n updatedAt: number;\n errorMessage?: string;\n}\n\nexport interface CreateDeploymentRequest {\n projectId: string;\n agents: AgentConfig[];\n version: string;\n}\n\nexport interface CreateDeploymentResponse {\n deploymentId: string;\n status: string;\n url?: string;\n}\n\nexport interface DeploymentStatusResponse {\n id: string;\n status: string;\n url?: string;\n errorMessage?: string;\n progress?: number;\n}\n\nexport interface UserInfo {\n id: string;\n email: string;\n name?: string;\n}\n\nexport interface CloudApiError {\n message: string;\n code?: string;\n status?: number;\n}\n\n/**\n * Cloud API Error class for typed error handling\n */\nexport class CloudClientError extends Error {\n constructor(\n message: string,\n public code?: string,\n public status?: number\n ) {\n super(message);\n this.name = 'CloudClientError';\n }\n}\n\n/**\n * AgentForge Cloud API Client\n */\nexport class CloudClient {\n private baseUrl: string;\n private apiKey: string | null = null;\n\n constructor(baseUrl?: string, apiKey?: string) {\n this.baseUrl = baseUrl || 'https://cloud.agentforge.ai';\n this.apiKey = apiKey || null;\n }\n\n /**\n * Initialize the client with stored credentials\n */\n async initialize(): Promise<void> {\n this.baseUrl = await getCloudUrl();\n this.apiKey = await getApiKey();\n }\n\n /**\n * Set the API key directly\n */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n }\n\n /**\n * Set the base URL directly\n */\n setBaseUrl(baseUrl: string): void {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Get the full API URL for an endpoint\n */\n private getUrl(endpoint: string): string {\n const base = this.baseUrl.replace(/\\/$/, '');\n const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${base}${path}`;\n }\n\n /**\n * Get request headers with authentication\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Client-Version': '0.5.1',\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n return headers;\n }\n\n /**\n * Make an HTTP request to the Cloud API\n */\n private async request<T>(\n method: string,\n endpoint: string,\n body?: unknown\n ): Promise<T> {\n const url = this.getUrl(endpoint);\n const options: RequestInit = {\n method,\n headers: this.getHeaders(),\n };\n\n if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n options.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, options);\n } catch (error: any) {\n throw new CloudClientError(\n `Network error: ${error.message || 'Failed to connect to AgentForge Cloud'}`,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle non-JSON responses\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n const errorBody = isJson ? await response.json() : null;\n const message = errorBody?.message || errorBody?.error || `HTTP ${response.status}: ${response.statusText}`;\n throw new CloudClientError(\n message,\n errorBody?.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!isJson) {\n const text = await response.text();\n return { text } as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Check if credentials are valid\n */\n async authenticate(): Promise<UserInfo> {\n if (!this.apiKey) {\n throw new CloudClientError(\n 'No API key configured. Run \"agentforge login\" to authenticate.',\n 'NO_CREDENTIALS',\n 401\n );\n }\n\n try {\n const user = await this.request<UserInfo>('GET', '/api/auth/me');\n return user;\n } catch (error: any) {\n if (error.status === 401) {\n throw new CloudClientError(\n 'Invalid API key. Run \"agentforge login\" to re-authenticate.',\n 'UNAUTHORIZED',\n 401\n );\n }\n throw error;\n }\n }\n\n /**\n * List all projects for the authenticated user\n */\n async listProjects(): Promise<Project[]> {\n return this.request<Project[]>('GET', '/api/projects');\n }\n\n /**\n * Get a specific project by ID\n */\n async getProject(projectId: string): Promise<Project> {\n return this.request<Project>('GET', `/api/projects/${projectId}`);\n }\n\n /**\n * Upload agent configuration to Cloud\n */\n async uploadAgentConfig(\n projectId: string,\n agentConfig: AgentConfig\n ): Promise<{ agentId: string }> {\n return this.request<{ agentId: string }>(\n 'POST',\n `/api/projects/${projectId}/agents`,\n agentConfig\n );\n }\n\n /**\n * Create a new deployment\n */\n async createDeployment(\n request: CreateDeploymentRequest\n ): Promise<CreateDeploymentResponse> {\n return this.request<CreateDeploymentResponse>(\n 'POST',\n '/api/deployments/create',\n request\n );\n }\n\n /**\n * Get deployment status\n */\n async getDeploymentStatus(\n deploymentId: string\n ): Promise<DeploymentStatusResponse> {\n return this.request<DeploymentStatusResponse>(\n 'GET',\n `/api/deployments/${deploymentId}/status`\n );\n }\n\n /**\n * Get deployment details\n */\n async getDeployment(deploymentId: string): Promise<Deployment> {\n return this.request<Deployment>('GET', `/api/deployments/${deploymentId}`);\n }\n\n /**\n * Rollback a deployment\n */\n async rollbackDeployment(deploymentId: string): Promise<{ success: boolean }> {\n return this.request<{ success: boolean }>(\n 'POST',\n `/api/deployments/${deploymentId}/rollback`\n );\n }\n\n /**\n * List deployments for a project\n */\n async listDeployments(projectId: string): Promise<Deployment[]> {\n return this.request<Deployment[]>('GET', `/api/projects/${projectId}/deployments`);\n }\n}\n\n/**\n * Create a CloudClient with credentials from storage\n */\nexport async function createCloudClient(): Promise<CloudClient> {\n const client = new CloudClient();\n await client.initialize();\n return client;\n}\n","import fs from 'fs-extra';\nimport path from 'node:path';\n\n/**\n * Safely get the current working directory.\n * Returns null if the CWD has been deleted or is inaccessible.\n */\nfunction safeCwd(): string | null {\n try {\n return process.cwd();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the Convex deployment URL from the project's .env files.\n * Called lazily — only when a command actually needs Convex.\n */\nfunction getConvexUrl(): string {\n const cwd = safeCwd();\n if (!cwd) {\n throw new Error(\n 'Current directory does not exist or is not accessible.\\n' +\n 'Please navigate to a valid AgentForge project directory and try again.'\n );\n }\n const envFiles = ['.env.local', '.env', '.env.production'];\n\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(/CONVEX_URL\\s*=\\s*(.+)/);\n if (match) {\n return match[1].trim().replace(/[\"']/g, '');\n }\n }\n }\n\n // Also check .convex/deployment.json\n const convexEnv = path.join(cwd, '.convex', 'deployment.json');\n if (fs.existsSync(convexEnv)) {\n try {\n const data = JSON.parse(fs.readFileSync(convexEnv, 'utf-8'));\n if (data.url) return data.url;\n } catch {\n // ignore\n }\n }\n\n throw new Error(\n 'CONVEX_URL not found. Run `npx convex dev` first, or set CONVEX_URL in your .env file.'\n );\n}\n\n/**\n * Create a Convex HTTP client connected to the project's deployment.\n * The ConvexHttpClient import is deferred to avoid triggering\n * process.cwd() at module load time (which crashes if CWD is gone).\n */\nexport async function createClient(): Promise<import('convex/browser').ConvexHttpClient> {\n const { ConvexHttpClient } = await import('convex/browser');\n const url = getConvexUrl();\n return new ConvexHttpClient(url);\n}\n\n/**\n * Safely call a Convex query/mutation and handle errors gracefully.\n */\nexport async function safeCall<T>(\n fn: () => Promise<T>,\n errorMessage: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error: any) {\n if (error.message?.includes('CONVEX_URL not found')) {\n console.error('\\n❌ Not connected to Convex.');\n console.error(' Run `npx convex dev` in your project directory first.\\n');\n } else if (error.message?.includes('Current directory does not exist')) {\n console.error(`\\n❌ ${error.message}\\n`);\n } else if (error.message?.includes('fetch failed') || error.message?.includes('ECONNREFUSED')) {\n console.error('\\n❌ Cannot reach Convex deployment.');\n console.error(' Make sure `npx convex dev` is running.\\n');\n } else {\n console.error(`\\n❌ ${errorMessage}`);\n console.error(` ${error.message}\\n`);\n }\n process.exit(1);\n }\n}\n","/**\n * CLI Display Helpers — Consistent formatting for all commands\n */\n\nexport const colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nexport function success(msg: string) {\n console.log(`${colors.green}✔${colors.reset} ${msg}`);\n}\n\nexport function error(msg: string) {\n console.error(`${colors.red}✖${colors.reset} ${msg}`);\n}\n\nexport function warn(msg: string) {\n console.log(`${colors.yellow}⚠${colors.reset} ${msg}`);\n}\n\nexport function info(msg: string) {\n console.log(`${colors.blue}ℹ${colors.reset} ${msg}`);\n}\n\nexport function header(title: string) {\n console.log(`\\n${colors.bold}${colors.cyan}${title}${colors.reset}\\n`);\n}\n\nexport function dim(msg: string) {\n console.log(`${colors.dim}${msg}${colors.reset}`);\n}\n\n/**\n * Print a table from an array of objects\n */\nexport function table(data: Record<string, any>[], columns?: string[]) {\n if (data.length === 0) {\n dim(' (no items)');\n return;\n }\n\n const cols = columns ?? Object.keys(data[0]);\n const widths: Record<string, number> = {};\n\n for (const col of cols) {\n widths[col] = Math.max(\n col.length,\n ...data.map((row) => String(row[col] ?? '').length)\n );\n }\n\n // Header\n const headerRow = cols.map((c) => c.toUpperCase().padEnd(widths[c])).join(' ');\n console.log(` ${colors.bold}${headerRow}${colors.reset}`);\n console.log(` ${cols.map((c) => '─'.repeat(widths[c])).join('──')}`);\n\n // Rows\n for (const row of data) {\n const line = cols.map((c) => String(row[c] ?? '').padEnd(widths[c])).join(' ');\n console.log(` ${line}`);\n }\n console.log();\n}\n\n/**\n * Print key-value details\n */\nexport function details(data: Record<string, any>) {\n const maxKey = Math.max(...Object.keys(data).map((k) => k.length));\n for (const [key, value] of Object.entries(data)) {\n const label = `${colors.dim}${key.padEnd(maxKey)}${colors.reset}`;\n console.log(` ${label} ${value}`);\n }\n console.log();\n}\n\n/**\n * Format a timestamp to a readable date string\n */\nexport function formatDate(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\n/**\n * Truncate a string to a max length\n */\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + '…';\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => rl.question(question, (ans) => { rl.close(); resolve(ans.trim()); }));\n}\n\nexport function registerAgentsCommand(program: Command) {\n const agents = program.command('agents').description('Manage agents');\n\n agents\n .command('list')\n .description('List all agents')\n .option('--active', 'Show only active agents')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('agents:list' as any, {}),\n 'Failed to list agents'\n );\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n header('Agents');\n if (!result || (result as any[]).length === 0) {\n info('No agents found. Create one with: agentforge agents create');\n return;\n }\n const filtered = opts.active ? (result as any[]).filter((a: any) => a.isActive) : result;\n table(\n (filtered as any[]).map((a: any) => ({\n ID: a.id,\n Name: a.name,\n Model: a.model,\n Provider: a.provider || 'openai',\n Active: a.isActive ? '✔' : '✖',\n Created: formatDate(a.createdAt),\n }))\n );\n });\n\n agents\n .command('create')\n .description('Create a new agent (interactive)')\n .option('--name <name>', 'Agent name')\n .option('--model <model>', 'Model identifier (e.g., openai:gpt-4o-mini)')\n .option('--instructions <text>', 'System instructions')\n .action(async (opts) => {\n const name = opts.name || await prompt('Agent name: ');\n const model = opts.model || await prompt('Model (e.g., openai:gpt-4o-mini): ');\n const instructions = opts.instructions || await prompt('Instructions: ');\n\n if (!name || !model || !instructions) {\n error('Name, model, and instructions are required.');\n process.exit(1);\n }\n\n const provider = model.includes(':') ? model.split(':')[0] : 'openai';\n const agentId = name.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('agents:create' as any, {\n id: agentId,\n name,\n instructions,\n model,\n provider,\n isActive: true,\n }),\n 'Failed to create agent'\n );\n success(`Agent \"${name}\" created with ID: ${agentId}`);\n });\n\n agents\n .command('inspect')\n .argument('<id>', 'Agent ID')\n .description('Show detailed agent information')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) {\n error(`Agent \"${id}\" not found.`);\n process.exit(1);\n }\n header(`Agent: ${(agent as any).name}`);\n const a = agent as any;\n details({\n 'ID': a.id,\n 'Name': a.name,\n 'Model': a.model,\n 'Provider': a.provider || 'openai',\n 'Active': a.isActive ? 'Yes' : 'No',\n 'Temperature': a.temperature ?? 'default',\n 'Max Tokens': a.maxTokens ?? 'default',\n 'Created': formatDate(a.createdAt),\n 'Updated': formatDate(a.updatedAt),\n });\n if (a.description) info(`Description: ${a.description}`);\n console.log(` Instructions:\\n ${a.instructions.split('\\n').join('\\n ')}\\n`);\n });\n\n agents\n .command('edit')\n .argument('<id>', 'Agent ID')\n .option('--name <name>', 'New name')\n .option('--model <model>', 'New model')\n .option('--instructions <text>', 'New instructions')\n .description('Edit an agent')\n .action(async (id, opts) => {\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n\n const updates: Record<string, any> = {};\n if (opts.name) updates.name = opts.name;\n if (opts.model) {\n updates.model = opts.model;\n updates.provider = opts.model.includes(':') ? opts.model.split(':')[0] : 'openai';\n }\n if (opts.instructions) updates.instructions = opts.instructions;\n\n if (Object.keys(updates).length === 0) {\n const a = agent as any;\n const name = await prompt(`Name [${a.name}]: `);\n const model = await prompt(`Model [${a.model}]: `);\n const instr = await prompt(`Instructions [keep current]: `);\n if (name) updates.name = name;\n if (model) { updates.model = model; updates.provider = model.includes(':') ? model.split(':')[0] : 'openai'; }\n if (instr) updates.instructions = instr;\n }\n\n if (Object.keys(updates).length === 0) { info('No changes made.'); return; }\n\n await safeCall(\n () => client.mutation('agents:update' as any, { _id: (agent as any)._id, ...updates }),\n 'Failed to update agent'\n );\n success(`Agent \"${id}\" updated.`);\n });\n\n agents\n .command('delete')\n .argument('<id>', 'Agent ID')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete an agent')\n .action(async (id, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete agent \"${id}\"? (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n const agent = await safeCall(\n () => client.query('agents:getByAgentId' as any, { id }),\n 'Failed to fetch agent'\n );\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(\n () => client.mutation('agents:remove' as any, { _id: (agent as any)._id }),\n 'Failed to delete agent'\n );\n success(`Agent \"${id}\" deleted.`);\n });\n\n agents\n .command('enable')\n .argument('<id>', 'Agent ID')\n .description('Enable an agent')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('agents:update' as any, { _id: (agent as any)._id, isActive: true }), 'Failed');\n success(`Agent \"${id}\" enabled.`);\n });\n\n agents\n .command('disable')\n .argument('<id>', 'Agent ID')\n .description('Disable an agent')\n .action(async (id) => {\n const client = await createClient();\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${id}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('agents:update' as any, { _id: (agent as any)._id, isActive: false }), 'Failed');\n success(`Agent \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, success, error, info, dim, colors } from '../lib/display.js';\nimport readline from 'node:readline';\n\nexport function registerChatCommand(program: Command) {\n program\n .command('chat')\n .argument('[agent-id]', 'Agent ID to chat with')\n .option('-s, --session <id>', 'Resume an existing session')\n .description('Start an interactive chat session with an agent')\n .action(async (agentId, opts) => {\n const client = await createClient();\n\n if (!agentId && !opts.session) {\n const agents = await safeCall(() => client.query('agents:list' as any, {}), 'Failed to list agents');\n if (!agents || (agents as any[]).length === 0) {\n error('No agents found. Create one first: agentforge agents create');\n process.exit(1);\n }\n header('Available Agents');\n (agents as any[]).forEach((a: any, i: number) => {\n console.log(` ${colors.cyan}${i + 1}.${colors.reset} ${a.name} ${colors.dim}(${a.id})${colors.reset}`);\n });\n console.log();\n const rl2 = readline.createInterface({ input: process.stdin, output: process.stdout });\n const choice = await new Promise<string>((r) => rl2.question('Select agent (number or ID): ', (a) => { rl2.close(); r(a.trim()); }));\n const idx = parseInt(choice) - 1;\n agentId = idx >= 0 && idx < (agents as any[]).length ? (agents as any[])[idx].id : choice;\n }\n\n const agent = await safeCall(() => client.query('agents:getByAgentId' as any, { id: agentId }), 'Failed to fetch agent');\n if (!agent) { error(`Agent \"${agentId}\" not found.`); process.exit(1); }\n\n const a = agent as any;\n header(`Chat with ${a.name}`);\n dim(` Model: ${a.model} | Provider: ${a.provider || 'openai'}`);\n dim(` Type \"exit\" or \"quit\" to end. \"/new\" for new thread. \"/history\" for messages.`);\n console.log();\n\n let threadId = await safeCall(\n () => client.mutation('threads:create' as any, { agentId: a.id, status: 'active' }),\n 'Failed to create thread'\n );\n\n const history: Array<{ role: string; content: string }> = [];\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: `${colors.green}You${colors.reset} > ` });\n rl.prompt();\n\n rl.on('line', async (line) => {\n const input = line.trim();\n if (!input) { rl.prompt(); return; }\n if (input === 'exit' || input === 'quit') { success('Session ended. Goodbye!'); process.exit(0); }\n if (input === '/new') {\n threadId = await safeCall(() => client.mutation('threads:create' as any, { agentId: a.id, status: 'active' }), 'Failed');\n history.length = 0;\n info('New thread started.');\n rl.prompt();\n return;\n }\n if (input === '/history') {\n history.forEach((m) => {\n const prefix = m.role === 'user' ? `${colors.green}You${colors.reset}` : `${colors.cyan}${a.name}${colors.reset}`;\n console.log(` ${prefix}: ${m.content}`);\n });\n if (history.length === 0) dim(' (no messages yet)');\n console.log();\n rl.prompt();\n return;\n }\n\n history.push({ role: 'user', content: input });\n await safeCall(() => client.mutation('messages:send' as any, { threadId, role: 'user', content: input }), 'Failed to send');\n\n process.stdout.write(`${colors.cyan}${a.name}${colors.reset} > `);\n try {\n const response = await safeCall(\n () => client.action('mastraIntegration:generateResponse' as any, { agentId: a.id, threadId, message: input }),\n 'Failed to get response'\n );\n const text = (response as any)?.text || (response as any)?.content || String(response);\n console.log(text);\n history.push({ role: 'assistant', content: text });\n } catch {\n console.log(`${colors.yellow}[Configure your LLM API key in .env to get responses]${colors.reset}`);\n }\n console.log();\n rl.prompt();\n });\n\n rl.on('close', () => { console.log(); info('Session ended.'); process.exit(0); });\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\n\nexport function registerSessionsCommand(program: Command) {\n const sessions = program.command('sessions').description('Manage sessions');\n\n sessions\n .command('list')\n .option('--status <status>', 'Filter by status (active, ended)')\n .option('--json', 'Output as JSON')\n .description('List all sessions')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('sessions:list' as any, {}), 'Failed to list sessions');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Sessions');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No sessions found.'); return; }\n const filtered = opts.status ? items.filter((s: any) => s.status === opts.status) : items;\n table(filtered.map((s: any) => ({\n ID: s._id?.slice(-8) || 'N/A',\n Name: s.name || 'Unnamed',\n Agent: s.agentId,\n Status: s.status,\n Started: formatDate(s.startedAt),\n 'Last Activity': formatDate(s.lastActivityAt),\n })));\n });\n\n sessions\n .command('inspect')\n .argument('<id>', 'Session ID')\n .description('Show session details')\n .action(async (id) => {\n const client = await createClient();\n const session = await safeCall(() => client.query('sessions:getById' as any, { id }), 'Failed to fetch session');\n if (!session) { error(`Session \"${id}\" not found.`); process.exit(1); }\n const s = session as any;\n header(`Session: ${s.name || 'Unnamed'}`);\n details({ ID: s._id, Name: s.name, Agent: s.agentId, Status: s.status, Started: formatDate(s.startedAt), 'Last Activity': formatDate(s.lastActivityAt) });\n });\n\n sessions\n .command('end')\n .argument('<id>', 'Session ID')\n .description('End an active session')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('sessions:update' as any, { _id: id, status: 'ended' }), 'Failed to end session');\n success(`Session \"${id}\" ended.`);\n });\n}\n\nexport function registerThreadsCommand(program: Command) {\n const threads = program.command('threads').description('Manage conversation threads');\n\n threads\n .command('list')\n .option('--agent <id>', 'Filter by agent ID')\n .option('--json', 'Output as JSON')\n .description('List all threads')\n .action(async (opts) => {\n const client = await createClient();\n const args = opts.agent ? { agentId: opts.agent } : {};\n const result = await safeCall(() => client.query('threads:list' as any, args), 'Failed to list threads');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Threads');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No threads found.'); return; }\n table(items.map((t: any) => ({\n ID: t._id?.slice(-8) || 'N/A',\n Name: t.name || 'Unnamed',\n Agent: t.agentId,\n Status: t.status,\n Created: formatDate(t.createdAt),\n })));\n });\n\n threads\n .command('inspect')\n .argument('<id>', 'Thread ID')\n .description('Show thread messages')\n .action(async (id) => {\n const client = await createClient();\n const messages = await safeCall(() => client.query('messages:listByThread' as any, { threadId: id }), 'Failed to fetch messages');\n header(`Thread: ${id}`);\n const items = (messages as any[]) || [];\n if (items.length === 0) { info('No messages in this thread.'); return; }\n items.forEach((m: any) => {\n const role = m.role === 'user' ? '\\x1b[32mUser\\x1b[0m' : m.role === 'assistant' ? '\\x1b[36mAssistant\\x1b[0m' : `\\x1b[33m${m.role}\\x1b[0m`;\n console.log(` ${role}: ${m.content}`);\n });\n console.log();\n });\n\n threads\n .command('delete')\n .argument('<id>', 'Thread ID')\n .description('Delete a thread and its messages')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('threads:remove' as any, { _id: id }), 'Failed to delete thread');\n success(`Thread \"${id}\" deleted.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, dim, colors, formatDate } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerSkillsCommand(program: Command) {\n const skills = program.command('skills').description('Manage agent skills');\n\n skills\n .command('list')\n .option('--installed', 'Show only installed skills')\n .option('--json', 'Output as JSON')\n .description('List all skills')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('skills:list' as any, {}), 'Failed to list skills');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Skills');\n\n // Also check local skills directory\n const localSkills: string[] = [];\n const skillsDir = path.join(process.cwd(), 'skills');\n if (fs.existsSync(skillsDir)) {\n const dirs = fs.readdirSync(skillsDir).filter((d: string) => fs.statSync(path.join(skillsDir, d)).isDirectory());\n localSkills.push(...dirs);\n }\n\n const items = (result as any[]) || [];\n if (items.length === 0 && localSkills.length === 0) {\n info('No skills found. Install one with: agentforge skills install <name>');\n info('Or create one with: agentforge skills create');\n return;\n }\n\n if (localSkills.length > 0) {\n dim(' Local Skills:');\n localSkills.forEach((s) => {\n const configPath = path.join(skillsDir, s, 'config.json');\n let desc = '';\n if (fs.existsSync(configPath)) {\n try { desc = JSON.parse(fs.readFileSync(configPath, 'utf-8')).description || ''; } catch {}\n }\n console.log(` ${colors.cyan}●${colors.reset} ${s} ${colors.dim}${desc}${colors.reset}`);\n });\n console.log();\n }\n\n if (items.length > 0) {\n const filtered = opts.installed ? items.filter((s: any) => s.isInstalled) : items;\n table(filtered.map((s: any) => ({\n Name: s.name,\n Category: s.category,\n Version: s.version,\n Installed: s.isInstalled ? '✔' : '✖',\n Agent: s.agentId || 'all',\n })));\n }\n });\n\n skills\n .command('create')\n .description('Create a new skill (interactive)')\n .option('--name <name>', 'Skill name')\n .option('--description <desc>', 'Skill description')\n .option('--category <cat>', 'Category (utility, web, file, data, integration, ai, custom)')\n .action(async (opts) => {\n const name = opts.name || await prompt('Skill name (kebab-case): ');\n const description = opts.description || await prompt('Description: ');\n const category = opts.category || await prompt('Category (utility/web/file/data/integration/ai/custom): ') || 'custom';\n\n if (!name) { error('Skill name is required.'); process.exit(1); }\n\n const skillDir = path.join(process.cwd(), 'skills', name);\n if (fs.existsSync(skillDir)) { error(`Skill \"${name}\" already exists at ${skillDir}`); process.exit(1); }\n\n fs.mkdirSync(skillDir, { recursive: true });\n\n // config.json\n fs.writeFileSync(path.join(skillDir, 'config.json'), JSON.stringify({\n name, version: '1.0.0', description, category, author: 'User',\n tools: [name], dependencies: [],\n agentInstructions: `You have access to the ${name} skill. ${description}`,\n }, null, 2));\n\n // index.ts\n fs.writeFileSync(path.join(skillDir, 'index.ts'), `import { z } from 'zod';\n\n/**\n * ${name} — AgentForge Skill\n * ${description}\n */\nexport const tools = [\n {\n name: '${name}',\n description: '${description}',\n inputSchema: z.object({\n input: z.string().describe('Input for ${name}'),\n }),\n outputSchema: z.object({\n result: z.string(),\n success: z.boolean(),\n }),\n handler: async (params: { input: string }) => {\n // TODO: Implement your skill logic here\n return { result: \\`Processed: \\${params.input}\\`, success: true };\n },\n },\n];\n\nexport default { tools };\n`);\n\n // SKILL.md\n fs.writeFileSync(path.join(skillDir, 'SKILL.md'), `# ${name}\\n\\n${description}\\n\\n## Usage\\n\\nAsk your agent: \"Use the ${name} tool to [your request]\"\\n\\n## Configuration\\n\\nEdit \\`skills/${name}/config.json\\` to customize.\\n`);\n\n success(`Skill \"${name}\" created at skills/${name}/`);\n info('Files created: index.ts, config.json, SKILL.md');\n info(`Edit skills/${name}/index.ts to implement your tool logic.`);\n });\n\n skills\n .command('install')\n .argument('<name>', 'Skill name to install')\n .description('Install a skill')\n .action(async (name) => {\n const client = await createClient();\n await safeCall(\n () => client.mutation('skills:create' as any, {\n name, category: 'custom', version: '1.0.0', isInstalled: true,\n }),\n 'Failed to install skill'\n );\n success(`Skill \"${name}\" installed.`);\n });\n\n skills\n .command('remove')\n .argument('<name>', 'Skill name to remove')\n .description('Remove a skill')\n .action(async (name) => {\n const skillDir = path.join(process.cwd(), 'skills', name);\n if (fs.existsSync(skillDir)) {\n const confirm = await prompt(`Remove skill \"${name}\" and delete files? (y/N): `);\n if (confirm.toLowerCase() === 'y') {\n fs.removeSync(skillDir);\n success(`Skill \"${name}\" removed from disk.`);\n }\n }\n // Also remove from Convex\n const client = await createClient();\n try {\n const skills = await client.query('skills:list' as any, {});\n const skill = (skills as any[]).find((s: any) => s.name === name);\n if (skill) {\n await client.mutation('skills:remove' as any, { _id: skill._id });\n success(`Skill \"${name}\" removed from database.`);\n }\n } catch { /* ignore if not in db */ }\n });\n\n skills\n .command('search')\n .argument('<query>', 'Search query')\n .description('Search available skills')\n .action(async (query) => {\n header('Skill Search Results');\n // Search built-in examples\n const examples = [\n { name: 'web-search', desc: 'Search the web for information', cat: 'web' },\n { name: 'calculator', desc: 'Evaluate mathematical expressions', cat: 'utility' },\n { name: 'file-reader', desc: 'Read file contents', cat: 'file' },\n { name: 'http-request', desc: 'Make HTTP requests', cat: 'web' },\n { name: 'json-transformer', desc: 'Transform JSON data', cat: 'data' },\n { name: 'text-summarizer', desc: 'Summarize text into key points', cat: 'ai' },\n { name: 'csv-parser', desc: 'Parse CSV into structured JSON', cat: 'data' },\n ];\n const q = query.toLowerCase();\n const matches = examples.filter((e) => e.name.includes(q) || e.desc.toLowerCase().includes(q) || e.cat.includes(q));\n if (matches.length === 0) { info(`No skills matching \"${query}\". Try: agentforge skills create`); return; }\n table(matches.map((e) => ({ Name: e.name, Description: e.desc, Category: e.cat })));\n info('Install with: agentforge skills install <name>');\n info('Or see examples: check skills/skill-creator/SKILL.md');\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerCronCommand(program: Command) {\n const cron = program.command('cron').description('Manage cron jobs');\n\n cron\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all cron jobs')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('cronJobs:list' as any, {}), 'Failed to list cron jobs');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Cron Jobs');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No cron jobs. Create one with: agentforge cron create'); return; }\n table(items.map((c: any) => ({\n ID: c._id?.slice(-8) || 'N/A',\n Name: c.name,\n Schedule: c.schedule,\n Agent: c.agentId,\n Enabled: c.isEnabled ? '✔' : '✖',\n 'Last Run': c.lastRunAt ? formatDate(c.lastRunAt) : 'Never',\n 'Next Run': c.nextRunAt ? formatDate(c.nextRunAt) : 'N/A',\n })));\n });\n\n cron\n .command('create')\n .description('Create a new cron job (interactive)')\n .option('--name <name>', 'Job name')\n .option('--schedule <cron>', 'Cron expression')\n .option('--agent <id>', 'Agent ID')\n .option('--action <action>', 'Action to execute')\n .action(async (opts) => {\n const name = opts.name || await prompt('Job name: ');\n const schedule = opts.schedule || await prompt('Cron schedule (e.g., \"0 */5 * * * *\" for every 5 min): ');\n const agentId = opts.agent || await prompt('Agent ID: ');\n const action = opts.action || await prompt('Action (message to send to agent): ');\n\n if (!name || !schedule || !agentId || !action) {\n error('All fields are required.'); process.exit(1);\n }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('cronJobs:create' as any, { name, schedule, agentId, action, isEnabled: true }),\n 'Failed to create cron job'\n );\n success(`Cron job \"${name}\" created.`);\n });\n\n cron\n .command('delete')\n .argument('<id>', 'Cron job ID')\n .description('Delete a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:remove' as any, { _id: id }), 'Failed to delete');\n success(`Cron job \"${id}\" deleted.`);\n });\n\n cron\n .command('enable')\n .argument('<id>', 'Cron job ID')\n .description('Enable a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:update' as any, { _id: id, isEnabled: true }), 'Failed');\n success(`Cron job \"${id}\" enabled.`);\n });\n\n cron\n .command('disable')\n .argument('<id>', 'Cron job ID')\n .description('Disable a cron job')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('cronJobs:update' as any, { _id: id, isEnabled: false }), 'Failed');\n success(`Cron job \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerMcpCommand(program: Command) {\n const mcp = program.command('mcp').description('Manage MCP connections');\n\n mcp\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all MCP connections')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('mcpConnections:list' as any, {}), 'Failed to list connections');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('MCP Connections');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No connections. Add one with: agentforge mcp add'); return; }\n table(items.map((c: any) => ({\n ID: c._id?.slice(-8) || 'N/A',\n Name: c.name,\n Type: c.type,\n Endpoint: c.endpoint,\n Connected: c.isConnected ? '✔' : '✖',\n Enabled: c.isEnabled ? '✔' : '✖',\n })));\n });\n\n mcp\n .command('add')\n .description('Add a new MCP connection (interactive)')\n .option('--name <name>', 'Connection name')\n .option('--type <type>', 'Connection type (stdio, sse, http)')\n .option('--endpoint <url>', 'Endpoint URL or command')\n .action(async (opts) => {\n const name = opts.name || await prompt('Connection name: ');\n const type = opts.type || await prompt('Type (stdio/sse/http): ');\n const endpoint = opts.endpoint || await prompt('Endpoint (URL or command): ');\n\n if (!name || !type || !endpoint) { error('All fields required.'); process.exit(1); }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('mcpConnections:create' as any, {\n name, type, endpoint, isConnected: false, isEnabled: true,\n }),\n 'Failed to add connection'\n );\n success(`MCP connection \"${name}\" added.`);\n });\n\n mcp\n .command('remove')\n .argument('<id>', 'Connection ID')\n .description('Remove an MCP connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:remove' as any, { _id: id }), 'Failed');\n success(`Connection \"${id}\" removed.`);\n });\n\n mcp\n .command('test')\n .argument('<id>', 'Connection ID')\n .description('Test an MCP connection')\n .action(async (id) => {\n info(`Testing connection \"${id}\"...`);\n const client = await createClient();\n const conns = await safeCall(() => client.query('mcpConnections:list' as any, {}), 'Failed');\n const conn = (conns as any[]).find((c: any) => c._id === id || c._id?.endsWith(id));\n if (!conn) { error(`Connection \"${id}\" not found.`); process.exit(1); }\n\n // Simple connectivity test\n if (conn.type === 'http' || conn.type === 'sse') {\n try {\n const res = await fetch(conn.endpoint, { method: 'HEAD', signal: AbortSignal.timeout(5000) });\n if (res.ok) {\n success(`Connection \"${conn.name}\" is reachable (HTTP ${res.status}).`);\n await client.mutation('mcpConnections:update' as any, { _id: conn._id, isConnected: true });\n } else {\n error(`Connection \"${conn.name}\" returned HTTP ${res.status}.`);\n }\n } catch (e: any) {\n error(`Connection \"${conn.name}\" failed: ${e.message}`);\n }\n } else {\n info(`Connection type \"${conn.type}\" — manual verification required.`);\n info(`Endpoint: ${conn.endpoint}`);\n }\n });\n\n mcp\n .command('enable')\n .argument('<id>', 'Connection ID')\n .description('Enable a connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:update' as any, { _id: id, isEnabled: true }), 'Failed');\n success(`Connection \"${id}\" enabled.`);\n });\n\n mcp\n .command('disable')\n .argument('<id>', 'Connection ID')\n .description('Disable a connection')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('mcpConnections:update' as any, { _id: id, isEnabled: false }), 'Failed');\n success(`Connection \"${id}\" disabled.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, formatDate } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nexport function registerFilesCommand(program: Command) {\n const files = program.command('files').description('Manage files');\n\n files\n .command('list')\n .argument('[folder]', 'Folder ID to list files from')\n .option('--json', 'Output as JSON')\n .description('List files')\n .action(async (folder, opts) => {\n const client = await createClient();\n const args = folder ? { folderId: folder } : {};\n const result = await safeCall(() => client.query('files:list' as any, args), 'Failed to list files');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Files');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No files. Upload one with: agentforge files upload <path>'); return; }\n table(items.map((f: any) => ({\n ID: f._id?.slice(-8) || 'N/A',\n Name: f.name,\n Type: f.mimeType,\n Size: formatSize(f.size),\n Folder: f.folderId || 'root',\n Created: formatDate(f.createdAt),\n })));\n });\n\n files\n .command('upload')\n .argument('<filepath>', 'Path to file to upload')\n .option('--folder <id>', 'Folder ID to upload to')\n .option('--project <id>', 'Project ID to associate with')\n .description('Upload a file')\n .action(async (filepath, opts) => {\n const absPath = path.resolve(filepath);\n if (!fs.existsSync(absPath)) { error(`File not found: ${absPath}`); process.exit(1); }\n\n const stat = fs.statSync(absPath);\n const name = path.basename(absPath);\n const ext = path.extname(absPath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n '.txt': 'text/plain', '.md': 'text/markdown', '.json': 'application/json',\n '.js': 'text/javascript', '.ts': 'text/typescript', '.py': 'text/x-python',\n '.pdf': 'application/pdf', '.png': 'image/png', '.jpg': 'image/jpeg',\n '.csv': 'text/csv', '.html': 'text/html', '.xml': 'text/xml',\n };\n const mimeType = mimeTypes[ext] || 'application/octet-stream';\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('files:create' as any, {\n name, mimeType, size: stat.size,\n folderId: opts.folder, projectId: opts.project,\n }),\n 'Failed to upload file metadata'\n );\n success(`File \"${name}\" registered (${formatSize(stat.size)}, ${mimeType}).`);\n info('Note: File content storage requires Convex file storage or R2 integration.');\n });\n\n files\n .command('delete')\n .argument('<id>', 'File ID')\n .description('Delete a file')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('files:remove' as any, { _id: id }), 'Failed to delete file');\n success(`File \"${id}\" deleted.`);\n });\n\n // Folders subcommand\n const folders = program.command('folders').description('Manage folders');\n\n folders\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all folders')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('folders:list' as any, {}), 'Failed to list folders');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Folders');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No folders. Create one with: agentforge folders create <name>'); return; }\n table(items.map((f: any) => ({\n ID: f._id?.slice(-8) || 'N/A',\n Name: f.name,\n Parent: f.parentId || 'root',\n Created: formatDate(f.createdAt),\n })));\n });\n\n folders\n .command('create')\n .argument('<name>', 'Folder name')\n .option('--parent <id>', 'Parent folder ID')\n .description('Create a folder')\n .action(async (name, opts) => {\n const client = await createClient();\n await safeCall(\n () => client.mutation('folders:create' as any, { name, parentId: opts.parent }),\n 'Failed to create folder'\n );\n success(`Folder \"${name}\" created.`);\n });\n\n folders\n .command('delete')\n .argument('<id>', 'Folder ID')\n .description('Delete a folder')\n .action(async (id) => {\n const client = await createClient();\n await safeCall(() => client.mutation('folders:remove' as any, { _id: id }), 'Failed to delete folder');\n success(`Folder \"${id}\" deleted.`);\n });\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, details, success, error, info, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerProjectsCommand(program: Command) {\n const projects = program.command('projects').description('Manage projects and workspaces');\n\n projects\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all projects')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('projects:list' as any, {}), 'Failed to list projects');\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Projects');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No projects. Create one with: agentforge projects create <name>'); return; }\n table(items.map((p: any) => ({\n ID: p._id?.slice(-8) || 'N/A',\n Name: p.name,\n Status: p.status,\n Description: (p.description || '').slice(0, 40),\n Created: formatDate(p.createdAt),\n })));\n });\n\n projects\n .command('create')\n .argument('<name>', 'Project name')\n .option('-d, --description <desc>', 'Project description')\n .description('Create a new project')\n .action(async (name, opts) => {\n const description = opts.description || await prompt('Description (optional): ');\n const client = await createClient();\n await safeCall(\n () => client.mutation('projects:create' as any, { name, description, status: 'active' }),\n 'Failed to create project'\n );\n success(`Project \"${name}\" created.`);\n });\n\n projects\n .command('inspect')\n .argument('<id>', 'Project ID')\n .description('Show project details')\n .action(async (id) => {\n const client = await createClient();\n const projects = await safeCall(() => client.query('projects:list' as any, {}), 'Failed');\n const project = (projects as any[]).find((p: any) => p._id === id || p._id?.endsWith(id));\n if (!project) { error(`Project \"${id}\" not found.`); process.exit(1); }\n header(`Project: ${project.name}`);\n details({\n ID: project._id,\n Name: project.name,\n Status: project.status,\n Description: project.description || 'N/A',\n Created: formatDate(project.createdAt),\n Updated: formatDate(project.updatedAt),\n });\n });\n\n projects\n .command('delete')\n .argument('<id>', 'Project ID')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete a project')\n .action(async (id, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete project \"${id}\"? (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n await safeCall(() => client.mutation('projects:remove' as any, { _id: id }), 'Failed');\n success(`Project \"${id}\" deleted.`);\n });\n\n projects\n .command('switch')\n .argument('<id>', 'Project ID to switch to')\n .description('Set the active project')\n .action(async (id) => {\n const client = await createClient();\n // Verify project exists\n const projects = await safeCall(() => client.query('projects:list' as any, {}), 'Failed');\n const project = (projects as any[]).find((p: any) => p._id === id || p._id?.endsWith(id));\n if (!project) { error(`Project \"${id}\" not found.`); process.exit(1); }\n // Store active project in settings\n await safeCall(\n () => client.mutation('settings:set' as any, { userId: 'cli', key: 'activeProject', value: project._id }),\n 'Failed to switch project'\n );\n success(`Switched to project \"${project.name}\".`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, details, colors } from '../lib/display.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nexport function registerConfigCommand(program: Command) {\n const config = program.command('config').description('Manage configuration');\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n header('Configuration');\n\n // Check local .env files\n const cwd = process.cwd();\n const envFiles = ['.env', '.env.local', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n console.log(` ${colors.cyan}${envFile}${colors.reset}`);\n const content = fs.readFileSync(envPath, 'utf-8');\n content.split('\\n').forEach((line) => {\n if (line.trim() && !line.startsWith('#')) {\n const [key, ...rest] = line.split('=');\n const value = rest.join('=').trim();\n const masked = key.toLowerCase().includes('key') || key.toLowerCase().includes('secret') || key.toLowerCase().includes('token')\n ? value.slice(0, 4) + '****' + value.slice(-4)\n : value;\n console.log(` ${colors.dim}${key.trim()}${colors.reset} = ${masked}`);\n }\n });\n console.log();\n }\n }\n\n // Check Convex config\n const convexDir = path.join(cwd, '.convex');\n if (fs.existsSync(convexDir)) {\n info('Convex: Configured');\n } else {\n info('Convex: Not configured (run `npx convex dev`)');\n }\n\n // Check skills directory\n const skillsDir = path.join(cwd, 'skills');\n if (fs.existsSync(skillsDir)) {\n const skills = fs.readdirSync(skillsDir).filter((d: string) => fs.statSync(path.join(skillsDir, d)).isDirectory());\n info(`Skills: ${skills.length} installed (${skills.join(', ')})`);\n } else {\n info('Skills: None installed');\n }\n });\n\n config\n .command('set')\n .argument('<key>', 'Configuration key')\n .argument('<value>', 'Configuration value')\n .option('--env <file>', 'Environment file to update', '.env.local')\n .description('Set a configuration value')\n .action(async (key, value, opts) => {\n const envPath = path.join(process.cwd(), opts.env);\n let content = '';\n if (fs.existsSync(envPath)) {\n content = fs.readFileSync(envPath, 'utf-8');\n }\n\n const lines = content.split('\\n');\n const idx = lines.findIndex((l) => l.startsWith(`${key}=`));\n if (idx >= 0) {\n lines[idx] = `${key}=${value}`;\n } else {\n lines.push(`${key}=${value}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n'));\n success(`Set ${key} in ${opts.env}`);\n });\n\n config\n .command('get')\n .argument('<key>', 'Configuration key')\n .description('Get a configuration value')\n .action(async (key) => {\n const cwd = process.cwd();\n const envFiles = ['.env.local', '.env', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(new RegExp(`^${key}=(.+)$`, 'm'));\n if (match) {\n console.log(match[1].trim());\n return;\n }\n }\n }\n error(`Key \"${key}\" not found in any .env file.`);\n });\n\n config\n .command('init')\n .description('Initialize configuration for a new project')\n .action(async () => {\n header('Project Configuration');\n const convexUrl = await prompt('Convex URL (from `npx convex dev`): ');\n const provider = await prompt('LLM Provider (openai/openrouter/anthropic/google): ') || 'openai';\n const apiKey = await prompt(`${provider.toUpperCase()} API Key: `);\n\n const envContent = [\n `# AgentForge Configuration`,\n `CONVEX_URL=${convexUrl}`,\n ``,\n `# LLM Provider`,\n `LLM_PROVIDER=${provider}`,\n ];\n\n if (provider === 'openai') envContent.push(`OPENAI_API_KEY=${apiKey}`);\n else if (provider === 'openrouter') envContent.push(`OPENROUTER_API_KEY=${apiKey}`);\n else if (provider === 'anthropic') envContent.push(`ANTHROPIC_API_KEY=${apiKey}`);\n else if (provider === 'google') envContent.push(`GOOGLE_API_KEY=${apiKey}`);\n\n fs.writeFileSync(path.join(process.cwd(), '.env.local'), envContent.join('\\n') + '\\n');\n success('Configuration saved to .env.local');\n info('Run `npx convex dev` to start the Convex backend.');\n });\n\n config\n .command('provider')\n .argument('<provider>', 'LLM provider to configure (openai, openrouter, anthropic, google, xai)')\n .description('Configure an LLM provider')\n .action(async (provider) => {\n const keyNames: Record<string, string> = {\n openai: 'OPENAI_API_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GOOGLE_API_KEY',\n xai: 'XAI_API_KEY',\n };\n const keyName = keyNames[provider.toLowerCase()];\n if (!keyName) {\n error(`Unknown provider \"${provider}\". Supported: ${Object.keys(keyNames).join(', ')}`);\n process.exit(1);\n }\n const apiKey = await prompt(`${keyName}: `);\n if (!apiKey) { error('API key is required.'); process.exit(1); }\n\n const envPath = path.join(process.cwd(), '.env.local');\n let content = '';\n if (fs.existsSync(envPath)) content = fs.readFileSync(envPath, 'utf-8');\n\n const lines = content.split('\\n');\n const idx = lines.findIndex((l) => l.startsWith(`${keyName}=`));\n if (idx >= 0) lines[idx] = `${keyName}=${apiKey}`;\n else lines.push(`${keyName}=${apiKey}`);\n\n // Also set LLM_PROVIDER\n const provIdx = lines.findIndex((l) => l.startsWith('LLM_PROVIDER='));\n if (provIdx >= 0) lines[provIdx] = `LLM_PROVIDER=${provider}`;\n else lines.push(`LLM_PROVIDER=${provider}`);\n\n fs.writeFileSync(envPath, lines.join('\\n'));\n success(`Provider \"${provider}\" configured.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, table, success, error, info, dim, colors, formatDate } from '../lib/display.js';\nimport readline from 'node:readline';\n\nfunction prompt(q: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => rl.question(q, (a) => { rl.close(); r(a.trim()); }));\n}\n\nfunction promptSecret(q: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n // Disable echo for secret input\n if (process.stdin.isTTY) {\n process.stdout.write(q);\n let input = '';\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf-8');\n const onData = (char: string) => {\n if (char === '\\n' || char === '\\r') {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n console.log();\n rl.close();\n resolve(input);\n } else if (char === '\\u0003') {\n process.exit();\n } else if (char === '\\u007F') {\n input = input.slice(0, -1);\n process.stdout.clearLine(0);\n process.stdout.cursorTo(0);\n process.stdout.write(q + '*'.repeat(input.length));\n } else {\n input += char;\n process.stdout.write('*');\n }\n };\n process.stdin.on('data', onData);\n } else {\n rl.question(q, (ans) => { rl.close(); resolve(ans.trim()); });\n }\n });\n}\n\nexport function registerVaultCommand(program: Command) {\n const vault = program.command('vault').description('Manage secrets securely');\n\n vault\n .command('list')\n .option('--json', 'Output as JSON')\n .description('List all stored secrets (values hidden)')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed to list secrets');\n if (opts.json) {\n const safe = ((result as any[]) || []).map((s: any) => ({ ...s, encryptedValue: undefined }));\n console.log(JSON.stringify(safe, null, 2));\n return;\n }\n header('Vault — Stored Secrets');\n const items = (result as any[]) || [];\n if (items.length === 0) { info('No secrets stored. Add one with: agentforge vault set <name> <value>'); return; }\n table(items.map((s: any) => ({\n Name: s.name,\n Category: s.category || 'general',\n Provider: s.provider || 'N/A',\n 'Last Rotated': s.lastRotatedAt ? formatDate(s.lastRotatedAt) : 'Never',\n Created: formatDate(s.createdAt),\n })));\n });\n\n vault\n .command('set')\n .argument('<name>', 'Secret name (e.g., OPENAI_API_KEY)')\n .argument('[value]', 'Secret value (omit for secure prompt)')\n .option('--category <cat>', 'Category (api_key, token, secret, credential)', 'api_key')\n .option('--provider <provider>', 'Provider name (openai, anthropic, etc.)')\n .description('Store a secret securely')\n .action(async (name, value, opts) => {\n if (!value) {\n value = await promptSecret(`Enter value for ${name}: `);\n }\n if (!value) { error('Value is required.'); process.exit(1); }\n\n const client = await createClient();\n await safeCall(\n () => client.mutation('vault:store' as any, {\n name,\n encryptedValue: value,\n category: opts.category,\n provider: opts.provider,\n }),\n 'Failed to store secret'\n );\n success(`Secret \"${name}\" stored securely.`);\n });\n\n vault\n .command('get')\n .argument('<name>', 'Secret name')\n .option('--reveal', 'Show the actual value (use with caution)')\n .description('Retrieve a secret')\n .action(async (name, opts) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n\n if (opts.reveal) {\n const value = await safeCall(\n () => client.query('vault:getDecrypted' as any, { _id: secret._id }),\n 'Failed to retrieve secret'\n );\n console.log(value);\n } else {\n const masked = secret.encryptedValue\n ? secret.encryptedValue.slice(0, 4) + '****' + secret.encryptedValue.slice(-4)\n : '****';\n info(`${name} = ${masked}`);\n dim(' Use --reveal to show the full value.');\n }\n });\n\n vault\n .command('delete')\n .argument('<name>', 'Secret name')\n .option('-f, --force', 'Skip confirmation')\n .description('Delete a secret')\n .action(async (name, opts) => {\n if (!opts.force) {\n const confirm = await prompt(`Delete secret \"${name}\"? This cannot be undone. (y/N): `);\n if (confirm.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n await safeCall(() => client.mutation('vault:remove' as any, { _id: secret._id }), 'Failed');\n success(`Secret \"${name}\" deleted.`);\n });\n\n vault\n .command('rotate')\n .argument('<name>', 'Secret name')\n .description('Rotate a secret (set a new value)')\n .action(async (name) => {\n const client = await createClient();\n const result = await safeCall(() => client.query('vault:list' as any, {}), 'Failed');\n const secret = ((result as any[]) || []).find((s: any) => s.name === name);\n if (!secret) { error(`Secret \"${name}\" not found.`); process.exit(1); }\n\n const newValue = await promptSecret(`Enter new value for ${name}: `);\n if (!newValue) { error('Value is required.'); process.exit(1); }\n\n await safeCall(\n () => client.mutation('vault:rotate' as any, { _id: secret._id, newValue }),\n 'Failed to rotate secret'\n );\n success(`Secret \"${name}\" rotated.`);\n });\n}\n","import { Command } from 'commander';\nimport { createClient } from '../lib/convex-client.js';\nimport { header, success, error, info, dim, table } from '../lib/display.js';\n\nfunction safeCall<T>(fn: () => Promise<T>, msg: string): Promise<T> {\n return fn().catch((e: any) => { error(`${msg}: ${e.message}`); process.exit(1); });\n}\n\nfunction formatDate(ts: number): string {\n return new Date(ts).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 12) return key.substring(0, 4) + '****';\n return key.substring(0, 8) + '...' + key.substring(key.length - 4);\n}\n\nfunction promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n const readline = require('readline');\n if (process.stdin.isTTY) {\n process.stdout.write(question);\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n let input = '';\n const onData = (char: string) => {\n if (char === '\\n' || char === '\\r' || char === '\\u0004') {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n resolve(input);\n } else if (char === '\\u0003') {\n process.exit(0);\n } else if (char === '\\u007f' || char === '\\b') {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else {\n input += char;\n process.stdout.write('*');\n }\n };\n process.stdin.on('data', onData);\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (ans: string) => { rl.close(); resolve(ans.trim()); });\n }\n });\n}\n\nconst PROVIDERS = [\n { id: 'openai', name: 'OpenAI', prefix: 'sk-' },\n { id: 'anthropic', name: 'Anthropic', prefix: 'sk-ant-' },\n { id: 'openrouter', name: 'OpenRouter', prefix: 'sk-or-' },\n { id: 'google', name: 'Google AI', prefix: 'AIza' },\n { id: 'xai', name: 'xAI', prefix: 'xai-' },\n { id: 'groq', name: 'Groq', prefix: 'gsk_' },\n { id: 'together', name: 'Together AI', prefix: '' },\n { id: 'perplexity', name: 'Perplexity', prefix: 'pplx-' },\n];\n\nexport function registerKeysCommand(program: Command) {\n const keys = program.command('keys').description('Manage AI provider API keys');\n\n keys\n .command('list')\n .option('--provider <provider>', 'Filter by provider')\n .option('--json', 'Output as JSON')\n .description('List all configured API keys')\n .action(async (opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:list' as any, opts.provider ? { provider: opts.provider } : {}),\n 'Failed to list API keys'\n );\n\n const items = (result as any[]) || [];\n\n if (opts.json) {\n const safe = items.map((k: any) => ({ ...k, encryptedKey: maskKey(k.encryptedKey) }));\n console.log(JSON.stringify(safe, null, 2));\n return;\n }\n\n header('API Keys');\n\n if (items.length === 0) {\n info('No API keys configured.');\n dim(' Add one with: agentforge keys add <provider> [key]');\n dim('');\n dim(' Supported providers:');\n PROVIDERS.forEach(p => dim(` ${p.id.padEnd(12)} ${p.name}`));\n return;\n }\n\n table(items.map((k: any) => ({\n Provider: k.provider,\n Name: k.keyName,\n Key: maskKey(k.encryptedKey),\n Active: k.isActive ? '✓' : '✗',\n Created: formatDate(k.createdAt),\n 'Last Used': k.lastUsedAt ? formatDate(k.lastUsedAt) : 'Never',\n })));\n });\n\n keys\n .command('add')\n .argument('<provider>', `Provider (${PROVIDERS.map(p => p.id).join(', ')})`)\n .argument('[key]', 'API key value (omit for secure prompt)')\n .option('--name <name>', 'Key display name')\n .description('Add an AI provider API key')\n .action(async (provider, key, opts) => {\n const providerInfo = PROVIDERS.find(p => p.id === provider);\n if (!providerInfo) {\n error(`Unknown provider \"${provider}\". Supported: ${PROVIDERS.map(p => p.id).join(', ')}`);\n process.exit(1);\n }\n\n if (!key) {\n key = await promptSecret(`Enter ${providerInfo.name} API key: `);\n }\n if (!key) { error('API key is required.'); process.exit(1); }\n\n if (providerInfo.prefix && !key.startsWith(providerInfo.prefix)) {\n info(`Warning: ${providerInfo.name} keys typically start with \"${providerInfo.prefix}\".`);\n }\n\n const keyName = opts.name || `${providerInfo.name} Key`;\n const client = await createClient();\n await safeCall(\n () => client.mutation('apiKeys:create' as any, {\n provider,\n keyName,\n encryptedKey: key,\n }),\n 'Failed to store API key'\n );\n success(`${providerInfo.name} API key \"${keyName}\" stored successfully.`);\n });\n\n keys\n .command('remove')\n .argument('<provider>', 'Provider name')\n .option('-f, --force', 'Skip confirmation')\n .description('Remove an API key')\n .action(async (provider, opts) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:list' as any, { provider }),\n 'Failed to list keys'\n );\n const items = (result as any[]) || [];\n if (items.length === 0) { error(`No API keys found for \"${provider}\".`); process.exit(1); }\n\n // If multiple keys, remove the first one (or we could add selection)\n const target = items[0];\n\n if (!opts.force) {\n const readline = require('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`Delete \"${target.keyName}\" for ${provider}? (y/N): `, (ans: string) => { rl.close(); resolve(ans.trim()); });\n });\n if (answer.toLowerCase() !== 'y') { info('Cancelled.'); return; }\n }\n\n await safeCall(\n () => client.mutation('apiKeys:remove' as any, { id: target._id }),\n 'Failed to remove API key'\n );\n success(`API key \"${target.keyName}\" removed.`);\n });\n\n keys\n .command('test')\n .argument('<provider>', 'Provider to test')\n .description('Test an API key by making a simple request')\n .action(async (provider) => {\n const client = await createClient();\n const result = await safeCall(\n () => client.query('apiKeys:getActiveForProvider' as any, { provider }),\n 'Failed to get key'\n );\n\n if (!result) { error(`No active API key for \"${provider}\". Add one with: agentforge keys add ${provider}`); process.exit(1); }\n\n const key = (result as any).encryptedKey;\n info(`Testing ${provider} API key...`);\n\n try {\n let ok = false;\n if (provider === 'openai') {\n const res = await fetch('https://api.openai.com/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else if (provider === 'anthropic') {\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: { 'x-api-key': key, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'claude-3-haiku-20240307', max_tokens: 1, messages: [{ role: 'user', content: 'hi' }] }),\n });\n ok = res.ok;\n } else if (provider === 'openrouter') {\n const res = await fetch('https://openrouter.ai/api/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else if (provider === 'google') {\n const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${key}`);\n ok = res.ok;\n } else if (provider === 'groq') {\n const res = await fetch('https://api.groq.com/openai/v1/models', { headers: { Authorization: `Bearer ${key}` } });\n ok = res.ok;\n } else {\n info(`No test endpoint configured for \"${provider}\". Key is stored.`);\n return;\n }\n\n if (ok) {\n success(`${provider} API key is valid and working.`);\n await safeCall(\n () => client.mutation('apiKeys:updateLastUsed' as any, { id: (result as any)._id }),\n 'Failed to update last used'\n );\n } else {\n error(`${provider} API key returned an error. Check that the key is valid.`);\n }\n } catch (e: any) {\n error(`Connection failed: ${e.message}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { createClient, safeCall } from '../lib/convex-client.js';\nimport { header, details, success, error, info, dim, colors } from '../lib/display.js';\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'fs-extra';\nimport readline from 'node:readline';\n\nexport function registerStatusCommand(program: Command) {\n program\n .command('status')\n .description('Show system health and connection status')\n .action(async () => {\n header('AgentForge Status');\n\n const cwd = process.cwd();\n const checks: Record<string, string> = {};\n\n checks['Project Root'] = fs.existsSync(path.join(cwd, 'package.json')) ? '✔ Found' : '✖ Not found';\n checks['Convex Dir'] = fs.existsSync(path.join(cwd, 'convex')) ? '✔ Found' : '✖ Not found';\n checks['Skills Dir'] = fs.existsSync(path.join(cwd, 'skills')) ? '✔ Found' : '✖ Not configured';\n checks['Dashboard Dir'] = fs.existsSync(path.join(cwd, 'dashboard')) ? '✔ Found' : '✖ Not found';\n checks['Env Config'] = fs.existsSync(path.join(cwd, '.env.local')) || fs.existsSync(path.join(cwd, '.env'))\n ? '✔ Found' : '✖ Not found';\n\n // Check Convex connection\n try {\n const client = await createClient();\n const agents = await client.query('agents:list' as any, {});\n checks['Convex Connection'] = `✔ Connected (${(agents as any[])?.length || 0} agents)`;\n } catch {\n checks['Convex Connection'] = '✖ Not connected (run `npx convex dev`)';\n }\n\n // Check LLM provider\n const envFiles = ['.env.local', '.env'];\n let provider = 'Not configured';\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n const content = fs.readFileSync(envPath, 'utf-8');\n const match = content.match(/LLM_PROVIDER=(.+)/);\n if (match) { provider = match[1].trim(); break; }\n if (content.includes('OPENAI_API_KEY=')) { provider = 'openai'; break; }\n if (content.includes('OPENROUTER_API_KEY=')) { provider = 'openrouter'; break; }\n }\n }\n checks['LLM Provider'] = provider !== 'Not configured' ? `✔ ${provider}` : '✖ Not configured';\n\n details(checks);\n });\n\n program\n .command('dashboard')\n .description('Launch the web dashboard')\n .option('-p, --port <port>', 'Port for the dashboard', '3000')\n .option('--install', 'Install dashboard dependencies before starting')\n .action(async (opts) => {\n const cwd = process.cwd();\n\n // Search for the dashboard in multiple locations (in priority order)\n const searchPaths = [\n path.join(cwd, 'dashboard'), // 1. Bundled in project (agentforge create)\n path.join(cwd, 'packages', 'web'), // 2. Monorepo structure\n path.join(cwd, 'node_modules', '@agentforge-ai', 'web'), // 3. Installed as dependency\n ];\n\n let dashDir = '';\n for (const p of searchPaths) {\n if (fs.existsSync(path.join(p, 'package.json'))) {\n dashDir = p;\n break;\n }\n }\n\n if (!dashDir) {\n error('Dashboard not found!');\n console.log();\n info('The dashboard should be in your project\\'s ./dashboard/ directory.');\n info('If you created this project with an older version of AgentForge,');\n info('you can add it manually:');\n console.log();\n console.log(` ${colors.cyan}# Option 1: Recreate the project${colors.reset}`);\n console.log(` agentforge create my-project`);\n console.log();\n console.log(` ${colors.cyan}# Option 2: Clone the dashboard from the repo${colors.reset}`);\n console.log(` git clone https://github.com/Agentic-Engineering-Agency/agentforge /tmp/af`);\n console.log(` cp -r /tmp/af/packages/web ./dashboard`);\n console.log(` cd dashboard && pnpm install`);\n console.log();\n return;\n }\n\n // Check if node_modules exists, if not install\n const nodeModulesExists = fs.existsSync(path.join(dashDir, 'node_modules'));\n if (!nodeModulesExists || opts.install) {\n header('AgentForge Dashboard — Installing Dependencies');\n info(`Installing in ${path.relative(cwd, dashDir) || '.'}...`);\n console.log();\n\n const installChild = spawn('pnpm', ['install'], {\n cwd: dashDir,\n stdio: 'inherit',\n shell: true,\n });\n\n await new Promise<void>((resolve, reject) => {\n installChild.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`pnpm install exited with code ${code}`));\n });\n installChild.on('error', reject);\n });\n\n console.log();\n success('Dependencies installed.');\n console.log();\n }\n\n // Read the Convex URL from .env.local and inject it into the dashboard\n const envPath = path.join(cwd, '.env.local');\n if (fs.existsSync(envPath)) {\n const envContent = fs.readFileSync(envPath, 'utf-8');\n const convexUrlMatch = envContent.match(/CONVEX_URL=(.+)/);\n if (convexUrlMatch) {\n const dashEnvPath = path.join(dashDir, '.env.local');\n const dashEnvContent = `VITE_CONVEX_URL=${convexUrlMatch[1].trim()}\\n`;\n fs.writeFileSync(dashEnvPath, dashEnvContent);\n }\n }\n\n header('AgentForge Dashboard');\n info(`Starting dashboard on port ${opts.port}...`);\n info(`Open ${colors.cyan}http://localhost:${opts.port}${colors.reset} in your browser.`);\n console.log();\n\n const child = spawn('pnpm', ['dev', '--port', opts.port], {\n cwd: dashDir,\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('error', (err) => {\n error(`Failed to start dashboard: ${err.message}`);\n });\n });\n\n program\n .command('logs')\n .description('Show recent activity logs')\n .option('-n, --lines <count>', 'Number of log entries', '20')\n .option('--agent <id>', 'Filter by agent ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n const client = await createClient();\n const args: Record<string, any> = {};\n if (opts.agent) args.agentId = opts.agent;\n\n const result = await safeCall(\n () => client.query('usage:list' as any, args),\n 'Failed to fetch logs'\n );\n\n if (opts.json) { console.log(JSON.stringify(result, null, 2)); return; }\n header('Activity Logs');\n const items = ((result as any[]) || []).slice(0, parseInt(opts.lines));\n if (items.length === 0) { info('No activity logs found.'); return; }\n\n items.forEach((log: any) => {\n const time = new Date(log.timestamp || log.createdAt).toLocaleString();\n const agent = log.agentId || 'system';\n const action = log.action || log.type || 'unknown';\n const tokens = log.tokensUsed ? `${log.tokensUsed} tokens` : '';\n console.log(` ${colors.dim}${time}${colors.reset} ${colors.cyan}${agent}${colors.reset} ${action} ${tokens}`);\n });\n console.log();\n });\n\n program\n .command('heartbeat')\n .description('Check and resume pending agent tasks')\n .option('--agent <id>', 'Check specific agent')\n .action(async (opts) => {\n const client = await createClient();\n header('Heartbeat Check');\n\n const args: Record<string, any> = {};\n if (opts.agent) args.agentId = opts.agent;\n\n const result = await safeCall(\n () => client.query('heartbeat:listPending' as any, args),\n 'Failed to check heartbeat'\n );\n\n const items = (result as any[]) || [];\n if (items.length === 0) {\n success('All tasks complete. No pending work.');\n return;\n }\n\n info(`Found ${items.length} pending task(s):`);\n items.forEach((task: any, i: number) => {\n console.log(` ${colors.yellow}${i + 1}.${colors.reset} [${task.agentId}] ${task.taskDescription || 'Unnamed task'}`);\n console.log(` ${colors.dim}Status: ${task.status} | Thread: ${task.threadId || 'N/A'}${colors.reset}`);\n });\n console.log();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((r) => rl.question('Resume pending tasks? (y/N): ', (a) => { rl.close(); r(a.trim()); }));\n if (answer.toLowerCase() === 'y') {\n for (const task of items) {\n info(`Resuming task for agent \"${task.agentId}\"...`);\n await safeCall(\n () => client.mutation('heartbeat:resume' as any, { _id: task._id }),\n 'Failed to resume task'\n );\n }\n success('All pending tasks resumed.');\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport prompts from 'prompts';\nimport { execSync } from 'node:child_process';\nimport {\n readCredentials,\n writeCredentials,\n deleteCredentials,\n isAuthenticated,\n getCredentialsPath,\n getCloudUrl,\n} from '../lib/credentials.js';\nimport { CloudClient, CloudClientError } from '../lib/cloud-client.js';\nimport { header, success, error, info, details } from '../lib/display.js';\n\n/**\n * Register login, logout, and whoami commands\n */\nexport function registerLoginCommand(program: Command) {\n // Login command\n program\n .command('login')\n .description('Authenticate with AgentForge Cloud')\n .option('--api-key <key>', 'API key for authentication (skips browser flow)')\n .option('--cloud-url <url>', 'Custom AgentForge Cloud URL')\n .action(async (options) => {\n header('AgentForge Cloud Login');\n\n // Check if already logged in\n const existingCreds = await readCredentials();\n if (existingCreds?.apiKey) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: 'You are already logged in. Overwrite existing credentials?',\n initial: false,\n });\n\n if (!overwrite) {\n info('Login cancelled.');\n return;\n }\n }\n\n let apiKey: string;\n let cloudUrl: string;\n\n if (options.apiKey) {\n // Use provided API key\n apiKey = options.apiKey;\n cloudUrl = options.cloudUrl || process.env.AGENTFORGE_CLOUD_URL || 'https://cloud.agentforge.ai';\n } else {\n // Interactive login or browser OAuth\n const { method } = await prompts({\n type: 'select',\n name: 'method',\n message: 'How would you like to authenticate?',\n choices: [\n { title: 'Enter API key manually', value: 'api-key' },\n { title: 'Browser (OAuth - coming soon)', value: 'browser', disabled: true },\n ],\n });\n\n if (method === 'api-key') {\n const response = await prompts({\n type: 'password',\n name: 'key',\n message: 'Enter your AgentForge API key:',\n validate: (value) => value.length > 0 ? true : 'API key is required',\n });\n apiKey = response.key;\n } else {\n // Browser flow placeholder\n error('Browser authentication not yet implemented. Use --api-key flag.');\n process.exit(1);\n }\n\n cloudUrl = options.cloudUrl || process.env.AGENTFORGE_CLOUD_URL || 'https://cloud.agentforge.ai';\n }\n\n // Validate the API key\n const spinner = ora('Authenticating with AgentForge Cloud...').start();\n\n try {\n const client = new CloudClient(cloudUrl, apiKey);\n const user = await client.authenticate();\n\n // Store credentials\n await writeCredentials({\n apiKey,\n cloudUrl,\n userEmail: user.email,\n userName: user.name,\n });\n\n spinner.succeed('Authentication successful!');\n\n success(`Logged in as ${chalk.bold(user.email)}`);\n info(`Cloud URL: ${cloudUrl}`);\n info(`Credentials stored at: ${getCredentialsPath()}`);\n } catch (err: any) {\n spinner.fail('Authentication failed');\n\n if (err instanceof CloudClientError) {\n error(err.message);\n if (err.code === 'NETWORK_ERROR') {\n info('Check your internet connection and try again.');\n } else if (err.status === 401) {\n info('Your API key appears to be invalid. Please check and try again.');\n }\n } else {\n error(`Unexpected error: ${err.message || err}`);\n }\n\n process.exit(1);\n }\n });\n\n // Logout command\n program\n .command('logout')\n .description('Clear AgentForge Cloud credentials')\n .action(async () => {\n header('AgentForge Cloud Logout');\n\n const wasLoggedIn = await isAuthenticated();\n \n if (!wasLoggedIn) {\n info('You are not currently logged in.');\n return;\n }\n\n const { confirm } = await prompts({\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to log out?',\n initial: true,\n });\n\n if (!confirm) {\n info('Logout cancelled.');\n return;\n }\n\n const deleted = await deleteCredentials();\n \n if (deleted) {\n success('Logged out successfully.');\n info('Your credentials have been removed.');\n } else {\n error('Failed to remove credentials.');\n process.exit(1);\n }\n });\n\n // Whoami command\n program\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n header('Current User');\n\n const creds = await readCredentials();\n const cloudUrl = await getCloudUrl();\n\n if (!creds?.apiKey) {\n info('You are not logged in.');\n info('Run \"agentforge login\" to authenticate.');\n return;\n }\n\n // Display stored info\n details({\n 'Cloud URL': cloudUrl,\n 'Email': creds.userEmail || 'Unknown',\n 'Name': creds.userName || 'Unknown',\n 'Credentials File': getCredentialsPath(),\n });\n\n // Try to validate with the server\n const spinner = ora('Validating session...').start();\n\n try {\n const client = new CloudClient(creds.cloudUrl, creds.apiKey);\n const user = await client.authenticate();\n\n spinner.succeed('Session is valid');\n success(`Authenticated as ${chalk.bold(user.email)}`);\n } catch (err: any) {\n spinner.fail('Session validation failed');\n\n if (err instanceof CloudClientError && err.status === 401) {\n error('Your session has expired or the API key is invalid.');\n info('Run \"agentforge login\" to re-authenticate.');\n } else {\n error(`Error: ${err.message || err}`);\n info('Your credentials are stored but the server could not be reached.');\n }\n }\n });\n}\n"],"mappings":"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","names":["pkg","path","fs","path","execSync","fs","fs","path","error","path","error","fs","path","resolve","execSync","fs","path","error","resolve","program","readline","program","a","program","fs","path","readline","prompt","program","skills","readline","prompt","program","readline","prompt","program","fs","path","program","readline","prompt","program","projects","fs","path","readline","prompt","program","readline","prompt","resolve","program","safeCall","formatDate","promptSecret","resolve","readline","program","spawn","path","fs","readline","program","resolve","chalk","ora","program","ora","chalk","fileURLToPath","__filename","__dirname"]}