@octavus/cli 2.11.0 → 2.13.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 CHANGED
@@ -26,6 +26,7 @@ function loadConfig() {
26
26
  import fs from "fs/promises";
27
27
  import path from "path";
28
28
  import { z } from "zod";
29
+ import { parse as parseYaml } from "yaml";
29
30
  var agentSettingsSchema = z.object({
30
31
  slug: z.string().min(1, "Slug is required"),
31
32
  name: z.string().min(1, "Name is required"),
@@ -58,7 +59,9 @@ async function readAgentDefinition(agentPath) {
58
59
  const protocol = await readProtocol(protocolPath);
59
60
  const promptsPath = path.join(resolvedPath, "prompts");
60
61
  const prompts = await readPrompts(promptsPath);
61
- return { settings, protocol, prompts };
62
+ const referencesPath = path.join(resolvedPath, "references");
63
+ const references = await readReferences(referencesPath);
64
+ return { settings, protocol, prompts, references };
62
65
  }
63
66
  async function readSettings(filePath) {
64
67
  try {
@@ -112,6 +115,47 @@ async function readPrompts(promptsDir, relativePath = "") {
112
115
  }
113
116
  return prompts;
114
117
  }
118
+ var FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
119
+ var referenceFrontmatterSchema = z.object({
120
+ description: z.string().min(1, "Description is required")
121
+ });
122
+ async function readReferences(referencesDir) {
123
+ const references = [];
124
+ try {
125
+ const entries = await fs.readdir(referencesDir, { withFileTypes: true });
126
+ for (const entry of entries) {
127
+ if (!entry.isFile() || !entry.name.endsWith(".md")) continue;
128
+ const name = entry.name.replace(/\.md$/, "");
129
+ const raw = await fs.readFile(path.join(referencesDir, entry.name), "utf-8");
130
+ const match = FRONTMATTER_REGEX.exec(raw);
131
+ if (!match) {
132
+ throw new AgentFileError(
133
+ `Reference "${name}" is missing YAML frontmatter (---description: ...---)`,
134
+ path.join(referencesDir, entry.name)
135
+ );
136
+ }
137
+ const frontmatter = parseYaml(match[1]);
138
+ const result = referenceFrontmatterSchema.safeParse(frontmatter);
139
+ if (!result.success) {
140
+ const issues = result.error.issues.map((i) => i.message).join(", ");
141
+ throw new AgentFileError(
142
+ `Invalid frontmatter in reference "${name}": ${issues}`,
143
+ path.join(referencesDir, entry.name)
144
+ );
145
+ }
146
+ references.push({
147
+ name,
148
+ description: result.data.description,
149
+ content: match[2].trim()
150
+ });
151
+ }
152
+ } catch (err) {
153
+ if (err.code !== "ENOENT") {
154
+ throw err;
155
+ }
156
+ }
157
+ return references;
158
+ }
115
159
 
116
160
  // src/api.ts
117
161
  import { z as z2 } from "zod";
@@ -145,6 +189,7 @@ var agentDefinitionSchema = z2.object({
145
189
  }),
146
190
  protocol: z2.string(),
147
191
  prompts: z2.array(z2.object({ name: z2.string(), content: z2.string() })),
192
+ references: z2.array(z2.object({ name: z2.string(), description: z2.string(), content: z2.string() })).default([]),
148
193
  id: z2.string()
149
194
  });
150
195
  var validationResultSchema = z2.object({
@@ -215,7 +260,8 @@ var CliApi = class {
215
260
  const response = await this.request("PATCH", `/api/agents/${slug}?by=slug`, {
216
261
  settings,
217
262
  protocol: definition.protocol,
218
- prompts: definition.prompts
263
+ prompts: definition.prompts,
264
+ references: definition.references
219
265
  });
220
266
  const data = updateResponseSchema.parse(response);
221
267
  return data.agentId;
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","../src/commands/archive.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 * octavus archive <slug> - Archive an agent (soft delete)\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';\nimport { registerArchiveCommand } from '@/commands/archive.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);\nregisterArchiveCommand(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' | 'worker';\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', 'worker']),\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, supports nested directories)\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, relativePath = ''): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const entries = await fs.readdir(promptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const subPrompts = await readPrompts(path.join(promptsDir, entry.name), entryRelativePath);\n prompts.push(...subPrompts);\n } else if (entry.name.endsWith('.md')) {\n const name = entryRelativePath.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, entry.name), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\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' | 'worker';\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/** Archive result from delete endpoint */\nexport interface ArchiveResult {\n agentId: string;\n message: string;\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', 'worker']),\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\nconst archiveResponseSchema = 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 // Exclude slug from settings (it's the identifier in the URL)\n const { slug: _slug, ...settings } = definition.settings;\n\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n settings,\n protocol: definition.protocol,\n prompts: definition.prompts,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Archive an agent by slug */\n async archiveAgent(slug: string): Promise<ArchiveResult> {\n const response = await this.request('DELETE', `/api/agents/${slug}?by=slug`);\n return archiveResponseSchema.parse(response);\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","/**\n * octavus archive <slug>\n * Archive an agent (soft delete)\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 ArchiveOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerArchiveCommand(program: Command): void {\n program\n .command('archive <slug>')\n .description('Archive an agent (soft delete)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: ArchiveOptions) => {\n try {\n await runArchive(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runArchive(slug: string, options: ArchiveOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n if (!options.quiet && !options.json) {\n output.info(`Archiving ${output.bold(slug)}...`);\n }\n\n const result = await api.archiveAgent(slug);\n\n if (options.json) {\n output.json({\n slug,\n agentId: result.agentId,\n archived: true,\n });\n } else {\n output.success(`Archived: ${output.bold(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 ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ArchiveOptions): 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","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","../src/commands/archive.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 * octavus archive <slug> - Archive an agent (soft delete)\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';\nimport { registerArchiveCommand } from '@/commands/archive.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);\nregisterArchiveCommand(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, prompts/*.md, and references/*.md files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { parse as parseYaml } from 'yaml';\n\n/** Agent settings from settings.json */\nexport interface AgentSettings {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'worker';\n}\n\n/** Agent prompt from prompts/*.md */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/** Agent reference from references/*.md */\nexport interface AgentReference {\n name: string;\n description: 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 references: AgentReference[];\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', 'worker']),\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, supports nested directories)\n * - references/*.md (optional, YAML frontmatter with description)\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 // Read references\n const referencesPath = path.join(resolvedPath, 'references');\n const references = await readReferences(referencesPath);\n\n return { settings, protocol, prompts, references };\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, relativePath = ''): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const entries = await fs.readdir(promptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const subPrompts = await readPrompts(path.join(promptsDir, entry.name), entryRelativePath);\n prompts.push(...subPrompts);\n } else if (entry.name.endsWith('.md')) {\n const name = entryRelativePath.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, entry.name), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return prompts;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nconst referenceFrontmatterSchema = z.object({\n description: z.string().min(1, 'Description is required'),\n});\n\nasync function readReferences(referencesDir: string): Promise<AgentReference[]> {\n const references: AgentReference[] = [];\n\n try {\n const entries = await fs.readdir(referencesDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md')) continue;\n\n const name = entry.name.replace(/\\.md$/, '');\n const raw = await fs.readFile(path.join(referencesDir, entry.name), 'utf-8');\n const match = FRONTMATTER_REGEX.exec(raw);\n\n if (!match) {\n throw new AgentFileError(\n `Reference \"${name}\" is missing YAML frontmatter (---description: ...---)`,\n path.join(referencesDir, entry.name),\n );\n }\n\n const frontmatter = parseYaml(match[1]!) as unknown;\n const result = referenceFrontmatterSchema.safeParse(frontmatter);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(\n `Invalid frontmatter in reference \"${name}\": ${issues}`,\n path.join(referencesDir, entry.name),\n );\n }\n\n references.push({\n name,\n description: result.data.description,\n content: match[2]!.trim(),\n });\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return references;\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' | 'worker';\n };\n protocol: string;\n prompts: { name: string; content: string }[];\n references: { name: string; description: 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/** Archive result from delete endpoint */\nexport interface ArchiveResult {\n agentId: string;\n message: string;\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', 'worker']),\n }),\n protocol: z.string(),\n prompts: z.array(z.object({ name: z.string(), content: z.string() })),\n references: z\n .array(z.object({ name: z.string(), description: z.string(), content: z.string() }))\n .default([]),\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\nconst archiveResponseSchema = 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 // Exclude slug from settings (it's the identifier in the URL)\n const { slug: _slug, ...settings } = definition.settings;\n\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n settings,\n protocol: definition.protocol,\n prompts: definition.prompts,\n references: definition.references,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Archive an agent by slug */\n async archiveAgent(slug: string): Promise<ArchiveResult> {\n const response = await this.request('DELETE', `/api/agents/${slug}?by=slug`);\n return archiveResponseSchema.parse(response);\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","/**\n * octavus archive <slug>\n * Archive an agent (soft delete)\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 ArchiveOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerArchiveCommand(program: Command): void {\n program\n .command('archive <slug>')\n .description('Archive an agent (soft delete)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: ArchiveOptions) => {\n try {\n await runArchive(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runArchive(slug: string, options: ArchiveOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n if (!options.quiet && !options.json) {\n output.info(`Archiving ${output.bold(slug)}...`);\n }\n\n const result = await api.archiveAgent(slug);\n\n if (options.json) {\n output.json({\n slug,\n agentId: result.agentId,\n archived: true,\n });\n } else {\n output.success(`Archived: ${output.bold(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 ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ArchiveOptions): 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","program","handleError","getErrorCode"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@octavus/cli",
3
- "version": "2.11.0",
3
+ "version": "2.13.0",
4
4
  "description": "CLI for validating and syncing Octavus agent definitions",
5
5
  "license": "MIT",
6
6
  "author": "Octavus AI <dev@octavus.ai>",
@@ -36,7 +36,7 @@
36
36
  "commander": "^13.1.0",
37
37
  "dotenv": "^16.6.1",
38
38
  "yaml": "^2.8.0",
39
- "zod": "^4.1.13"
39
+ "zod": "^4.3.5"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^22.0.0",