@octavus/cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import "dotenv
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
|
|
7
7
|
// src/config.ts
|
|
@@ -583,8 +583,11 @@ function handleError4(err, options) {
|
|
|
583
583
|
}
|
|
584
584
|
|
|
585
585
|
// src/index.ts
|
|
586
|
+
var envIndex = process.argv.indexOf("--env");
|
|
587
|
+
var envFile = envIndex !== -1 && process.argv[envIndex + 1] ? process.argv[envIndex + 1] : ".env";
|
|
588
|
+
dotenv.config({ path: envFile });
|
|
586
589
|
var program = new Command();
|
|
587
|
-
program.name("octavus").description("CLI for validating and syncing Octavus agent definitions").version("0.1.0");
|
|
590
|
+
program.name("octavus").description("CLI for validating and syncing Octavus agent definitions").version("0.1.0").option("--env <file>", "Load environment from a specific file", ".env");
|
|
588
591
|
registerValidateCommand(program);
|
|
589
592
|
registerSyncCommand(program);
|
|
590
593
|
registerListCommand(program);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/agent-files.ts","../src/api.ts","../src/output.ts","../src/commands/validate.ts","../src/commands/sync.ts","../src/commands/list.ts","../src/commands/get.ts"],"sourcesContent":["/**\n * Octavus CLI - Validate and sync agent definitions\n *\n * Commands:\n * octavus validate <path> - Validate agent definition (dry-run)\n * octavus sync <path> - Sync agent to platform (creates or updates)\n * octavus list - List all agents in the project\n * octavus get <slug> - Get agent details by slug\n *\n * Environment:\n * OCTAVUS_CLI_API_KEY - API key with agent management permissions\n * OCTAVUS_API_KEY - Fallback API key\n * OCTAVUS_API_URL - Optional, defaults to https://octavus.ai\n */\n\n// Load .env file from current working directory\nimport 'dotenv/config';\n\nimport { Command } from 'commander';\nimport { registerValidateCommand } from '@/commands/validate.js';\nimport { registerSyncCommand } from '@/commands/sync.js';\nimport { registerListCommand } from '@/commands/list.js';\nimport { registerGetCommand } from '@/commands/get.js';\n\nconst program = new Command();\n\nprogram\n .name('octavus')\n .description('CLI for validating and syncing Octavus agent definitions')\n .version('0.1.0');\n\n// Register commands\nregisterValidateCommand(program);\nregisterSyncCommand(program);\nregisterListCommand(program);\nregisterGetCommand(program);\n\n// Parse and run\nprogram.parse();\n","/**\n * Configuration loading for the CLI.\n * Handles environment variables and defaults.\n */\n\nexport interface CliConfig {\n apiKey: string;\n baseUrl: string;\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load CLI configuration from environment variables.\n * API key resolution: OCTAVUS_CLI_API_KEY > OCTAVUS_API_KEY\n */\nexport function loadConfig(): CliConfig {\n const apiKey = process.env.OCTAVUS_CLI_API_KEY ?? process.env.OCTAVUS_API_KEY;\n\n if (!apiKey) {\n throw new ConfigError(\n 'No API key found. Set OCTAVUS_CLI_API_KEY or OCTAVUS_API_KEY environment variable.',\n );\n }\n\n const baseUrl = process.env.OCTAVUS_API_URL ?? 'https://octavus.ai';\n\n return { apiKey, baseUrl };\n}\n","/**\n * Agent file reading from filesystem.\n * Reads settings.json, protocol.yaml, and prompts/*.md files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\n\n/** Agent settings from settings.json */\nexport interface AgentSettings {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'generation';\n}\n\n/** Agent prompt from prompts/*.md */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/** Complete agent definition read from filesystem */\nexport interface AgentDefinition {\n settings: AgentSettings;\n protocol: string;\n prompts: AgentPrompt[];\n}\n\nconst agentSettingsSchema = z.object({\n slug: z.string().min(1, 'Slug is required'),\n name: z.string().min(1, 'Name is required'),\n description: z.string().optional(),\n format: z.enum(['interactive', 'generation']),\n});\n\nexport class AgentFileError extends Error {\n constructor(\n message: string,\n public readonly filePath?: string,\n ) {\n super(message);\n this.name = 'AgentFileError';\n }\n}\n\n/**\n * Read agent definition from a directory.\n * Expects:\n * - settings.json (required)\n * - protocol.yaml (required)\n * - prompts/*.md (optional)\n */\nexport async function readAgentDefinition(agentPath: string): Promise<AgentDefinition> {\n const resolvedPath = path.resolve(agentPath);\n\n // Check if directory exists\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new AgentFileError(`Not a directory: ${resolvedPath}`);\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError(`Directory not found: ${resolvedPath}`);\n }\n throw err;\n }\n\n // Read settings.json\n const settingsPath = path.join(resolvedPath, 'settings.json');\n const settings = await readSettings(settingsPath);\n\n // Read protocol.yaml\n const protocolPath = path.join(resolvedPath, 'protocol.yaml');\n const protocol = await readProtocol(protocolPath);\n\n // Read prompts\n const promptsPath = path.join(resolvedPath, 'prompts');\n const prompts = await readPrompts(promptsPath);\n\n return { settings, protocol, prompts };\n}\n\nasync function readSettings(filePath: string): Promise<AgentSettings> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const json: unknown = JSON.parse(content);\n const result = agentSettingsSchema.safeParse(json);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(`Invalid settings.json: ${issues}`, filePath);\n }\n\n return result.data;\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('settings.json not found', filePath);\n }\n if (err instanceof SyntaxError) {\n throw new AgentFileError(`Invalid JSON in settings.json: ${err.message}`, filePath);\n }\n throw err;\n }\n}\n\nasync function readProtocol(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('protocol.yaml not found', filePath);\n }\n throw err;\n }\n}\n\nasync function readPrompts(promptsDir: string): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const files = await fs.readdir(promptsDir);\n\n for (const file of files) {\n if (file.endsWith('.md')) {\n const name = file.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, file), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\n // No prompts directory is fine\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return prompts;\n}\n","/**\n * API client for the CLI.\n * Thin wrapper around fetch for Octavus platform API calls.\n */\n\nimport { z } from 'zod';\nimport type { CliConfig } from '@/config.js';\nimport type { AgentDefinition } from '@/agent-files.js';\n\n/** API error response */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Agent summary from list endpoint */\nexport interface Agent {\n slug: string;\n id: string;\n name: string;\n description: string | null;\n format: string;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/** Full agent definition from get endpoint */\nexport interface AgentDetails {\n settings: {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'generation';\n };\n protocol: string;\n prompts: { name: string; content: string }[];\n id: string;\n}\n\n/** Validation error detail */\nexport interface ValidationErrorDetail {\n message: string;\n path?: string;\n severity: 'error' | 'warning';\n}\n\n/** Validation result from validate endpoint */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationErrorDetail[];\n warnings: ValidationErrorDetail[];\n}\n\n/** Sync result from create/update endpoints */\nexport interface SyncResult {\n agentId: string;\n created: boolean;\n}\n\n// Response schemas for validation\nconst agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nconst agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nconst agentDefinitionSchema = z.object({\n settings: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().optional(),\n format: z.enum(['interactive', 'generation']),\n }),\n protocol: z.string(),\n prompts: z.array(z.object({ name: z.string(), content: z.string() })),\n id: z.string(),\n});\n\nconst validationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n warnings: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n});\n\nconst createResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst updateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nexport class CliApi {\n constructor(private readonly config: CliConfig) {}\n\n /** List all agents in the project */\n async listAgents(): Promise<Agent[]> {\n const response = await this.request('GET', '/api/agents');\n const data = agentsResponseSchema.parse(response);\n return data.agents;\n }\n\n /** Get agent by slug */\n async getAgent(slug: string): Promise<AgentDetails | null> {\n try {\n const response = await this.request('GET', `/api/agents/${slug}?by=slug`);\n return agentDefinitionSchema.parse(response);\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n /** Validate agent definition (dry-run) */\n async validateAgent(definition: AgentDefinition): Promise<ValidationResult> {\n const response = await this.request('POST', '/api/agents/validate', definition);\n return validationResultSchema.parse(response);\n }\n\n /** Create a new agent */\n async createAgent(definition: AgentDefinition): Promise<string> {\n const response = await this.request('POST', '/api/agents', definition);\n const data = createResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Update an existing agent by slug */\n async updateAgent(slug: string, definition: AgentDefinition): Promise<string> {\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n protocol: definition.protocol,\n prompts: definition.prompts,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Sync agent (create or update) */\n async syncAgent(definition: AgentDefinition): Promise<SyncResult> {\n const existing = await this.getAgent(definition.settings.slug);\n\n if (existing) {\n const agentId = await this.updateAgent(definition.settings.slug, definition);\n return { agentId, created: false };\n }\n\n const agentId = await this.createAgent(definition);\n return { agentId, created: true };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n if (isJson) {\n const errorData = (await response.json()) as { error?: string; code?: string };\n throw new ApiError(\n errorData.error ?? `Request failed with status ${response.status}`,\n response.status,\n errorData.code,\n );\n }\n throw new ApiError(`Request failed with status ${response.status}`, response.status);\n }\n\n if (!isJson) {\n throw new ApiError('Expected JSON response', response.status);\n }\n\n return await response.json();\n }\n}\n","/* eslint-disable no-console */\n/**\n * Terminal output utilities with colors and formatting.\n * Console statements are intentional for CLI output.\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\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 gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n};\n\nexport function success(message: string): void {\n console.log(`${colors.green}✓${colors.reset} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${colors.red}✗${colors.reset} ${message}`);\n}\n\nexport function warning(message: string): void {\n console.log(`${colors.yellow}⚠${colors.reset} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${colors.blue}ℹ${colors.reset} ${message}`);\n}\n\nexport function dim(message: string): void {\n console.log(`${colors.gray}${message}${colors.reset}`);\n}\n\nexport function bold(text: string): string {\n return `${colors.bold}${text}${colors.reset}`;\n}\n\nexport function cyan(text: string): string {\n return `${colors.cyan}${text}${colors.reset}`;\n}\n\nexport function green(text: string): string {\n return `${colors.green}${text}${colors.reset}`;\n}\n\nexport function yellow(text: string): string {\n return `${colors.yellow}${text}${colors.reset}`;\n}\n\nexport function red(text: string): string {\n return `${colors.red}${text}${colors.reset}`;\n}\n\nexport function gray(text: string): string {\n return `${colors.gray}${text}${colors.reset}`;\n}\n\n/**\n * Print a key-value pair with formatting\n */\nexport function keyValue(key: string, value: string): void {\n console.log(` ${colors.gray}${key}:${colors.reset} ${value}`);\n}\n\n/**\n * Print a table row\n */\nexport function tableRow(columns: string[], widths: number[]): void {\n const formatted = columns.map((col, i) => col.padEnd(widths[i] ?? 20)).join(' ');\n console.log(formatted);\n}\n\n/**\n * Print a separator line\n */\nexport function separator(): void {\n console.log();\n}\n\n/**\n * JSON output mode for CI/CD\n */\nexport function json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","/**\n * octavus validate <path>\n * Validate agent definition via API (dry-run, no changes saved)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ValidateOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate <path>')\n .description('Validate agent definition (dry-run, no changes saved)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: ValidateOptions) => {\n try {\n await runValidate(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runValidate(agentPath: string, options: ValidateOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Validating ${output.bold(definition.settings.slug)}...`);\n }\n\n // Validate via API\n const result = await api.validateAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n });\n } else {\n if (result.valid) {\n output.success(`Agent ${output.bold(definition.settings.slug)} is valid`);\n } else {\n output.error(`Agent ${output.bold(definition.settings.slug)} has validation errors`);\n }\n\n // Show errors\n for (const err of result.errors) {\n const location = err.path ? ` (${output.gray(err.path)})` : '';\n output.error(` ${err.message}${location}`);\n }\n\n // Show warnings\n for (const warn of result.warnings) {\n const location = warn.path ? ` (${output.gray(warn.path)})` : '';\n output.warning(` ${warn.message}${location}`);\n }\n }\n\n // Exit with error code if validation failed\n if (!result.valid) {\n process.exit(1);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ValidateOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus sync <path>\n * Sync agent to platform (creates or updates)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface SyncOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync <path>')\n .description('Sync agent to platform (creates or updates)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: SyncOptions) => {\n try {\n await runSync(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runSync(agentPath: string, options: SyncOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Syncing ${output.bold(definition.settings.slug)}...`);\n }\n\n // Sync to platform\n const result = await api.syncAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n agentId: result.agentId,\n created: result.created,\n });\n } else {\n const action = result.created ? 'Created' : 'Updated';\n output.success(`${action}: ${output.bold(definition.settings.slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: SyncOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus list\n * List all agents in the project\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ListOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all agents in the project')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (options: ListOptions) => {\n try {\n await runList(options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runList(options: ListOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agents = await api.listAgents();\n\n if (options.json) {\n output.json({ agents });\n return;\n }\n\n if (agents.length === 0) {\n output.info('No agents found');\n return;\n }\n\n // Print header\n output.separator();\n output.tableRow(\n [output.bold('SLUG'), output.bold('NAME'), output.bold('FORMAT'), output.bold('ID')],\n [20, 30, 12, 36],\n );\n output.dim('─'.repeat(100));\n\n // Print agents\n for (const agent of agents) {\n output.tableRow([agent.slug, agent.name, agent.format, agent.id], [20, 30, 12, 36]);\n }\n\n output.separator();\n output.dim(`${agents.length} agent(s)`);\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ListOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus get <slug>\n * Get agent details by slug\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface GetOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerGetCommand(program: Command): void {\n program\n .command('get <slug>')\n .description('Get agent details by slug')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: GetOptions) => {\n try {\n await runGet(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runGet(slug: string, options: GetOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agent = await api.getAgent(slug);\n\n if (!agent) {\n if (options.json) {\n output.json({ error: `Agent not found: ${slug}`, code: 'NOT_FOUND' });\n } else {\n output.error(`Agent not found: ${slug}`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n output.json(agent);\n return;\n }\n\n // Print agent details\n output.separator();\n output.success(`Agent: ${output.bold(agent.settings.name)}`);\n output.separator();\n output.keyValue('Slug', agent.settings.slug);\n output.keyValue('ID', agent.id);\n output.keyValue('Format', agent.settings.format);\n if (agent.settings.description) {\n output.keyValue('Description', agent.settings.description);\n }\n output.separator();\n output.keyValue(\n 'Prompts',\n agent.prompts.length > 0 ? agent.prompts.map((p) => p.name).join(', ') : '(none)',\n );\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: GetOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n"],"mappings":"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","names":["json","z","agentId","path","program","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/agent-files.ts","../src/api.ts","../src/output.ts","../src/commands/validate.ts","../src/commands/sync.ts","../src/commands/list.ts","../src/commands/get.ts"],"sourcesContent":["/**\n * Octavus CLI - Validate and sync agent definitions\n *\n * Commands:\n * octavus validate <path> - Validate agent definition (dry-run)\n * octavus sync <path> - Sync agent to platform (creates or updates)\n * octavus list - List all agents in the project\n * octavus get <slug> - Get agent details by slug\n *\n * Global Options:\n * --env <file> - Load environment from a specific file (default: .env)\n *\n * Environment:\n * OCTAVUS_CLI_API_KEY - API key with agent management permissions\n * OCTAVUS_API_KEY - Fallback API key\n * OCTAVUS_API_URL - Optional, defaults to https://octavus.ai\n */\n\nimport dotenv from 'dotenv';\nimport { Command } from 'commander';\nimport { registerValidateCommand } from '@/commands/validate.js';\nimport { registerSyncCommand } from '@/commands/sync.js';\nimport { registerListCommand } from '@/commands/list.js';\nimport { registerGetCommand } from '@/commands/get.js';\n\n// Pre-parse to extract --env option before loading environment\nconst envIndex = process.argv.indexOf('--env');\nconst envFile = envIndex !== -1 && process.argv[envIndex + 1] ? process.argv[envIndex + 1] : '.env';\n\n// Load environment file\ndotenv.config({ path: envFile });\n\nconst program = new Command();\n\nprogram\n .name('octavus')\n .description('CLI for validating and syncing Octavus agent definitions')\n .version('0.1.0')\n .option('--env <file>', 'Load environment from a specific file', '.env');\n\n// Register commands\nregisterValidateCommand(program);\nregisterSyncCommand(program);\nregisterListCommand(program);\nregisterGetCommand(program);\n\n// Parse and run\nprogram.parse();\n","/**\n * Configuration loading for the CLI.\n * Handles environment variables and defaults.\n */\n\nexport interface CliConfig {\n apiKey: string;\n baseUrl: string;\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load CLI configuration from environment variables.\n * API key resolution: OCTAVUS_CLI_API_KEY > OCTAVUS_API_KEY\n */\nexport function loadConfig(): CliConfig {\n const apiKey = process.env.OCTAVUS_CLI_API_KEY ?? process.env.OCTAVUS_API_KEY;\n\n if (!apiKey) {\n throw new ConfigError(\n 'No API key found. Set OCTAVUS_CLI_API_KEY or OCTAVUS_API_KEY environment variable.',\n );\n }\n\n const baseUrl = process.env.OCTAVUS_API_URL ?? 'https://octavus.ai';\n\n return { apiKey, baseUrl };\n}\n","/**\n * Agent file reading from filesystem.\n * Reads settings.json, protocol.yaml, and prompts/*.md files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\n\n/** Agent settings from settings.json */\nexport interface AgentSettings {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'generation';\n}\n\n/** Agent prompt from prompts/*.md */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/** Complete agent definition read from filesystem */\nexport interface AgentDefinition {\n settings: AgentSettings;\n protocol: string;\n prompts: AgentPrompt[];\n}\n\nconst agentSettingsSchema = z.object({\n slug: z.string().min(1, 'Slug is required'),\n name: z.string().min(1, 'Name is required'),\n description: z.string().optional(),\n format: z.enum(['interactive', 'generation']),\n});\n\nexport class AgentFileError extends Error {\n constructor(\n message: string,\n public readonly filePath?: string,\n ) {\n super(message);\n this.name = 'AgentFileError';\n }\n}\n\n/**\n * Read agent definition from a directory.\n * Expects:\n * - settings.json (required)\n * - protocol.yaml (required)\n * - prompts/*.md (optional)\n */\nexport async function readAgentDefinition(agentPath: string): Promise<AgentDefinition> {\n const resolvedPath = path.resolve(agentPath);\n\n // Check if directory exists\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new AgentFileError(`Not a directory: ${resolvedPath}`);\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError(`Directory not found: ${resolvedPath}`);\n }\n throw err;\n }\n\n // Read settings.json\n const settingsPath = path.join(resolvedPath, 'settings.json');\n const settings = await readSettings(settingsPath);\n\n // Read protocol.yaml\n const protocolPath = path.join(resolvedPath, 'protocol.yaml');\n const protocol = await readProtocol(protocolPath);\n\n // Read prompts\n const promptsPath = path.join(resolvedPath, 'prompts');\n const prompts = await readPrompts(promptsPath);\n\n return { settings, protocol, prompts };\n}\n\nasync function readSettings(filePath: string): Promise<AgentSettings> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const json: unknown = JSON.parse(content);\n const result = agentSettingsSchema.safeParse(json);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(`Invalid settings.json: ${issues}`, filePath);\n }\n\n return result.data;\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('settings.json not found', filePath);\n }\n if (err instanceof SyntaxError) {\n throw new AgentFileError(`Invalid JSON in settings.json: ${err.message}`, filePath);\n }\n throw err;\n }\n}\n\nasync function readProtocol(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('protocol.yaml not found', filePath);\n }\n throw err;\n }\n}\n\nasync function readPrompts(promptsDir: string): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const files = await fs.readdir(promptsDir);\n\n for (const file of files) {\n if (file.endsWith('.md')) {\n const name = file.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, file), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\n // No prompts directory is fine\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return prompts;\n}\n","/**\n * API client for the CLI.\n * Thin wrapper around fetch for Octavus platform API calls.\n */\n\nimport { z } from 'zod';\nimport type { CliConfig } from '@/config.js';\nimport type { AgentDefinition } from '@/agent-files.js';\n\n/** API error response */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Agent summary from list endpoint */\nexport interface Agent {\n slug: string;\n id: string;\n name: string;\n description: string | null;\n format: string;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/** Full agent definition from get endpoint */\nexport interface AgentDetails {\n settings: {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'generation';\n };\n protocol: string;\n prompts: { name: string; content: string }[];\n id: string;\n}\n\n/** Validation error detail */\nexport interface ValidationErrorDetail {\n message: string;\n path?: string;\n severity: 'error' | 'warning';\n}\n\n/** Validation result from validate endpoint */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationErrorDetail[];\n warnings: ValidationErrorDetail[];\n}\n\n/** Sync result from create/update endpoints */\nexport interface SyncResult {\n agentId: string;\n created: boolean;\n}\n\n// Response schemas for validation\nconst agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nconst agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nconst agentDefinitionSchema = z.object({\n settings: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().optional(),\n format: z.enum(['interactive', 'generation']),\n }),\n protocol: z.string(),\n prompts: z.array(z.object({ name: z.string(), content: z.string() })),\n id: z.string(),\n});\n\nconst validationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n warnings: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n});\n\nconst createResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst updateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nexport class CliApi {\n constructor(private readonly config: CliConfig) {}\n\n /** List all agents in the project */\n async listAgents(): Promise<Agent[]> {\n const response = await this.request('GET', '/api/agents');\n const data = agentsResponseSchema.parse(response);\n return data.agents;\n }\n\n /** Get agent by slug */\n async getAgent(slug: string): Promise<AgentDetails | null> {\n try {\n const response = await this.request('GET', `/api/agents/${slug}?by=slug`);\n return agentDefinitionSchema.parse(response);\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n /** Validate agent definition (dry-run) */\n async validateAgent(definition: AgentDefinition): Promise<ValidationResult> {\n const response = await this.request('POST', '/api/agents/validate', definition);\n return validationResultSchema.parse(response);\n }\n\n /** Create a new agent */\n async createAgent(definition: AgentDefinition): Promise<string> {\n const response = await this.request('POST', '/api/agents', definition);\n const data = createResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Update an existing agent by slug */\n async updateAgent(slug: string, definition: AgentDefinition): Promise<string> {\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n protocol: definition.protocol,\n prompts: definition.prompts,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Sync agent (create or update) */\n async syncAgent(definition: AgentDefinition): Promise<SyncResult> {\n const existing = await this.getAgent(definition.settings.slug);\n\n if (existing) {\n const agentId = await this.updateAgent(definition.settings.slug, definition);\n return { agentId, created: false };\n }\n\n const agentId = await this.createAgent(definition);\n return { agentId, created: true };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n if (isJson) {\n const errorData = (await response.json()) as { error?: string; code?: string };\n throw new ApiError(\n errorData.error ?? `Request failed with status ${response.status}`,\n response.status,\n errorData.code,\n );\n }\n throw new ApiError(`Request failed with status ${response.status}`, response.status);\n }\n\n if (!isJson) {\n throw new ApiError('Expected JSON response', response.status);\n }\n\n return await response.json();\n }\n}\n","/* eslint-disable no-console */\n/**\n * Terminal output utilities with colors and formatting.\n * Console statements are intentional for CLI output.\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\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 gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n};\n\nexport function success(message: string): void {\n console.log(`${colors.green}✓${colors.reset} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${colors.red}✗${colors.reset} ${message}`);\n}\n\nexport function warning(message: string): void {\n console.log(`${colors.yellow}⚠${colors.reset} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${colors.blue}ℹ${colors.reset} ${message}`);\n}\n\nexport function dim(message: string): void {\n console.log(`${colors.gray}${message}${colors.reset}`);\n}\n\nexport function bold(text: string): string {\n return `${colors.bold}${text}${colors.reset}`;\n}\n\nexport function cyan(text: string): string {\n return `${colors.cyan}${text}${colors.reset}`;\n}\n\nexport function green(text: string): string {\n return `${colors.green}${text}${colors.reset}`;\n}\n\nexport function yellow(text: string): string {\n return `${colors.yellow}${text}${colors.reset}`;\n}\n\nexport function red(text: string): string {\n return `${colors.red}${text}${colors.reset}`;\n}\n\nexport function gray(text: string): string {\n return `${colors.gray}${text}${colors.reset}`;\n}\n\n/**\n * Print a key-value pair with formatting\n */\nexport function keyValue(key: string, value: string): void {\n console.log(` ${colors.gray}${key}:${colors.reset} ${value}`);\n}\n\n/**\n * Print a table row\n */\nexport function tableRow(columns: string[], widths: number[]): void {\n const formatted = columns.map((col, i) => col.padEnd(widths[i] ?? 20)).join(' ');\n console.log(formatted);\n}\n\n/**\n * Print a separator line\n */\nexport function separator(): void {\n console.log();\n}\n\n/**\n * JSON output mode for CI/CD\n */\nexport function json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","/**\n * octavus validate <path>\n * Validate agent definition via API (dry-run, no changes saved)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ValidateOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate <path>')\n .description('Validate agent definition (dry-run, no changes saved)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: ValidateOptions) => {\n try {\n await runValidate(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runValidate(agentPath: string, options: ValidateOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Validating ${output.bold(definition.settings.slug)}...`);\n }\n\n // Validate via API\n const result = await api.validateAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n });\n } else {\n if (result.valid) {\n output.success(`Agent ${output.bold(definition.settings.slug)} is valid`);\n } else {\n output.error(`Agent ${output.bold(definition.settings.slug)} has validation errors`);\n }\n\n // Show errors\n for (const err of result.errors) {\n const location = err.path ? ` (${output.gray(err.path)})` : '';\n output.error(` ${err.message}${location}`);\n }\n\n // Show warnings\n for (const warn of result.warnings) {\n const location = warn.path ? ` (${output.gray(warn.path)})` : '';\n output.warning(` ${warn.message}${location}`);\n }\n }\n\n // Exit with error code if validation failed\n if (!result.valid) {\n process.exit(1);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ValidateOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus sync <path>\n * Sync agent to platform (creates or updates)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface SyncOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync <path>')\n .description('Sync agent to platform (creates or updates)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: SyncOptions) => {\n try {\n await runSync(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runSync(agentPath: string, options: SyncOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Syncing ${output.bold(definition.settings.slug)}...`);\n }\n\n // Sync to platform\n const result = await api.syncAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n agentId: result.agentId,\n created: result.created,\n });\n } else {\n const action = result.created ? 'Created' : 'Updated';\n output.success(`${action}: ${output.bold(definition.settings.slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: SyncOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus list\n * List all agents in the project\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ListOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all agents in the project')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (options: ListOptions) => {\n try {\n await runList(options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runList(options: ListOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agents = await api.listAgents();\n\n if (options.json) {\n output.json({ agents });\n return;\n }\n\n if (agents.length === 0) {\n output.info('No agents found');\n return;\n }\n\n // Print header\n output.separator();\n output.tableRow(\n [output.bold('SLUG'), output.bold('NAME'), output.bold('FORMAT'), output.bold('ID')],\n [20, 30, 12, 36],\n );\n output.dim('─'.repeat(100));\n\n // Print agents\n for (const agent of agents) {\n output.tableRow([agent.slug, agent.name, agent.format, agent.id], [20, 30, 12, 36]);\n }\n\n output.separator();\n output.dim(`${agents.length} agent(s)`);\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ListOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus get <slug>\n * Get agent details by slug\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface GetOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerGetCommand(program: Command): void {\n program\n .command('get <slug>')\n .description('Get agent details by slug')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: GetOptions) => {\n try {\n await runGet(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runGet(slug: string, options: GetOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agent = await api.getAgent(slug);\n\n if (!agent) {\n if (options.json) {\n output.json({ error: `Agent not found: ${slug}`, code: 'NOT_FOUND' });\n } else {\n output.error(`Agent not found: ${slug}`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n output.json(agent);\n return;\n }\n\n // Print agent details\n output.separator();\n output.success(`Agent: ${output.bold(agent.settings.name)}`);\n output.separator();\n output.keyValue('Slug', agent.settings.slug);\n output.keyValue('ID', agent.id);\n output.keyValue('Format', agent.settings.format);\n if (agent.settings.description) {\n output.keyValue('Description', agent.settings.description);\n }\n output.separator();\n output.keyValue(\n 'Prompts',\n agent.prompts.length > 0 ? agent.prompts.map((p) => p.name).join(', ') : '(none)',\n );\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: GetOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n"],"mappings":"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","names":["json","z","agentId","path","program","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode"]}
|