@agentforge-ai/cli 0.3.2 → 0.4.1

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 (89) hide show
  1. package/dist/default/.env.example +46 -6
  2. package/dist/default/README.md +89 -9
  3. package/dist/default/convex/schema.ts +248 -4
  4. package/dist/default/dashboard/app/components/DashboardLayout.tsx +245 -0
  5. package/dist/default/dashboard/app/components/ui/badge.tsx +26 -0
  6. package/dist/default/dashboard/app/components/ui/button.tsx +41 -0
  7. package/dist/default/dashboard/app/components/ui/card.tsx +44 -0
  8. package/dist/default/dashboard/app/components/ui/dialog.tsx +66 -0
  9. package/dist/default/dashboard/app/components/ui/input.tsx +21 -0
  10. package/dist/default/dashboard/app/components/ui/label.tsx +18 -0
  11. package/dist/default/dashboard/app/components/ui/select.tsx +75 -0
  12. package/dist/default/dashboard/app/components/ui/sheet.tsx +73 -0
  13. package/dist/default/dashboard/app/components/ui/switch.tsx +34 -0
  14. package/dist/default/dashboard/app/components/ui/table.tsx +60 -0
  15. package/dist/default/dashboard/app/components/ui/tabs.tsx +50 -0
  16. package/dist/default/dashboard/app/components/ui/tooltip.tsx +23 -0
  17. package/dist/default/dashboard/app/lib/utils.ts +6 -0
  18. package/dist/default/dashboard/app/main.tsx +35 -0
  19. package/dist/default/dashboard/app/routeTree.gen.ts +352 -0
  20. package/dist/default/dashboard/app/routes/__root.tsx +10 -0
  21. package/dist/default/dashboard/app/routes/agents.tsx +255 -0
  22. package/dist/default/dashboard/app/routes/chat.tsx +427 -0
  23. package/dist/default/dashboard/app/routes/connections.tsx +413 -0
  24. package/dist/default/dashboard/app/routes/cron.tsx +322 -0
  25. package/dist/default/dashboard/app/routes/files.tsx +203 -0
  26. package/dist/default/dashboard/app/routes/index.tsx +141 -0
  27. package/dist/default/dashboard/app/routes/projects.tsx +254 -0
  28. package/dist/default/dashboard/app/routes/sessions.tsx +272 -0
  29. package/dist/default/dashboard/app/routes/settings.tsx +583 -0
  30. package/dist/default/dashboard/app/routes/skills.tsx +252 -0
  31. package/dist/default/dashboard/app/routes/usage.tsx +181 -0
  32. package/dist/default/dashboard/app/styles/globals.css +93 -0
  33. package/dist/default/dashboard/index.html +13 -0
  34. package/dist/default/dashboard/package.json +36 -0
  35. package/dist/default/dashboard/postcss.config.js +6 -0
  36. package/dist/default/dashboard/tailwind.config.js +50 -0
  37. package/dist/default/dashboard/tsconfig.json +24 -0
  38. package/dist/default/dashboard/vite.config.ts +16 -0
  39. package/dist/default/package.json +8 -3
  40. package/dist/default/skills/skill-creator/SKILL.md +270 -0
  41. package/dist/default/skills/skill-creator/config.json +11 -0
  42. package/dist/default/skills/skill-creator/index.ts +392 -0
  43. package/dist/default/src/agent.ts +85 -5
  44. package/dist/index.js +1574 -10
  45. package/dist/index.js.map +1 -1
  46. package/package.json +2 -1
  47. package/templates/default/.env.example +46 -6
  48. package/templates/default/README.md +89 -9
  49. package/templates/default/convex/schema.ts +248 -4
  50. package/templates/default/dashboard/app/components/DashboardLayout.tsx +245 -0
  51. package/templates/default/dashboard/app/components/ui/badge.tsx +26 -0
  52. package/templates/default/dashboard/app/components/ui/button.tsx +41 -0
  53. package/templates/default/dashboard/app/components/ui/card.tsx +44 -0
  54. package/templates/default/dashboard/app/components/ui/dialog.tsx +66 -0
  55. package/templates/default/dashboard/app/components/ui/input.tsx +21 -0
  56. package/templates/default/dashboard/app/components/ui/label.tsx +18 -0
  57. package/templates/default/dashboard/app/components/ui/select.tsx +75 -0
  58. package/templates/default/dashboard/app/components/ui/sheet.tsx +73 -0
  59. package/templates/default/dashboard/app/components/ui/switch.tsx +34 -0
  60. package/templates/default/dashboard/app/components/ui/table.tsx +60 -0
  61. package/templates/default/dashboard/app/components/ui/tabs.tsx +50 -0
  62. package/templates/default/dashboard/app/components/ui/tooltip.tsx +23 -0
  63. package/templates/default/dashboard/app/lib/utils.ts +6 -0
  64. package/templates/default/dashboard/app/main.tsx +35 -0
  65. package/templates/default/dashboard/app/routeTree.gen.ts +352 -0
  66. package/templates/default/dashboard/app/routes/__root.tsx +10 -0
  67. package/templates/default/dashboard/app/routes/agents.tsx +255 -0
  68. package/templates/default/dashboard/app/routes/chat.tsx +427 -0
  69. package/templates/default/dashboard/app/routes/connections.tsx +413 -0
  70. package/templates/default/dashboard/app/routes/cron.tsx +322 -0
  71. package/templates/default/dashboard/app/routes/files.tsx +203 -0
  72. package/templates/default/dashboard/app/routes/index.tsx +141 -0
  73. package/templates/default/dashboard/app/routes/projects.tsx +254 -0
  74. package/templates/default/dashboard/app/routes/sessions.tsx +272 -0
  75. package/templates/default/dashboard/app/routes/settings.tsx +583 -0
  76. package/templates/default/dashboard/app/routes/skills.tsx +252 -0
  77. package/templates/default/dashboard/app/routes/usage.tsx +181 -0
  78. package/templates/default/dashboard/app/styles/globals.css +93 -0
  79. package/templates/default/dashboard/index.html +13 -0
  80. package/templates/default/dashboard/package.json +36 -0
  81. package/templates/default/dashboard/postcss.config.js +6 -0
  82. package/templates/default/dashboard/tailwind.config.js +50 -0
  83. package/templates/default/dashboard/tsconfig.json +24 -0
  84. package/templates/default/dashboard/vite.config.ts +16 -0
  85. package/templates/default/package.json +8 -3
  86. package/templates/default/skills/skill-creator/SKILL.md +270 -0
  87. package/templates/default/skills/skill-creator/config.json +11 -0
  88. package/templates/default/skills/skill-creator/index.ts +392 -0
  89. package/templates/default/src/agent.ts +85 -5
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"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create.js';\nimport { runProject } from './commands/run.js';\nimport { deployProject } from './commands/deploy.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('CLI tool for creating, running, and managing AgentForge projects')\n .version(pkg.version);\n\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\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 const templateDir = path.resolve(\n __dirname,\n '..', // from dist/commands to dist\n 'templates',\n options.template\n );\n\n if (!(await fs.pathExists(templateDir))) {\n console.error(`Error: Template \"${options.template}\" not found.`);\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 console.log(` ✅ Project scaffolded at ./${projectName}`);\n\n // Install 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 console.log(`\n🎉 AgentForge project \"${projectName}\" created successfully!\n\nNext steps:\n cd ${projectName}\n agentforge run\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"],"mappings":";;;AAAA,SAAS,eAAe;;;ACAxB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,SAAS,gBAAgB;AAEzB,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAgBzC,eAAsB,cACpB,aACA,SACe;AACf,QAAM,YAAY,KAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW;AAGzD,MAAI,MAAM,GAAG,WAAW,SAAS,GAAG;AAClC,YAAQ,MAAM,qBAAqB,WAAW,mBAAmB;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI;AAAA,yCAAqC,WAAW;AAAA,CAAI;AAGhE,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,MAAI,CAAE,MAAM,GAAG,WAAW,WAAW,GAAI;AACvC,YAAQ,MAAM,oBAAoB,QAAQ,QAAQ,cAAc;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,GAAG,KAAK,aAAa,SAAS;AAGpC,QAAM,UAAU,KAAK,KAAK,WAAW,cAAc;AACnD,MAAI,MAAM,GAAG,WAAW,OAAO,GAAG;AAChC,UAAMA,OAAM,MAAM,GAAG,SAAS,OAAO;AACrC,IAAAA,KAAI,OAAO;AACX,UAAM,GAAG,UAAU,SAASA,MAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,EAChD;AAEA,UAAQ,IAAI,oCAA+B,WAAW,EAAE;AAGxD,UAAQ,IAAI;AAAA;AAAA,CAAmC;AAC/C,MAAI;AACF,aAAS,gBAAgB;AAAA,MACvB,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,YAAQ,IAAI;AAAA,gCAA8B;AAAA,EAC5C,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,0DAAmD,WAAW;AAAA,IAChE;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,gCACW,WAAW;AAAA;AAAA;AAAA,OAG7B,WAAW;AAAA;AAAA;AAAA;AAAA,CAIjB;AACD;;;ACrFA,SAAS,aAAa;AACtB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAiBf,eAAsB,WAAW,SAAoC;AACnE,QAAM,aAAa,QAAQ,IAAI;AAG/B,QAAM,UAAUD,MAAK,KAAK,YAAY,cAAc;AACpD,MAAI,CAAE,MAAMC,IAAG,WAAW,OAAO,GAAI;AACnC,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAYD,MAAK,KAAK,YAAY,QAAQ;AAChD,MAAI,CAAE,MAAMC,IAAG,WAAW,SAAS,GAAI;AACrC,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI;AAAA;AAAA,CAAkD;AAC9D,UAAQ,IAAI,wCAAwC,QAAQ,IAAI,KAAK;AAGrE,QAAM,gBAAgB,MAAM,OAAO,CAAC,UAAU,KAAK,GAAG;AAAA,IACpD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAED,gBAAc,GAAG,SAAS,CAAC,QAAQ;AACjC,YAAQ,MAAM,sCAAsC,IAAI,OAAO,EAAE;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,gBAAc,GAAG,SAAS,CAAC,SAAS;AAClC,QAAI,SAAS,GAAG;AACd,cAAQ,MAAM,sCAAsC,IAAI,EAAE;AAAA,IAC5D;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MAAM;AACrB,YAAQ,IAAI,sDAA+C;AAC3D,kBAAc,KAAK,SAAS;AAC5B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;;;ACrEA,OAAOC,WAAU;AACjB,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,SAAQ;AAsBR,SAAS,aAAa,UAA0C;AACrE,QAAM,UAAUA,IAAG,aAAa,UAAU,OAAO;AACjD,QAAM,OAA+B,CAAC;AAEtC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,UAAU,QAAQ,QAAQ,GAAG;AACnC,QAAI,YAAY,GAAI;AACpB,UAAM,MAAM,QAAQ,MAAM,GAAG,OAAO,EAAE,KAAK;AAC3C,QAAI,QAAQ,QAAQ,MAAM,UAAU,CAAC,EAAE,KAAK;AAE5C,QAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AAClD,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,QAAI,KAAK;AACP,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAUA,eAAsB,cAAc,SAAuC;AACzE,QAAM,aAAa,QAAQ,IAAI;AAG/B,QAAM,UAAUF,MAAK,KAAK,YAAY,cAAc;AACpD,MAAI,CAAE,MAAME,IAAG,WAAW,OAAO,GAAI;AACnC,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAYF,MAAK,KAAK,YAAY,QAAQ;AAChD,MAAI,CAAE,MAAME,IAAG,WAAW,SAAS,GAAI;AACrC,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,6DAAsD;AAClE,QAAI;AACF,MAAAD,UAAS,gCAAgC;AAAA,QACvC,KAAK;AAAA,QACL,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,IAAI,6CAAwC;AAAA,IACtD,QAAQ;AACN,cAAQ,MAAM,6BAAwB;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAGA,QAAM,UAAUD,MAAK,QAAQ,YAAY,QAAQ,GAAG;AACpD,QAAM,YAAY,MAAME,IAAG,WAAW,OAAO;AAG7C,MAAI,UAAkC,CAAC;AACvC,MAAI,WAAW;AACb,cAAU,aAAa,OAAO;AAAA,EAChC;AAGA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,0DAA8C;AAC1D,YAAQ,IAAI,wBAAwB,UAAU,EAAE;AAChD,YAAQ,IAAI,wBAAwB,SAAS,EAAE;AAC/C,YAAQ,IAAI,wBAAwB,YAAY,UAAU,gCAAgC,EAAE;AAE5F,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,cAAQ,IAAI;AAAA,kCAAqC,OAAO,KAAK,OAAO,EAAE,MAAM,IAAI;AAChF,iBAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,gBAAQ,IAAI,cAAS,GAAG,IAAI,QAAQ,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;AAAA,MAC3G;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,sCAAsC;AAAA,IACpD;AAEA,YAAQ,IAAI,qDAA2C;AACvD;AAAA,EACF;AAGA,MAAI,CAAC,WAAW;AACd,YAAQ;AAAA,MACN,4BAA4B,QAAQ,GAAG;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ,IAAI,gCAAyB;AACrC,YAAQ,IAAI,iBAAiB,UAAU,EAAE;AACzC,YAAQ,IAAI,iBAAiB,OAAO,EAAE;AACtC,YAAQ,IAAI,iBAAiB,OAAO,KAAK,OAAO,EAAE,MAAM,cAAc;AACtE,YAAQ,IAAI,8CAA8C;AAAA,EAI5D;AAEA,UAAQ,IAAI,6DAAsD;AAGlE,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,YAAQ,IAAI,oCAAoC;AAChD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,UAAI;AACF,QAAAD,UAAS,sBAAsB,GAAG,KAAK,KAAK,KAAK;AAAA,UAC/C,KAAK;AAAA,UACL,OAAO;AAAA,QACT,CAAC;AACD,gBAAQ,IAAI,cAAS,GAAG,EAAE;AAAA,MAC5B,QAAQ;AACN,gBAAQ,MAAM,4BAAuB,GAAG,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,UAAQ,IAAI,+BAA+B;AAC3C,MAAI;AACF,IAAAA,UAAS,qBAAqB;AAAA,MAC5B,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,YAAQ,IAAI,+CAA0C;AACtD,YAAQ,IAAI,6DAA6D;AAAA,EAC3E,QAAQ;AACN,YAAQ,MAAM,+BAA0B;AACxC,YAAQ,MAAM,2CAA2C;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AH3KA,SAAS,oBAAoB;AAC7B,SAAS,iBAAAE,sBAAqB;AAC9B,SAAS,SAAS,eAAe;AAEjC,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAY,QAAQD,WAAU;AACpC,IAAM,MAAM,KAAK,MAAM,aAAa,QAAQC,YAAW,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtF,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,kEAAkE,EAC9E,QAAQ,IAAI,OAAO;AAEtB,QACG,QAAQ,QAAQ,EAChB,SAAS,kBAAkB,+BAA+B,EAC1D,YAAY,iCAAiC,EAC7C,OAAO,6BAA6B,2BAA2B,SAAS,EACxE,OAAO,OAAO,aAAqB,YAAkC;AACpE,QAAM,cAAc,aAAa,OAAO;AAC1C,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,yCAAyC,EACrD,OAAO,qBAAqB,2BAA2B,MAAM,EAC7D,OAAO,OAAO,YAA8B;AAC3C,QAAM,WAAW,OAAO;AAC1B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,OAAO,gBAAgB,4BAA4B,iBAAiB,EACpE,OAAO,aAAa,wCAAwC,KAAK,EACjE,OAAO,cAAc,mCAAmC,KAAK,EAC7D,OAAO,WAAW,6BAA6B,KAAK,EACpD,OAAO,OAAO,YAAiF;AAC9F,QAAM,cAAc,OAAO;AAC7B,CAAC;AAEH,QAAQ,MAAM;","names":["pkg","path","fs","path","execSync","fs","fileURLToPath","__filename","__dirname"]}
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/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 { 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// ─── 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 { ConvexHttpClient } from 'convex/browser';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\n/**\n * Get the Convex deployment URL from the project's .env files\n */\nfunction getConvexUrl(): string {\n const cwd = process.cwd();\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 .env.local in convex directory\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 */\nexport function createClient(): ConvexHttpClient {\n const url = getConvexUrl();\n return new ConvexHttpClient(url);\n}\n\n/**\n * Safely call a Convex query/mutation and handle errors\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('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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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, 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 = 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 = 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 = 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","spawn","path","fs","readline","program","resolve","fileURLToPath","__filename","__dirname"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentforge-ai/cli",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "CLI tool for creating, running, and managing AgentForge projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "commander": "^12.0.0",
26
+ "convex": "^1.17.0",
26
27
  "chalk": "^5.3.0",
27
28
  "fs-extra": "^11.2.0",
28
29
  "ora": "^8.0.0",
@@ -1,8 +1,48 @@
1
- # OpenAI API Key (required for default model)
2
- OPENAI_API_KEY=sk-your-key-here
1
+ # ─── Convex ─────────────────────────────────────────────────────────────
2
+ # Your Convex deployment URL (set automatically by `npx convex dev`)
3
+ CONVEX_URL=
3
4
 
4
- # E2B API Key (required for sandbox execution)
5
- E2B_API_KEY=e2b_your-key-here
5
+ # ─── LLM Providers ─────────────────────────────────────────────────────
6
+ # Set the API key for your preferred provider(s).
7
+ # You only need ONE provider to get started.
6
8
 
7
- # Convex deployment URL (set automatically by `npx convex dev`)
8
- # CONVEX_URL=https://your-deployment.convex.cloud
9
+ # OpenAI (https://platform.openai.com/api-keys)
10
+ OPENAI_API_KEY=
11
+
12
+ # OpenRouter — access 100+ models with one key (https://openrouter.ai/keys)
13
+ OPENROUTER_API_KEY=
14
+
15
+ # Anthropic (https://console.anthropic.com/)
16
+ ANTHROPIC_API_KEY=
17
+
18
+ # Google Gemini (https://aistudio.google.com/apikey)
19
+ GOOGLE_API_KEY=
20
+
21
+ # xAI / Grok (https://console.x.ai/)
22
+ XAI_API_KEY=
23
+
24
+ # ─── AgentForge Defaults ───────────────────────────────────────────────
25
+ # Default provider: openai | openrouter | anthropic | google | xai
26
+ AGENTFORGE_DEFAULT_PROVIDER=openai
27
+
28
+ # Default model (provider-specific)
29
+ AGENTFORGE_DEFAULT_MODEL=gpt-4o-mini
30
+
31
+ # ─── Sandbox (Code Execution) ──────────────────────────────────────────
32
+ # E2B API key for secure code execution (https://e2b.dev/)
33
+ E2B_API_KEY=
34
+
35
+ # ─── Workspace ──────────────────────────────────────────────────────────
36
+ # Workspace base path for local development (default: ./workspace)
37
+ AGENTFORGE_WORKSPACE_PATH=./workspace
38
+
39
+ # ─── Cloudflare R2 (Cloud Workspace) ────────────────────────────────────
40
+ # Required for cloud workspace deployment on Cloudflare
41
+ R2_ENDPOINT=
42
+ R2_ACCESS_KEY_ID=
43
+ R2_SECRET_ACCESS_KEY=
44
+ R2_BUCKET=
45
+
46
+ # ─── Dashboard ──────────────────────────────────────────────────────────
47
+ # Port for the web dashboard (default: 3000)
48
+ AGENTFORGE_DASHBOARD_PORT=3000
@@ -1,30 +1,110 @@
1
1
  # My AgentForge Project
2
2
 
3
- Built with [AgentForge](https://github.com/Agentic-Engineering-Agency/agentforge) - The Minimalist Framework for Collaborative AI Agents.
3
+ Built with [AgentForge](https://github.com/Agentic-Engineering-Agency/agentforge) a NanoClaw made with Mastra.
4
4
 
5
- ## Getting Started
5
+ ## Quick Start
6
6
 
7
7
  ```bash
8
- # Start the development server
9
- agentforge run
8
+ # 1. Install dependencies
9
+ npm install
10
10
 
11
- # Or use pnpm directly
12
- pnpm dev
11
+ # 2. Set up your environment
12
+ cp .env.example .env
13
+ # Edit .env and add your API key (OpenAI, OpenRouter, Anthropic, etc.)
14
+
15
+ # 3. Start the Convex dev server
16
+ npx convex dev
17
+
18
+ # 4. Start building!
19
+ npm run dev
13
20
  ```
14
21
 
15
22
  ## Project Structure
16
23
 
17
24
  ```
18
25
  ├── convex/ # Convex schema and functions
19
- │ └── schema.ts # Database schema (agents, threads, messages)
26
+ │ └── schema.ts # Database schema (agents, threads, messages, etc.)
20
27
  ├── src/
21
28
  │ └── agent.ts # Your agent definition
29
+ ├── skills/ # Custom skills directory
30
+ ├── .env.example # Environment variable template
22
31
  ├── package.json
23
32
  └── tsconfig.json
24
33
  ```
25
34
 
35
+ ## CLI Commands
36
+
37
+ ```bash
38
+ # Agent Management
39
+ agentforge agents list # List all agents
40
+ agentforge agents create # Create a new agent (interactive)
41
+ agentforge agents inspect <id> # Show agent details
42
+ agentforge agents edit <id> # Edit an agent
43
+ agentforge agents delete <id> # Delete an agent
44
+
45
+ # Chat
46
+ agentforge chat <agent-id> # Start chatting with an agent
47
+ agentforge chat --session <id> # Resume a session
48
+
49
+ # Sessions & Threads
50
+ agentforge sessions list # List all sessions
51
+ agentforge threads list # List all threads
52
+
53
+ # Skills
54
+ agentforge skills list # List installed skills
55
+ agentforge skills install <name> # Install a skill
56
+ agentforge skills search <query> # Search available skills
57
+
58
+ # Cron Jobs
59
+ agentforge cron list # List cron jobs
60
+ agentforge cron create # Create a cron job (interactive)
61
+
62
+ # MCP Connections
63
+ agentforge mcp list # List MCP connections
64
+ agentforge mcp add # Add a connection (interactive)
65
+ agentforge mcp test <id> # Test connection health
66
+
67
+ # Files & Projects
68
+ agentforge files list # List files
69
+ agentforge files upload <path> # Upload a file
70
+ agentforge projects list # List projects
71
+ agentforge projects create <name> # Create a project
72
+
73
+ # Configuration & Vault
74
+ agentforge config list # List all config
75
+ agentforge vault list # List secrets (masked)
76
+ agentforge vault add <name> <value> # Store a secret
77
+
78
+ # Utilities
79
+ agentforge status # Show system health
80
+ agentforge logs # Tail recent logs
81
+ agentforge dashboard # Open the web dashboard
82
+ agentforge deploy # Deploy to production
83
+ ```
84
+
85
+ ## Providers
86
+
87
+ AgentForge supports multiple LLM providers. Set your preferred provider in `.env`:
88
+
89
+ | Provider | Model Format | API Key Variable |
90
+ |----------|-------------|-----------------|
91
+ | OpenAI | `openai:gpt-4o-mini` | `OPENAI_API_KEY` |
92
+ | OpenRouter | `openrouter:anthropic/claude-3.5-sonnet` | `OPENROUTER_API_KEY` |
93
+ | Anthropic | `anthropic:claude-3-5-sonnet-20241022` | `ANTHROPIC_API_KEY` |
94
+ | Google | `google:gemini-2.0-flash` | `GOOGLE_API_KEY` |
95
+ | xAI | `xai:grok-2` | `XAI_API_KEY` |
96
+
97
+ ## Web Dashboard
98
+
99
+ Launch the dashboard for a visual interface:
100
+
101
+ ```bash
102
+ agentforge dashboard
103
+ ```
104
+
26
105
  ## Learn More
27
106
 
28
107
  - [AgentForge Documentation](https://github.com/Agentic-Engineering-Agency/agentforge)
29
- - [Mastra Documentation](https://mastra.ai/docs)
30
- - [Convex Documentation](https://docs.convex.dev)
108
+ - [CLI Reference](https://github.com/Agentic-Engineering-Agency/agentforge/blob/main/docs/cli-reference.md)
109
+ - [Convex Docs](https://docs.convex.dev)
110
+ - [Mastra Docs](https://mastra.ai/docs)