@octavus/cli 0.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,219 @@
1
+ # @octavus/cli
2
+
3
+ CLI for validating and syncing Octavus agent definitions.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @octavus/cli
9
+ ```
10
+
11
+ Or use with npx:
12
+
13
+ ```bash
14
+ npx @octavus/cli validate ./agents/support-chat
15
+ ```
16
+
17
+ ## Overview
18
+
19
+ The Octavus CLI provides commands for managing agent definitions from your local filesystem. Use it to:
20
+
21
+ - **Validate** agent definitions before deploying
22
+ - **Sync** agents to the Octavus platform
23
+ - **List** and **get** agent details
24
+
25
+ ## Configuration
26
+
27
+ The CLI reads configuration from environment variables:
28
+
29
+ | Variable | Description | Default |
30
+ | --------------------- | ----------------------------------------- | -------------------- |
31
+ | `OCTAVUS_CLI_API_KEY` | API key with agent management permissions | - |
32
+ | `OCTAVUS_API_KEY` | Fallback API key (if CLI key not set) | - |
33
+ | `OCTAVUS_API_URL` | Octavus platform URL | `https://octavus.ai` |
34
+
35
+ You can also specify an env file:
36
+
37
+ ```bash
38
+ octavus --env .env.production validate ./agents/support-chat
39
+ ```
40
+
41
+ ## Commands
42
+
43
+ ### validate
44
+
45
+ Validate an agent definition without making changes (dry-run).
46
+
47
+ ```bash
48
+ octavus validate <path>
49
+ ```
50
+
51
+ **Options:**
52
+
53
+ - `--json` - Output as JSON (for CI/CD pipelines)
54
+ - `--quiet` - Suppress non-essential output
55
+
56
+ **Example:**
57
+
58
+ ```bash
59
+ octavus validate ./agents/support-chat
60
+ # ✓ Agent support-chat is valid
61
+
62
+ octavus validate ./agents/support-chat --json
63
+ # { "slug": "support-chat", "valid": true, "errors": [], "warnings": [] }
64
+ ```
65
+
66
+ ### sync
67
+
68
+ Sync an agent to the platform (creates or updates).
69
+
70
+ ```bash
71
+ octavus sync <path>
72
+ ```
73
+
74
+ **Options:**
75
+
76
+ - `--json` - Output as JSON
77
+ - `--quiet` - Suppress non-essential output
78
+
79
+ **Example:**
80
+
81
+ ```bash
82
+ octavus sync ./agents/support-chat
83
+ # ℹ Reading agent from ./agents/support-chat...
84
+ # ℹ Syncing support-chat...
85
+ # ✓ Updated: support-chat
86
+ # Agent ID: agent_abc123
87
+ ```
88
+
89
+ ### list
90
+
91
+ List all agents in the project.
92
+
93
+ ```bash
94
+ octavus list
95
+ ```
96
+
97
+ **Options:**
98
+
99
+ - `--json` - Output as JSON
100
+ - `--quiet` - Suppress non-essential output
101
+
102
+ **Example:**
103
+
104
+ ```bash
105
+ octavus list
106
+ # SLUG NAME FORMAT ID
107
+ # ─────────────────────────────────────────────────────────────────────
108
+ # support-chat Support Chat interactive agent_abc123
109
+ # product-advisor Product Advisor interactive agent_def456
110
+ #
111
+ # 2 agent(s)
112
+ ```
113
+
114
+ ### get
115
+
116
+ Get agent details by slug.
117
+
118
+ ```bash
119
+ octavus get <slug>
120
+ ```
121
+
122
+ **Options:**
123
+
124
+ - `--json` - Output as JSON
125
+ - `--quiet` - Suppress non-essential output
126
+
127
+ **Example:**
128
+
129
+ ```bash
130
+ octavus get support-chat
131
+ # ✓ Agent: Support Chat
132
+ #
133
+ # Slug: support-chat
134
+ # ID: agent_abc123
135
+ # Format: interactive
136
+ # Description: Customer support agent with escalation
137
+ #
138
+ # Prompts: system, user-message, escalation-summary
139
+ ```
140
+
141
+ ## Agent Definition Structure
142
+
143
+ The CLI expects agent definitions in a specific directory structure:
144
+
145
+ ```
146
+ my-agent/
147
+ ├── settings.json # Required: Agent metadata
148
+ ├── protocol.yaml # Required: Agent logic
149
+ └── prompts/ # Optional: Prompt templates
150
+ ├── system.md
151
+ └── user-message.md
152
+ ```
153
+
154
+ ### settings.json
155
+
156
+ ```json
157
+ {
158
+ "slug": "support-chat",
159
+ "name": "Support Chat",
160
+ "description": "Customer support agent with escalation",
161
+ "format": "interactive"
162
+ }
163
+ ```
164
+
165
+ ### protocol.yaml
166
+
167
+ ```yaml
168
+ input:
169
+ COMPANY_NAME: { type: string }
170
+
171
+ triggers:
172
+ user-message:
173
+ input:
174
+ USER_MESSAGE: { type: string }
175
+
176
+ agent:
177
+ model: anthropic/claude-sonnet-4-5
178
+ system: system
179
+ input: [COMPANY_NAME]
180
+
181
+ handlers:
182
+ user-message:
183
+ Add user message:
184
+ block: add-message
185
+ role: user
186
+ prompt: user-message
187
+ input: [USER_MESSAGE]
188
+
189
+ Respond:
190
+ block: next-message
191
+ ```
192
+
193
+ ## CI/CD Integration
194
+
195
+ Use JSON output mode for CI/CD pipelines:
196
+
197
+ ```bash
198
+ # Validate in CI
199
+ octavus validate ./agents/support-chat --json
200
+ if [ $? -ne 0 ]; then
201
+ echo "Validation failed"
202
+ exit 1
203
+ fi
204
+
205
+ # Deploy to staging
206
+ OCTAVUS_API_URL=https://staging.octavus.ai octavus sync ./agents/support-chat --json
207
+ ```
208
+
209
+ ## Exit Codes
210
+
211
+ | Code | Description |
212
+ | ---- | ------------------------------------- |
213
+ | 0 | Success |
214
+ | 1 | Validation/sync error |
215
+ | 2 | Configuration error (missing API key) |
216
+
217
+ ## License
218
+
219
+ MIT
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ var agentSettingsSchema = z.object({
30
30
  slug: z.string().min(1, "Slug is required"),
31
31
  name: z.string().min(1, "Name is required"),
32
32
  description: z.string().optional(),
33
- format: z.enum(["interactive", "generation"])
33
+ format: z.enum(["interactive", "worker"])
34
34
  });
35
35
  var AgentFileError = class extends Error {
36
36
  constructor(message, filePath) {
@@ -137,7 +137,7 @@ var agentDefinitionSchema = z2.object({
137
137
  slug: z2.string(),
138
138
  name: z2.string(),
139
139
  description: z2.string().optional(),
140
- format: z2.enum(["interactive", "generation"])
140
+ format: z2.enum(["interactive", "worker"])
141
141
  }),
142
142
  protocol: z2.string(),
143
143
  prompts: z2.array(z2.object({ name: z2.string(), content: z2.string() })),
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 * 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":";;;AAkBA,OAAO,YAAY;AACnB,SAAS,eAAe;;;ACTjB,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMO,SAAS,aAAwB;AACtC,QAAM,SAAS,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAE9D,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,IAAI,mBAAmB;AAE/C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;AC5BA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,SAAS;AAuBlB,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,KAAK,CAAC,eAAe,YAAY,CAAC;AAC9C,CAAC;AAEM,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,UAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AASA,eAAsB,oBAAoB,WAA6C;AACrF,QAAM,eAAe,KAAK,QAAQ,SAAS;AAG3C,MAAI;AACF,UAAM,OAAO,MAAM,GAAG,KAAK,YAAY;AACvC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,IAAI,eAAe,oBAAoB,YAAY,EAAE;AAAA,IAC7D;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,wBAAwB,YAAY,EAAE;AAAA,IACjE;AACA,UAAM;AAAA,EACR;AAGA,QAAM,eAAe,KAAK,KAAK,cAAc,eAAe;AAC5D,QAAM,WAAW,MAAM,aAAa,YAAY;AAGhD,QAAM,eAAe,KAAK,KAAK,cAAc,eAAe;AAC5D,QAAM,WAAW,MAAM,aAAa,YAAY;AAGhD,QAAM,cAAc,KAAK,KAAK,cAAc,SAAS;AACrD,QAAM,UAAU,MAAM,YAAY,WAAW;AAE7C,SAAO,EAAE,UAAU,UAAU,QAAQ;AACvC;AAEA,eAAe,aAAa,UAA0C;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,UAAMA,QAAgB,KAAK,MAAM,OAAO;AACxC,UAAM,SAAS,oBAAoB,UAAUA,KAAI;AAEjD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAClE,YAAM,IAAI,eAAe,0BAA0B,MAAM,IAAI,QAAQ;AAAA,IACvE;AAEA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,2BAA2B,QAAQ;AAAA,IAC9D;AACA,QAAI,eAAe,aAAa;AAC9B,YAAM,IAAI,eAAe,kCAAkC,IAAI,OAAO,IAAI,QAAQ;AAAA,IACpF;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,aAAa,UAAmC;AAC7D,MAAI;AACF,WAAO,MAAM,GAAG,SAAS,UAAU,OAAO;AAAA,EAC5C,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,2BAA2B,QAAQ;AAAA,IAC9D;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,YAAY,YAA4C;AACrE,QAAM,UAAyB,CAAC;AAEhC,MAAI;AACF,UAAM,QAAQ,MAAM,GAAG,QAAQ,UAAU;AAEzC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,KAAK,GAAG;AACxB,cAAM,OAAO,KAAK,QAAQ,SAAS,EAAE;AACrC,cAAM,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,YAAY,IAAI,GAAG,OAAO;AACtE,gBAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AAEZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;;;ACvIA,SAAS,KAAAC,UAAS;AAKX,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACgB,QACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAgDA,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,MAAMA,GAAE,OAAO;AAAA,EACf,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,GAAE,OAAO;AAAA,EACjB,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AACtB,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,MAAM,WAAW;AAC7B,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,UAAUA,GAAE,OAAO;AAAA,IACjB,MAAMA,GAAE,OAAO;AAAA,IACf,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,QAAQA,GAAE,KAAK,CAAC,eAAe,YAAY,CAAC;AAAA,EAC9C,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO;AAAA,EACnB,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,CAAC,CAAC;AAAA,EACpE,IAAIA,GAAE,OAAO;AACf,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,OAAOA,GAAE,QAAQ;AAAA,EACjB,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAUA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EACA,UAAUA,GAAE;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAUA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AACpB,CAAC;AAEM,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,QAAmB;AAAnB;AAAA,EAAoB;AAAA;AAAA,EAGjD,MAAM,aAA+B;AACnC,UAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,aAAa;AACxD,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,SAAS,MAA4C;AACzD,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,eAAe,IAAI,UAAU;AACxE,aAAO,sBAAsB,MAAM,QAAQ;AAAA,IAC7C,SAAS,KAAK;AACZ,UAAI,eAAe,YAAY,IAAI,WAAW,KAAK;AACjD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,YAAwD;AAC1E,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,wBAAwB,UAAU;AAC9E,WAAO,uBAAuB,MAAM,QAAQ;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,YAAY,YAA8C;AAC9D,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,eAAe,UAAU;AACrE,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,YAAY,MAAc,YAA8C;AAC5E,UAAM,WAAW,MAAM,KAAK,QAAQ,SAAS,eAAe,IAAI,YAAY;AAAA,MAC1E,UAAU,WAAW;AAAA,MACrB,SAAS,WAAW;AAAA,IACtB,CAAC;AACD,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,UAAU,YAAkD;AAChE,UAAM,WAAW,MAAM,KAAK,SAAS,WAAW,SAAS,IAAI;AAE7D,QAAI,UAAU;AACZ,YAAMC,WAAU,MAAM,KAAK,YAAY,WAAW,SAAS,MAAM,UAAU;AAC3E,aAAO,EAAE,SAAAA,UAAS,SAAS,MAAM;AAAA,IACnC;AAEA,UAAM,UAAU,MAAM,KAAK,YAAY,UAAU;AACjD,WAAO,EAAE,SAAS,SAAS,KAAK;AAAA,EAClC;AAAA,EAEA,MAAc,QAAQ,QAAgBC,OAAc,MAAkC;AACpF,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAGA,KAAI;AAEzC,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,OAAO,MAAM;AAAA,IAC7C;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD,CAAC;AAED,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAM,SAAS,aAAa,SAAS,kBAAkB;AAEvD,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,QAAQ;AACV,cAAM,YAAa,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI;AAAA,UACR,UAAU,SAAS,8BAA8B,SAAS,MAAM;AAAA,UAChE,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AACA,YAAM,IAAI,SAAS,8BAA8B,SAAS,MAAM,IAAI,SAAS,MAAM;AAAA,IACrF;AAEA,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,SAAS,0BAA0B,SAAS,MAAM;AAAA,IAC9D;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AACF;;;ACpNA,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,GAAG,OAAO,KAAK,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC1D;AAEO,SAAS,MAAM,SAAuB;AAC3C,UAAQ,MAAM,GAAG,OAAO,GAAG,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC1D;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC3D;AAEO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,IAAI,GAAG,OAAO,IAAI,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AACzD;AAEO,SAAS,IAAI,SAAuB;AACzC,UAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,OAAO,GAAG,OAAO,KAAK,EAAE;AACvD;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAcO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAKO,SAAS,SAAS,KAAa,OAAqB;AACzD,UAAQ,IAAI,KAAK,OAAO,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE;AAC/D;AAKO,SAAS,SAAS,SAAmB,QAAwB;AAClE,QAAM,YAAY,QAAQ,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI;AAChF,UAAQ,IAAI,SAAS;AACvB;AAKO,SAAS,YAAkB;AAChC,UAAQ,IAAI;AACd;AAKO,SAAS,KAAK,MAAqB;AACxC,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;;;AC1EO,SAAS,wBAAwBC,UAAwB;AAC9D,EAAAA,SACG,QAAQ,iBAAiB,EACzB,YAAY,uDAAuD,EACnE,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,WAAmB,YAA6B;AAC7D,QAAI;AACF,YAAM,YAAY,WAAW,OAAO;AAAA,IACtC,SAAS,KAAK;AACZ,kBAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,YAAY,WAAmB,SAAyC;AACrF,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAG7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,sBAA6B,KAAK,SAAS,CAAC,KAAK;AAAA,EAC/D;AAEA,QAAM,aAAa,MAAM,oBAAoB,SAAS;AAEtD,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,cAAqB,KAAK,WAAW,SAAS,IAAI,CAAC,KAAK;AAAA,EACtE;AAGA,QAAM,SAAS,MAAM,IAAI,cAAc,UAAU;AAGjD,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV,MAAM,WAAW,SAAS;AAAA,MAC1B,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,IACnB,CAAC;AAAA,EACH,OAAO;AACL,QAAI,OAAO,OAAO;AAChB,MAAO,QAAQ,SAAgB,KAAK,WAAW,SAAS,IAAI,CAAC,WAAW;AAAA,IAC1E,OAAO;AACL,MAAO,MAAM,SAAgB,KAAK,WAAW,SAAS,IAAI,CAAC,wBAAwB;AAAA,IACrF;AAGA,eAAW,OAAO,OAAO,QAAQ;AAC/B,YAAM,WAAW,IAAI,OAAO,KAAY,KAAK,IAAI,IAAI,CAAC,MAAM;AAC5D,MAAO,MAAM,KAAK,IAAI,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC5C;AAGA,eAAW,QAAQ,OAAO,UAAU;AAClC,YAAM,WAAW,KAAK,OAAO,KAAY,KAAK,KAAK,IAAI,CAAC,MAAM;AAC9D,MAAO,QAAQ,KAAK,KAAK,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,OAAO;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,eAAgB,QAAO;AAC1C,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAAS,YAAY,KAAc,SAAgC;AACjE,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAM,aAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,gBAAgB;AACxC,IAAO,MAAM,IAAI,OAAO;AACxB,QAAI,IAAI,aAAa,QAAW;AAC9B,MAAO,IAAI,WAAW,IAAI,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;ACrGO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,aAAa,EACrB,YAAY,6CAA6C,EACzD,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,WAAmB,YAAyB;AACzD,QAAI;AACF,YAAM,QAAQ,WAAW,OAAO;AAAA,IAClC,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,QAAQ,WAAmB,SAAqC;AAC7E,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAG7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,sBAA6B,KAAK,SAAS,CAAC,KAAK;AAAA,EAC/D;AAEA,QAAM,aAAa,MAAM,oBAAoB,SAAS;AAEtD,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,WAAkB,KAAK,WAAW,SAAS,IAAI,CAAC,KAAK;AAAA,EACnE;AAGA,QAAM,SAAS,MAAM,IAAI,UAAU,UAAU;AAG7C,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV,MAAM,WAAW,SAAS;AAAA,MAC1B,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,OAAO;AACL,UAAM,SAAS,OAAO,UAAU,YAAY;AAC5C,IAAO,QAAQ,GAAG,MAAM,KAAY,KAAK,WAAW,SAAS,IAAI,CAAC,EAAE;AACpE,IAAO,SAAS,YAAY,OAAO,OAAO;AAAA,EAC5C;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,eAAgB,QAAO;AAC1C,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA4B;AAC7D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,gBAAgB;AACxC,IAAO,MAAM,IAAI,OAAO;AACxB,QAAI,IAAI,aAAa,QAAW;AAC9B,MAAO,IAAI,WAAW,IAAI,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AClFO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,QAAQ,OAAO;AAAA,IACvB,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,QAAQ,SAAqC;AAC1D,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAE7B,QAAM,SAAS,MAAM,IAAI,WAAW;AAEpC,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK,EAAE,OAAO,CAAC;AACtB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,IAAO,KAAK,iBAAiB;AAC7B;AAAA,EACF;AAGA,EAAO,UAAU;AACjB,EAAO;AAAA,IACL,CAAQ,KAAK,MAAM,GAAU,KAAK,MAAM,GAAU,KAAK,QAAQ,GAAU,KAAK,IAAI,CAAC;AAAA,IACnF,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,EACjB;AACA,EAAO,IAAI,SAAI,OAAO,GAAG,CAAC;AAG1B,aAAW,SAAS,QAAQ;AAC1B,IAAO,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EACpF;AAEA,EAAO,UAAU;AACjB,EAAO,IAAI,GAAG,OAAO,MAAM,WAAW;AACxC;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA4B;AAC7D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AC5EO,SAAS,mBAAmBC,UAAwB;AACzD,EAAAA,SACG,QAAQ,YAAY,EACpB,YAAY,2BAA2B,EACvC,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,MAAc,YAAwB;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAAA,IAC5B,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,OAAO,MAAc,SAAoC;AACtE,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAE7B,QAAM,QAAQ,MAAM,IAAI,SAAS,IAAI;AAErC,MAAI,CAAC,OAAO;AACV,QAAI,QAAQ,MAAM;AAChB,MAAO,KAAK,EAAE,OAAO,oBAAoB,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,IACtE,OAAO;AACL,MAAO,MAAM,oBAAoB,IAAI,EAAE;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK,KAAK;AACjB;AAAA,EACF;AAGA,EAAO,UAAU;AACjB,EAAO,QAAQ,UAAiB,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE;AAC3D,EAAO,UAAU;AACjB,EAAO,SAAS,QAAQ,MAAM,SAAS,IAAI;AAC3C,EAAO,SAAS,MAAM,MAAM,EAAE;AAC9B,EAAO,SAAS,UAAU,MAAM,SAAS,MAAM;AAC/C,MAAI,MAAM,SAAS,aAAa;AAC9B,IAAO,SAAS,eAAe,MAAM,SAAS,WAAW;AAAA,EAC3D;AACA,EAAO,UAAU;AACjB,EAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;AAAA,EAC3E;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA2B;AAC5D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;ARrEA,IAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO;AAC7C,IAAM,UAAU,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,IAAI,QAAQ,KAAK,WAAW,CAAC,IAAI;AAG7F,OAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE/B,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,0DAA0D,EACtE,QAAQ,OAAO,EACf,OAAO,gBAAgB,yCAAyC,MAAM;AAGzE,wBAAwB,OAAO;AAC/B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,mBAAmB,OAAO;AAG1B,QAAQ,MAAM;","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' | '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)\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' | '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// 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\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"]}
package/package.json CHANGED
@@ -1,9 +1,18 @@
1
1
  {
2
2
  "name": "@octavus/cli",
3
- "version": "0.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "CLI for validating and syncing Octavus agent definitions",
5
5
  "license": "MIT",
6
6
  "author": "Octavus AI <dev@octavus.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/octavus-ai/js-sdk.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://octavus.ai",
13
+ "bugs": {
14
+ "url": "https://github.com/octavus-ai/js-sdk/issues"
15
+ },
7
16
  "keywords": [
8
17
  "octavus",
9
18
  "ai",