@studiometa/forge-cli 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","names":[],"sources":["../src/audit.ts","../src/utils/command-router.ts","../src/utils/resolve.ts","../src/commands/backups/handlers.ts","../src/commands/backups/command.ts","../src/commands/backups/help.ts","../src/commands/completion.ts","../src/commands/certificates/handlers.ts","../src/commands/certificates/command.ts","../src/commands/certificates/help.ts","../src/commands/commands/handlers.ts","../src/commands/commands/command.ts","../src/commands/commands/help.ts","../src/commands/config.ts","../src/commands/daemons/handlers.ts","../src/commands/daemons/command.ts","../src/commands/daemons/help.ts","../src/commands/databases/handlers.ts","../src/commands/databases/command.ts","../src/commands/databases/help.ts","../src/commands/database-users/handlers.ts","../src/commands/database-users/command.ts","../src/commands/database-users/help.ts","../src/commands/deployments/handlers.ts","../src/commands/deployments/command.ts","../src/commands/deployments/help.ts","../src/commands/env/handlers.ts","../src/commands/env/command.ts","../src/commands/env/help.ts","../src/commands/firewall-rules/handlers.ts","../src/commands/firewall-rules/command.ts","../src/commands/firewall-rules/help.ts","../src/commands/monitors/handlers.ts","../src/commands/monitors/command.ts","../src/commands/monitors/help.ts","../src/commands/nginx/handlers.ts","../src/commands/nginx/command.ts","../src/commands/nginx/help.ts","../src/commands/nginx-templates/handlers.ts","../src/commands/nginx-templates/command.ts","../src/commands/nginx-templates/help.ts","../src/commands/recipes/handlers.ts","../src/commands/recipes/command.ts","../src/commands/recipes/help.ts","../src/commands/redirect-rules/handlers.ts","../src/commands/redirect-rules/command.ts","../src/commands/redirect-rules/help.ts","../src/commands/scheduled-jobs/handlers.ts","../src/commands/scheduled-jobs/command.ts","../src/commands/scheduled-jobs/help.ts","../src/commands/security-rules/handlers.ts","../src/commands/security-rules/command.ts","../src/commands/security-rules/help.ts","../src/commands/servers/handlers.ts","../src/commands/servers/command.ts","../src/commands/servers/help.ts","../src/commands/sites/handlers.ts","../src/commands/sites/command.ts","../src/commands/sites/help.ts","../src/commands/ssh-keys/handlers.ts","../src/commands/ssh-keys/command.ts","../src/commands/ssh-keys/help.ts","../src/commands/user/handlers.ts","../src/commands/user/command.ts","../src/commands/user/help.ts","../src/utils/args.ts","../src/cli.ts"],"sourcesContent":["import { createAuditLogger } from \"@studiometa/forge-core\";\nimport type { AuditLogger } from \"@studiometa/forge-core\";\n\n/**\n * Shared audit logger for CLI write operations.\n * Lazily initialized on first use.\n */\nlet _auditLogger: AuditLogger | null = null;\n\nexport function getCliAuditLogger(): AuditLogger {\n if (!_auditLogger) _auditLogger = createAuditLogger(\"cli\");\n return _auditLogger;\n}\n","/**\n * Generic command router factory for CLI commands.\n *\n * Eliminates boilerplate switch/case pattern in command routing.\n *\n * @example\n * ```typescript\n * import { createCommandRouter } from '../../utils/command-router.ts';\n * import { serversList, serversGet } from './handlers.ts';\n *\n * export const handleServersCommand = createCommandRouter({\n * resource: 'servers',\n * handlers: {\n * list: serversList,\n * ls: serversList,\n * get: [serversGet, 'args'],\n * },\n * });\n * ```\n */\n\nimport type { CommandContext } from \"../context.ts\";\nimport { type OutputFormat, isOutputFormat } from \"../types.ts\";\n\nimport { createContext } from \"../context.ts\";\nimport { OutputFormatter } from \"../output.ts\";\nimport { getCliAuditLogger } from \"../audit.ts\";\n\n/**\n * Handler that only receives context (e.g., list commands)\n */\nexport type ListHandler = (ctx: CommandContext) => Promise<void>;\n\n/**\n * Handler that receives args and context (e.g., get/update commands)\n */\nexport type ArgsHandler = (args: string[], ctx: CommandContext) => Promise<void>;\n\n/**\n * Handler definition - either a ListHandler or an ArgsHandler marked with 'args'\n */\nexport type Handler = ListHandler | [ArgsHandler, \"args\"];\n\n/**\n * Configuration for the command router\n */\nexport interface CommandRouterConfig {\n /** Resource name for error messages (e.g., 'servers', 'sites') */\n resource: string;\n /** Map of subcommand names to handlers */\n handlers: Record<string, Handler>;\n /**\n * Set of subcommand names that are write operations.\n * These will be recorded in the audit log on success or failure.\n */\n writeSubcommands?: ReadonlyArray<string>;\n}\n\n/**\n * Creates a command router function that dispatches to the appropriate handler.\n */\nexport function createCommandRouter(config: CommandRouterConfig) {\n return async function (\n subcommand: string,\n args: string[],\n options: Record<string, string | boolean | string[]>,\n ): Promise<void> {\n const rawFormat = options.format ?? options.f ?? \"human\";\n const format: OutputFormat = isOutputFormat(rawFormat) ? rawFormat : \"human\";\n const formatter = new OutputFormatter(format, options[\"no-color\"] === true);\n\n const ctx = createContext(options);\n\n const handler = config.handlers[subcommand];\n if (!handler) {\n formatter.error(`Unknown ${config.resource} subcommand: ${subcommand}`);\n process.exit(1);\n return; // Unreachable in production, but needed for tests where process.exit is mocked\n }\n\n const isWrite = config.writeSubcommands?.includes(subcommand) ?? false;\n\n if (isWrite) {\n // Sanitized args for audit log (strip token)\n const { token: _token, ...safeOptions } = options;\n try {\n if (Array.isArray(handler)) {\n await handler[0](args, ctx);\n } else {\n await handler(ctx);\n }\n getCliAuditLogger().log({\n source: \"cli\",\n resource: config.resource,\n action: subcommand,\n args: safeOptions,\n status: \"success\",\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n getCliAuditLogger().log({\n source: \"cli\",\n resource: config.resource,\n action: subcommand,\n args: safeOptions,\n status: \"error\",\n error: errorMessage,\n });\n throw err;\n }\n } else {\n if (Array.isArray(handler)) {\n // ArgsHandler - receives args and context\n await handler[0](args, ctx);\n } else {\n // ListHandler - receives only context\n await handler(ctx);\n }\n }\n };\n}\n","/**\n * Smart resolution utilities for --server and --site options.\n *\n * Accepts numeric IDs (used as-is) or plain strings (resolved by name/partial match).\n */\n\nimport { listServers, listSites, matchByName } from \"@studiometa/forge-core\";\nimport type { ExecutorContext } from \"@studiometa/forge-core\";\nimport { ValidationError } from \"../errors.ts\";\n\n/**\n * Resolve a --server value to a numeric server ID string.\n *\n * - Numeric string → returned as-is (no API call)\n * - Plain string → fetch all servers, exact match first, then partial match\n * - 0 matches → ValidationError listing available servers\n * - 2+ matches → ValidationError listing ambiguous matches\n */\nexport async function resolveServerId(value: string, execCtx: ExecutorContext): Promise<string> {\n if (/^\\d+$/.test(value)) {\n return value;\n }\n\n const result = await listServers({}, execCtx);\n const servers = result.data;\n\n const { exact, partial } = matchByName(servers, value, (s) => s.name);\n\n if (exact.length === 1) {\n return String(exact[0].id);\n }\n\n if (partial.length === 0) {\n const available = servers.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(`No server found matching \"${value}\"`, \"server\", [\n `Available servers:\\n${available}`,\n ]);\n }\n\n if (partial.length > 1) {\n const matches = partial.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(\n `Ambiguous server name \"${value}\" — ${partial.length} matches found`,\n \"server\",\n [`Matching servers:\\n${matches}`, \"Use a more specific name or pass the numeric ID\"],\n );\n }\n\n return String(partial[0].id);\n}\n\n/**\n * Resolve a --site value to a numeric site ID string.\n *\n * - Numeric string → returned as-is (no API call)\n * - Plain string → fetch all sites for the server, exact domain match first, then partial\n * - 0 matches → ValidationError listing available sites\n * - 2+ matches → ValidationError listing ambiguous matches\n */\nexport async function resolveSiteId(\n value: string,\n serverId: string,\n execCtx: ExecutorContext,\n): Promise<string> {\n if (/^\\d+$/.test(value)) {\n return value;\n }\n\n const result = await listSites({ server_id: serverId }, execCtx);\n const sites = result.data;\n\n const { exact, partial } = matchByName(sites, value, (s) => s.name);\n\n if (exact.length === 1) {\n return String(exact[0].id);\n }\n\n if (partial.length === 0) {\n const available = sites.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(`No site found matching \"${value}\" on server ${serverId}`, \"site\", [\n `Available sites:\\n${available}`,\n ]);\n }\n\n if (partial.length > 1) {\n const matches = partial.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(\n `Ambiguous site name \"${value}\" — ${partial.length} matches found`,\n \"site\",\n [`Matching sites:\\n${matches}`, \"Use a more specific name or pass the numeric ID\"],\n );\n }\n\n return String(partial[0].id);\n}\n","import {\n createBackupConfig,\n deleteBackupConfig,\n getBackupConfig,\n listBackupConfigs,\n updateBackupConfig,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function backupsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge backups list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listBackupConfigs({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"schedule\", \"status\"],\n \"No backup configurations found.\",\n (b) => `${String(b.id).padEnd(8)} ${b.name.padEnd(20)} ${b.schedule.padEnd(12)} ${b.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function backupsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups get <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups get <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getBackupConfig({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"provider\",\n \"schedule\",\n \"displayable_schedule\",\n \"retention\",\n \"status\",\n \"next_run_time\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function backupsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const storageProviderId = Number(ctx.options.provider ?? 0);\n const frequency = String(ctx.options.frequency ?? \"\");\n const databaseIdsRaw = ctx.options.databases;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : [];\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!storageProviderId) {\n exitWithValidationError(\n \"provider\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!frequency) {\n exitWithValidationError(\n \"frequency\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await createBackupConfig(\n { server_id, storage_provider_id: storageProviderId, frequency, retention: 5, database_ids },\n execCtx,\n );\n ctx.formatter.success(\"Backup configuration created.\");\n }, ctx.formatter);\n}\n\nexport async function backupsUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const storageProviderId = Number(ctx.options.provider ?? 0);\n const frequency = String(ctx.options.frequency ?? \"\");\n const retention = Number(ctx.options.retention ?? 0);\n const databaseIdsRaw = ctx.options.databases;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : [];\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!storageProviderId) {\n exitWithValidationError(\n \"provider\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!frequency) {\n exitWithValidationError(\n \"frequency\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!retention) {\n exitWithValidationError(\n \"retention\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await updateBackupConfig(\n {\n server_id,\n id,\n storage_provider_id: storageProviderId,\n frequency,\n retention,\n database_ids,\n ...(ctx.options.name != null ? { name: String(ctx.options.name) } : {}),\n ...(ctx.options.bucket != null ? { bucket: String(ctx.options.bucket) } : {}),\n ...(ctx.options.directory != null ? { directory: String(ctx.options.directory) } : {}),\n ...(ctx.options.day != null ? { day: String(ctx.options.day) } : {}),\n ...(ctx.options.time != null ? { time: String(ctx.options.time) } : {}),\n ...(ctx.options.cron != null ? { cron: String(ctx.options.cron) } : {}),\n ...(ctx.options[\"notification-email\"] != null\n ? { notification_email: String(ctx.options[\"notification-email\"]) }\n : {}),\n },\n execCtx,\n );\n ctx.formatter.success(`Backup configuration ${id} updated.`);\n }, ctx.formatter);\n}\n\nexport async function backupsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups delete <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups delete <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteBackupConfig({ server_id, id }, execCtx);\n ctx.formatter.success(`Backup configuration ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n backupsCreate,\n backupsDelete,\n backupsGet,\n backupsList,\n backupsUpdate,\n} from \"./handlers.ts\";\n\nexport const handleBackupsCommand = createCommandRouter({\n resource: \"backups\",\n handlers: {\n list: backupsList,\n ls: backupsList,\n get: [backupsGet, \"args\"],\n create: backupsCreate,\n update: [backupsUpdate, \"args\"],\n delete: [backupsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showBackupsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge backups list\")} - List backup configurations on a server\n\n${colors.bold(\"USAGE:\")}\n forge backups list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge backups get\")} - Get backup configuration details\n\n${colors.bold(\"USAGE:\")}\n forge backups get <backup_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge backups create\")} - Create a new backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups create --server <server_id> --provider <provider> --frequency <frequency> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --provider <name> Backup provider (required)\n --frequency <freq> Backup frequency (required)\n --databases <ids> Comma-separated database IDs to back up (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge backups update\")} - Update a backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --provider <id> Storage provider ID (required)\n --frequency <freq> Backup frequency (required)\n --retention <n> Retention count (required)\n --databases <ids> Comma-separated database IDs (optional)\n --name <name> Backup name (optional)\n --bucket <bucket> Bucket name (optional)\n --directory <dir> Directory (optional)\n --day <day> Day of week (optional)\n --time <time> Time (optional)\n --cron <cron> Cron expression (optional)\n --notification-email <email> Notification email (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge backups delete\")} - Delete a backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups delete <backup_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge backups\")} - Manage backup configurations\n\n${colors.bold(\"USAGE:\")}\n forge backups <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List backup configurations\n get <id> Get backup configuration details\n create Create a new backup configuration\n update <id> Update a backup configuration\n delete <id> Delete a backup configuration\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge backups <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Shell completion installation command\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { colors } from \"../utils/colors.ts\";\n\nconst BASH_COMPLETION = `#!/usr/bin/env bash\n\n_forge_completions() {\n local cur prev commands subcommands options\n\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n # Main commands\n commands=\"config servers s sites deployments d databases db database-users daemons env nginx certificates certs firewall-rules fw ssh-keys backups commands scheduled-jobs user monitors nginx-templates security-rules redirect-rules recipes completion help\"\n\n # Subcommands for each command\n local config_cmds=\"set get delete\"\n local servers_cmds=\"list ls get reboot\"\n local sites_cmds=\"list ls get\"\n local deployments_cmds=\"list ls deploy\"\n local databases_cmds=\"list ls get\"\n local database_users_cmds=\"list ls get create delete\"\n local daemons_cmds=\"list ls get restart\"\n local env_cmds=\"get update\"\n local nginx_cmds=\"get update\"\n local certificates_cmds=\"get activate\"\n local firewall_rules_cmds=\"list ls get\"\n local ssh_keys_cmds=\"list ls get\"\n local backups_cmds=\"list ls get create delete\"\n local commands_cmds=\"list ls get create\"\n local scheduled_jobs_cmds=\"list ls get create delete\"\n local user_cmds=\"get\"\n local monitors_cmds=\"list ls get create delete\"\n local nginx_templates_cmds=\"list ls get create update delete\"\n local security_rules_cmds=\"list ls get create delete\"\n local redirect_rules_cmds=\"list ls get create delete\"\n local recipes_cmds=\"list ls get run\"\n local completion_cmds=\"bash zsh fish\"\n\n # Global options\n options=\"--token --server --site -f --format --no-color -h --help -v --version --name --command --content --from --to --provider --frequency --type --operator --threshold --minutes --key --port --ip-address --user --script --servers --domain --password --credential-id --region --size --project-type --directory\"\n\n # Format options\n local formats=\"json human table\"\n\n # Completion logic\n case \"\\${COMP_CWORD}\" in\n 1)\n # Complete main commands\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n ;;\n 2)\n # Complete subcommands based on main command\n case \"\\${prev}\" in\n config)\n COMPREPLY=( $(compgen -W \"\\${config_cmds}\" -- \"\\${cur}\") )\n ;;\n servers|s)\n COMPREPLY=( $(compgen -W \"\\${servers_cmds}\" -- \"\\${cur}\") )\n ;;\n sites)\n COMPREPLY=( $(compgen -W \"\\${sites_cmds}\" -- \"\\${cur}\") )\n ;;\n deployments|d)\n COMPREPLY=( $(compgen -W \"\\${deployments_cmds}\" -- \"\\${cur}\") )\n ;;\n databases|db)\n COMPREPLY=( $(compgen -W \"\\${databases_cmds}\" -- \"\\${cur}\") )\n ;;\n database-users)\n COMPREPLY=( $(compgen -W \"\\${database_users_cmds}\" -- \"\\${cur}\") )\n ;;\n daemons)\n COMPREPLY=( $(compgen -W \"\\${daemons_cmds}\" -- \"\\${cur}\") )\n ;;\n env)\n COMPREPLY=( $(compgen -W \"\\${env_cmds}\" -- \"\\${cur}\") )\n ;;\n nginx)\n COMPREPLY=( $(compgen -W \"\\${nginx_cmds}\" -- \"\\${cur}\") )\n ;;\n certificates|certs)\n COMPREPLY=( $(compgen -W \"\\${certificates_cmds}\" -- \"\\${cur}\") )\n ;;\n firewall-rules|fw)\n COMPREPLY=( $(compgen -W \"\\${firewall_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n ssh-keys)\n COMPREPLY=( $(compgen -W \"\\${ssh_keys_cmds}\" -- \"\\${cur}\") )\n ;;\n backups)\n COMPREPLY=( $(compgen -W \"\\${backups_cmds}\" -- \"\\${cur}\") )\n ;;\n commands)\n COMPREPLY=( $(compgen -W \"\\${commands_cmds}\" -- \"\\${cur}\") )\n ;;\n scheduled-jobs)\n COMPREPLY=( $(compgen -W \"\\${scheduled_jobs_cmds}\" -- \"\\${cur}\") )\n ;;\n user)\n COMPREPLY=( $(compgen -W \"\\${user_cmds}\" -- \"\\${cur}\") )\n ;;\n monitors)\n COMPREPLY=( $(compgen -W \"\\${monitors_cmds}\" -- \"\\${cur}\") )\n ;;\n nginx-templates)\n COMPREPLY=( $(compgen -W \"\\${nginx_templates_cmds}\" -- \"\\${cur}\") )\n ;;\n security-rules)\n COMPREPLY=( $(compgen -W \"\\${security_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n redirect-rules)\n COMPREPLY=( $(compgen -W \"\\${redirect_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n recipes)\n COMPREPLY=( $(compgen -W \"\\${recipes_cmds}\" -- \"\\${cur}\") )\n ;;\n completion)\n COMPREPLY=( $(compgen -W \"\\${completion_cmds}\" -- \"\\${cur}\") )\n ;;\n *)\n COMPREPLY=( $(compgen -W \"\\${options}\" -- \"\\${cur}\") )\n ;;\n esac\n ;;\n *)\n # Complete options and their values\n case \"\\${prev}\" in\n --format|-f)\n COMPREPLY=( $(compgen -W \"\\${formats}\" -- \"\\${cur}\") )\n ;;\n --token|--server|--site|--name|--command|--content|--from|--to|--provider|--frequency|--type|--operator|--threshold|--minutes|--key|--port|--ip-address|--user|--script|--servers|--domain|--password|--credential-id|--region|--size|--project-type|--directory)\n # No completion for values requiring arguments\n COMPREPLY=()\n ;;\n *)\n COMPREPLY=( $(compgen -W \"\\${options}\" -- \"\\${cur}\") )\n ;;\n esac\n ;;\n esac\n\n return 0\n}\n\ncomplete -F _forge_completions forge\n`;\n\nconst ZSH_COMPLETION = `#compdef forge\n\n_forge() {\n local line state\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '*: :->args'\n\n case $state in\n command)\n local -a commands\n commands=(\n 'config:Manage CLI configuration'\n 'servers:Manage servers'\n 's:Manage servers (alias)'\n 'sites:Manage sites'\n 'deployments:Manage deployments'\n 'd:Manage deployments (alias)'\n 'databases:Manage databases'\n 'db:Manage databases (alias)'\n 'database-users:Manage database users'\n 'daemons:Manage daemons'\n 'env:Manage environment variables'\n 'nginx:Manage nginx configuration'\n 'certificates:Manage SSL certificates'\n 'certs:Manage SSL certificates (alias)'\n 'firewall-rules:Manage firewall rules'\n 'fw:Manage firewall rules (alias)'\n 'ssh-keys:Manage SSH keys'\n 'backups:Manage backup configurations'\n 'commands:Manage site commands'\n 'scheduled-jobs:Manage scheduled jobs'\n 'user:Display authenticated user profile'\n 'monitors:Manage server monitors'\n 'nginx-templates:Manage Nginx templates'\n 'security-rules:Manage site security rules'\n 'redirect-rules:Manage site redirect rules'\n 'recipes:Manage recipes'\n 'completion:Generate shell completion script'\n 'help:Show help'\n )\n _describe 'command' commands\n ;;\n subcommand)\n case $line[1] in\n config)\n local -a config_cmds\n config_cmds=(\n 'set:Save API token'\n 'get:Show current token'\n 'delete:Delete stored token'\n )\n _describe 'config command' config_cmds\n ;;\n servers|s)\n local -a servers_cmds\n servers_cmds=(\n 'list:List all servers'\n 'ls:List all servers (alias)'\n 'get:Get server details'\n 'reboot:Reboot a server'\n )\n _describe 'servers command' servers_cmds\n ;;\n sites)\n local -a sites_cmds\n sites_cmds=(\n 'list:List sites'\n 'ls:List sites (alias)'\n 'get:Get site details'\n )\n _describe 'sites command' sites_cmds\n ;;\n deployments|d)\n local -a deployments_cmds\n deployments_cmds=(\n 'list:List deployments'\n 'ls:List deployments (alias)'\n 'deploy:Trigger a deployment'\n )\n _describe 'deployments command' deployments_cmds\n ;;\n databases|db)\n local -a databases_cmds\n databases_cmds=(\n 'list:List databases'\n 'ls:List databases (alias)'\n 'get:Get database details'\n )\n _describe 'databases command' databases_cmds\n ;;\n database-users)\n local -a database_users_cmds\n database_users_cmds=(\n 'list:List database users'\n 'ls:List database users (alias)'\n 'get:Get database user details'\n 'create:Create a database user'\n 'delete:Delete a database user'\n )\n _describe 'database-users command' database_users_cmds\n ;;\n daemons)\n local -a daemons_cmds\n daemons_cmds=(\n 'list:List daemons'\n 'ls:List daemons (alias)'\n 'get:Get daemon details'\n 'restart:Restart a daemon'\n )\n _describe 'daemons command' daemons_cmds\n ;;\n env)\n local -a env_cmds\n env_cmds=(\n 'get:Get env variables'\n 'update:Update env variables'\n )\n _describe 'env command' env_cmds\n ;;\n nginx)\n local -a nginx_cmds\n nginx_cmds=(\n 'get:Get nginx config'\n 'update:Update nginx config'\n )\n _describe 'nginx command' nginx_cmds\n ;;\n certificates|certs)\n local -a certificates_cmds\n certificates_cmds=(\n 'get:Get certificate for a domain'\n 'activate:Activate a certificate'\n )\n _describe 'certificates command' certificates_cmds\n ;;\n firewall-rules|fw)\n local -a firewall_rules_cmds\n firewall_rules_cmds=(\n 'list:List firewall rules'\n 'ls:List firewall rules (alias)'\n 'get:Get firewall rule details'\n )\n _describe 'firewall-rules command' firewall_rules_cmds\n ;;\n ssh-keys)\n local -a ssh_keys_cmds\n ssh_keys_cmds=(\n 'list:List SSH keys'\n 'ls:List SSH keys (alias)'\n 'get:Get SSH key details'\n )\n _describe 'ssh-keys command' ssh_keys_cmds\n ;;\n backups)\n local -a backups_cmds\n backups_cmds=(\n 'list:List backup configurations'\n 'ls:List backup configurations (alias)'\n 'get:Get backup configuration details'\n 'create:Create a backup configuration'\n 'delete:Delete a backup configuration'\n )\n _describe 'backups command' backups_cmds\n ;;\n commands)\n local -a commands_cmds\n commands_cmds=(\n 'list:List commands'\n 'ls:List commands (alias)'\n 'get:Get command details'\n 'create:Execute a command'\n )\n _describe 'commands command' commands_cmds\n ;;\n scheduled-jobs)\n local -a scheduled_jobs_cmds\n scheduled_jobs_cmds=(\n 'list:List scheduled jobs'\n 'ls:List scheduled jobs (alias)'\n 'get:Get scheduled job details'\n 'create:Create a scheduled job'\n 'delete:Delete a scheduled job'\n )\n _describe 'scheduled-jobs command' scheduled_jobs_cmds\n ;;\n user)\n local -a user_cmds\n user_cmds=(\n 'get:Get the authenticated user profile'\n )\n _describe 'user command' user_cmds\n ;;\n monitors)\n local -a monitors_cmds\n monitors_cmds=(\n 'list:List monitors'\n 'ls:List monitors (alias)'\n 'get:Get monitor details'\n 'create:Create a monitor'\n 'delete:Delete a monitor'\n )\n _describe 'monitors command' monitors_cmds\n ;;\n nginx-templates)\n local -a nginx_templates_cmds\n nginx_templates_cmds=(\n 'list:List Nginx templates'\n 'ls:List Nginx templates (alias)'\n 'get:Get Nginx template details'\n 'create:Create a Nginx template'\n 'update:Update a Nginx template'\n 'delete:Delete a Nginx template'\n )\n _describe 'nginx-templates command' nginx_templates_cmds\n ;;\n security-rules)\n local -a security_rules_cmds\n security_rules_cmds=(\n 'list:List security rules'\n 'ls:List security rules (alias)'\n 'get:Get security rule details'\n 'create:Create a security rule'\n 'delete:Delete a security rule'\n )\n _describe 'security-rules command' security_rules_cmds\n ;;\n redirect-rules)\n local -a redirect_rules_cmds\n redirect_rules_cmds=(\n 'list:List redirect rules'\n 'ls:List redirect rules (alias)'\n 'get:Get redirect rule details'\n 'create:Create a redirect rule'\n 'delete:Delete a redirect rule'\n )\n _describe 'redirect-rules command' redirect_rules_cmds\n ;;\n recipes)\n local -a recipes_cmds\n recipes_cmds=(\n 'list:List all recipes'\n 'ls:List all recipes (alias)'\n 'get:Get recipe details'\n 'run:Run a recipe'\n )\n _describe 'recipes command' recipes_cmds\n ;;\n completion)\n local -a completion_cmds\n completion_cmds=(\n 'bash:Generate Bash completion script'\n 'zsh:Generate Zsh completion script'\n 'fish:Generate Fish completion script'\n )\n _describe 'completion shell' completion_cmds\n ;;\n esac\n ;;\n args)\n _arguments \\\\\n '--token[API token]:token:' \\\\\n '--server[Server ID]:server id:' \\\\\n '--site[Site ID]:site id:' \\\\\n '(-f --format)'{-f,--format}'[Output format]:format:(json human table)' \\\\\n '--no-color[Disable colored output]' \\\\\n '(-h --help)'{-h,--help}'[Show help]' \\\\\n '(-v --version)'{-v,--version}'[Show version]' \\\\\n '--name[Name]:name:' \\\\\n '--command[Command]:command:' \\\\\n '--content[Content]:content:' \\\\\n '--from[From]:from:' \\\\\n '--to[To]:to:' \\\\\n '--provider[Provider]:provider:' \\\\\n '--frequency[Frequency]:frequency:' \\\\\n '--type[Type]:type:' \\\\\n '--operator[Operator]:operator:' \\\\\n '--threshold[Threshold]:threshold:' \\\\\n '--minutes[Minutes]:minutes:' \\\\\n '--key[Key]:key:' \\\\\n '--port[Port]:port:' \\\\\n '--ip-address[IP address]:ip address:' \\\\\n '--user[User]:user:' \\\\\n '--script[Script]:script:' \\\\\n '--servers[Servers]:servers:' \\\\\n '--domain[Domain]:domain:' \\\\\n '--password[Password]:password:' \\\\\n '--credential-id[Credential ID]:credential id:' \\\\\n '--region[Region]:region:' \\\\\n '--size[Size]:size:' \\\\\n '--project-type[Project type]:project type:' \\\\\n '--directory[Directory]:directory:'\n ;;\n esac\n}\n\n_forge \"$@\"\n`;\n\nconst FISH_COMPLETION = `# Completions for forge\n\n# Main commands\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"config\" -d \"Manage CLI configuration\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"servers\" -d \"Manage servers\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"s\" -d \"Manage servers (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"sites\" -d \"Manage sites\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"deployments\" -d \"Manage deployments\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"d\" -d \"Manage deployments (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"databases\" -d \"Manage databases\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"db\" -d \"Manage databases (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"database-users\" -d \"Manage database users\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"daemons\" -d \"Manage daemons\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"env\" -d \"Manage environment variables\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"nginx\" -d \"Manage nginx configuration\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"certificates\" -d \"Manage SSL certificates\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"certs\" -d \"Manage SSL certificates (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"firewall-rules\" -d \"Manage firewall rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"fw\" -d \"Manage firewall rules (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"ssh-keys\" -d \"Manage SSH keys\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"backups\" -d \"Manage backup configurations\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"commands\" -d \"Manage site commands\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"scheduled-jobs\" -d \"Manage scheduled jobs\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"user\" -d \"Display authenticated user profile\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"monitors\" -d \"Manage server monitors\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"nginx-templates\" -d \"Manage Nginx templates\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"security-rules\" -d \"Manage site security rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"redirect-rules\" -d \"Manage site redirect rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"recipes\" -d \"Manage recipes\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate shell completion script\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"help\" -d \"Show help\"\n\n# config subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"set\" -d \"Save API token\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"get\" -d \"Show current token\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"delete\" -d \"Delete stored token\"\n\n# servers subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"list\" -d \"List all servers\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"ls\" -d \"List all servers (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"get\" -d \"Get server details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"reboot\" -d \"Reboot a server\"\n\n# sites subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"list\" -d \"List sites\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"ls\" -d \"List sites (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"get\" -d \"Get site details\"\n\n# deployments subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"list\" -d \"List deployments\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"ls\" -d \"List deployments (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"deploy\" -d \"Trigger a deployment\"\n\n# databases subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"list\" -d \"List databases\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"ls\" -d \"List databases (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"get\" -d \"Get database details\"\n\n# database-users subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"list\" -d \"List database users\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"ls\" -d \"List database users (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"get\" -d \"Get database user details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"create\" -d \"Create a database user\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"delete\" -d \"Delete a database user\"\n\n# daemons subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"list\" -d \"List daemons\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"ls\" -d \"List daemons (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"get\" -d \"Get daemon details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"restart\" -d \"Restart a daemon\"\n\n# env subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from env\" -a \"get\" -d \"Get env variables\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from env\" -a \"update\" -d \"Update env variables\"\n\n# nginx subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx\" -a \"get\" -d \"Get nginx config\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx\" -a \"update\" -d \"Update nginx config\"\n\n# certificates subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"get\" -d \"Get certificate for a domain\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"get\" -d \"Get certificate details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"activate\" -d \"Activate a certificate\"\n\n# firewall-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"list\" -d \"List firewall rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"ls\" -d \"List firewall rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"get\" -d \"Get firewall rule details\"\n\n# ssh-keys subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"list\" -d \"List SSH keys\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"ls\" -d \"List SSH keys (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"get\" -d \"Get SSH key details\"\n\n# backups subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"list\" -d \"List backup configurations\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"ls\" -d \"List backup configurations (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"get\" -d \"Get backup configuration details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"create\" -d \"Create a backup configuration\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"delete\" -d \"Delete a backup configuration\"\n\n# commands subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"list\" -d \"List commands\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"ls\" -d \"List commands (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"get\" -d \"Get command details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"create\" -d \"Execute a command\"\n\n# scheduled-jobs subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"list\" -d \"List scheduled jobs\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"ls\" -d \"List scheduled jobs (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"get\" -d \"Get scheduled job details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"create\" -d \"Create a scheduled job\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"delete\" -d \"Delete a scheduled job\"\n\n# user subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from user\" -a \"get\" -d \"Get the authenticated user profile\"\n\n# monitors subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"list\" -d \"List monitors\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"ls\" -d \"List monitors (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"get\" -d \"Get monitor details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"create\" -d \"Create a monitor\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"delete\" -d \"Delete a monitor\"\n\n# nginx-templates subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"list\" -d \"List Nginx templates\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"ls\" -d \"List Nginx templates (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"get\" -d \"Get Nginx template details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"create\" -d \"Create a Nginx template\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"update\" -d \"Update a Nginx template\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"delete\" -d \"Delete a Nginx template\"\n\n# security-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"list\" -d \"List security rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"ls\" -d \"List security rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"get\" -d \"Get security rule details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"create\" -d \"Create a security rule\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"delete\" -d \"Delete a security rule\"\n\n# redirect-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"list\" -d \"List redirect rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"ls\" -d \"List redirect rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"get\" -d \"Get redirect rule details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"create\" -d \"Create a redirect rule\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"delete\" -d \"Delete a redirect rule\"\n\n# recipes subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"list\" -d \"List all recipes\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"ls\" -d \"List all recipes (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"get\" -d \"Get recipe details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"run\" -d \"Run a recipe\"\n\n# completion subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"bash\" -d \"Install Bash completion\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"zsh\" -d \"Install Zsh completion\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"fish\" -d \"Install Fish completion\"\n\n# Global options\ncomplete -c forge -l token -d \"API token\" -r\ncomplete -c forge -l server -d \"Server ID\" -r\ncomplete -c forge -l site -d \"Site ID\" -r\ncomplete -c forge -s f -l format -d \"Output format\" -xa \"json human table\"\ncomplete -c forge -l no-color -d \"Disable colored output\"\ncomplete -c forge -s h -l help -d \"Show help\"\ncomplete -c forge -s v -l version -d \"Show version\"\ncomplete -c forge -l name -d \"Name\" -r\ncomplete -c forge -l command -d \"Command\" -r\ncomplete -c forge -l content -d \"Content\" -r\ncomplete -c forge -l from -d \"From\" -r\ncomplete -c forge -l to -d \"To\" -r\ncomplete -c forge -l provider -d \"Provider\" -r\ncomplete -c forge -l frequency -d \"Frequency\" -r\ncomplete -c forge -l type -d \"Type\" -r\ncomplete -c forge -l operator -d \"Operator\" -r\ncomplete -c forge -l threshold -d \"Threshold\" -r\ncomplete -c forge -l minutes -d \"Minutes\" -r\ncomplete -c forge -l key -d \"Key\" -r\ncomplete -c forge -l port -d \"Port\" -r\ncomplete -c forge -l ip-address -d \"IP address\" -r\ncomplete -c forge -l user -d \"User\" -r\ncomplete -c forge -l script -d \"Script\" -r\ncomplete -c forge -l servers -d \"Servers\" -r\ncomplete -c forge -l domain -d \"Domain\" -r\ncomplete -c forge -l password -d \"Password\" -r\ncomplete -c forge -l credential-id -d \"Credential ID\" -r\ncomplete -c forge -l region -d \"Region\" -r\ncomplete -c forge -l size -d \"Size\" -r\ncomplete -c forge -l project-type -d \"Project type\" -r\ncomplete -c forge -l directory -d \"Directory\" -r\n`;\n\n/**\n * Get the appropriate completion file path for the shell\n */\nfunction getCompletionPath(shell: string): string {\n const home = homedir();\n\n switch (shell) {\n case \"bash\":\n return join(home, \".local/share/bash-completion/completions/forge\");\n case \"zsh\":\n return join(home, \".zfunc/_forge\");\n case \"fish\": {\n const configHome = process.env[\"XDG_CONFIG_HOME\"] ?? join(home, \".config\");\n return join(configHome, \"fish/completions/forge.fish\");\n }\n default:\n throw new Error(`Unknown shell: ${shell}`);\n }\n}\n\nexport function showCompletionHelp(): void {\n console.log(`\n${colors.bold(\"forge completion\")} - Install shell completion\n\n${colors.bold(\"USAGE:\")}\n forge completion <shell> [--print]\n\n${colors.bold(\"SHELLS:\")}\n bash Install Bash completion\n zsh Install Zsh completion\n fish Install Fish completion\n\n${colors.bold(\"OPTIONS:\")}\n --print Print completion script instead of installing\n\n${colors.bold(\"INSTALLATION:\")}\n The completion script is automatically installed to the appropriate\n standard directory for your shell. After installation, restart your\n shell to activate completions.\n\n ${colors.bold(\"Bash:\")}\n forge completion bash\n # Installs to: ~/.local/share/bash-completion/completions/forge\n # Then run: exec bash\n\n ${colors.bold(\"Zsh:\")}\n forge completion zsh\n # Installs to: ~/.zfunc/_forge\n # Ensure fpath includes ~/.zfunc (add to ~/.zshrc before compinit):\n # fpath=(~/.zfunc $fpath)\n # Then run: exec zsh\n\n ${colors.bold(\"Fish:\")}\n forge completion fish\n # Installs to: ~/.config/fish/completions/forge.fish\n # Completions are loaded automatically\n\n${colors.bold(\"PRINT ONLY:\")}\n Use --print to output the script without installing:\n\n forge completion bash --print > my-completion.sh\n forge completion zsh --print | less\n`);\n}\n\nexport function handleCompletionCommand(\n shell: string,\n options: Record<string, string | boolean | string[]> = {},\n): void {\n const shouldPrint = options[\"print\"] !== undefined;\n\n const shellLower = shell.toLowerCase();\n\n // Get completion script\n let script: string;\n switch (shellLower) {\n case \"bash\":\n script = BASH_COMPLETION;\n break;\n case \"zsh\":\n script = ZSH_COMPLETION;\n break;\n case \"fish\":\n script = FISH_COMPLETION;\n break;\n default:\n console.error(\n `${colors.red(\"✗\")} Unknown shell: ${shell}. Supported shells: bash, zsh, fish`,\n );\n console.error(`Run ${colors.cyan(\"forge completion --help\")} for usage information.`);\n process.exit(1);\n return;\n }\n\n // If --print flag, just output the script\n if (shouldPrint) {\n process.stdout.write(script);\n return;\n }\n\n // Otherwise, install to appropriate directory\n const installPath = getCompletionPath(shellLower);\n const dir = installPath.substring(0, installPath.lastIndexOf(\"/\"));\n\n try {\n mkdirSync(dir, { recursive: true });\n writeFileSync(installPath, script, \"utf8\");\n\n console.log(\n `${colors.green(\"✓\")} Installed ${shell} completion to ${colors.cyan(installPath)}`,\n );\n console.log();\n console.log(colors.bold(\"Next steps:\"));\n\n switch (shellLower) {\n case \"bash\":\n console.log(` 1. Restart your shell: ${colors.cyan(\"exec bash\")}`);\n console.log(` 2. Or source the file: ${colors.cyan(`source ${installPath}`)}`);\n break;\n case \"zsh\":\n console.log(\n ` 1. Ensure ${colors.cyan(\"~/.zfunc\")} is in your $fpath (add to ~/.zshrc before compinit):`,\n );\n console.log(` ${colors.cyan(\"fpath=(~/.zfunc $fpath)\")}`);\n console.log(` 2. Restart your shell: ${colors.cyan(\"exec zsh\")}`);\n break;\n case \"fish\":\n console.log(` Completions are loaded automatically. Restart fish if needed.`);\n break;\n }\n } catch (error) {\n console.error(\n `${colors.red(\"✗\")} Failed to install completion: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n}\n","import { getCertificate, activateCertificate } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerSiteDomainRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string; domain: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const domain = String(ctx.options.domain ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n if (!domain) {\n exitWithValidationError(\"domain_id\", usage, ctx.formatter);\n }\n\n return { server, site, domain };\n}\n\nexport async function certificatesGet(args: string[], ctx: CommandContext): Promise<void> {\n const usage = \"forge certificates get --server <server_id> --site <site_id> --domain <domain_id>\";\n\n const { server, site, domain } = requireServerSiteDomainRaw(ctx, usage);\n\n // Allow positional domain_id as first arg for convenience\n const domainId = args[0] || domain;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getCertificate({ server_id, site_id, domain_id: domainId }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"verification_method\",\n \"key_type\",\n \"status\",\n \"request_status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function certificatesActivate(args: string[], ctx: CommandContext): Promise<void> {\n const usage =\n \"forge certificates activate --server <server_id> --site <site_id> --domain <domain_id>\";\n\n const { server, site, domain } = requireServerSiteDomainRaw(ctx, usage);\n\n // Allow positional domain_id as first arg for convenience\n const domainId = args[0] || domain;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await activateCertificate({ server_id, site_id, domain_id: domainId }, execCtx);\n ctx.formatter.success(`Certificate for domain ${domainId} activated.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { certificatesGet, certificatesActivate } from \"./handlers.ts\";\n\nexport const handleCertificatesCommand = createCommandRouter({\n resource: \"certificates\",\n handlers: {\n get: [certificatesGet, \"args\"],\n activate: [certificatesActivate, \"args\"],\n },\n writeSubcommands: [\"activate\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showCertificatesHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge certificates get\")} - Get certificate for a domain\n\n${colors.bold(\"USAGE:\")}\n forge certificates get --server <server_id> --site <site_id> --domain <domain_id>\n`);\n } else if (subcommand === \"activate\") {\n console.log(`\n${colors.bold(\"forge certificates activate\")} - Activate a certificate\n\n${colors.bold(\"USAGE:\")}\n forge certificates activate --server <server_id> --site <site_id> --domain <domain_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge certificates\")} - Manage SSL certificates\n\n${colors.bold(\"USAGE:\")}\n forge certificates <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge certs\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get certificate for a domain\n activate Activate a certificate\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --domain <id> Domain record ID (required)\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"NOTE:\")}\n In Forge v2, certificates are per-domain. Use domains to manage certificates.\n\nRun ${colors.cyan(\"forge certificates <subcommand> --help\")} for details.\n`);\n }\n}\n","import { createCommand, getCommand, listCommands } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function commandsList(ctx: CommandContext): Promise<void> {\n const usage = \"forge commands list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listCommands({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"status\", \"created_at\"],\n \"No commands found.\",\n (c) =>\n `${String(c.id).padEnd(8)} ${c.command.padEnd(50)} ${c.status.padEnd(12)} ${c.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function commandsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge commands get <command_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"command_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getCommand({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"status\",\n \"user_id\",\n \"duration\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function commandsCreate(ctx: CommandContext): Promise<void> {\n const usage = \"forge commands create --server <server_id> --site <site_id> --command <command>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const command = String(ctx.options.command ?? \"\");\n\n if (!command) {\n exitWithValidationError(\"command\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await createCommand({ server_id, site_id, command }, execCtx);\n ctx.formatter.success(\"Command queued for execution.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { commandsCreate, commandsGet, commandsList } from \"./handlers.ts\";\n\nexport const handleCommandsCommand = createCommandRouter({\n resource: \"commands\",\n handlers: {\n list: commandsList,\n ls: commandsList,\n get: [commandsGet, \"args\"],\n create: commandsCreate,\n },\n writeSubcommands: [\"create\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showCommandsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge commands list\")} - List commands executed on a site\n\n${colors.bold(\"USAGE:\")}\n forge commands list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge commands get\")} - Get command details\n\n${colors.bold(\"USAGE:\")}\n forge commands get <command_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge commands create\")} - Execute a command on a site\n\n${colors.bold(\"USAGE:\")}\n forge commands create --server <server_id> --site <site_id> --command <command> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --command <cmd> Command to execute (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge commands\")} - Manage site commands\n\n${colors.bold(\"USAGE:\")}\n forge commands <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List commands\n get <id> Get command details\n create Execute a command on a site\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge commands <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Config command — manage forge configuration\n */\n\nimport {\n createConfigStore,\n setToken,\n deleteToken,\n getToken,\n getOrganizationSlug,\n setOrganizationSlug,\n} from \"../config.ts\";\nimport { OutputFormatter } from \"../output.ts\";\nimport { type OutputFormat, isOutputFormat } from \"../types.ts\";\nimport { colors } from \"../utils/colors.ts\";\n\nexport function showConfigHelp(): void {\n console.log(`\n${colors.bold(\"forge config\")} - Manage CLI configuration\n\n${colors.bold(\"USAGE:\")}\n forge config <subcommand> [key] [value]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n set <key> <value> Save a config value\n get Show current configuration (masked)\n delete Delete all stored configuration\n\n${colors.bold(\"CONFIG KEYS:\")}\n apiToken Forge API token (scoped, from Forge dashboard)\n organizationSlug Default organization slug (e.g. 'studio-meta')\n\n${colors.bold(\"EXAMPLES:\")}\n forge config set apiToken YOUR_FORGE_TOKEN\n forge config set organizationSlug studio-meta\n forge config get\n forge config delete\n`);\n}\n\nexport function handleConfigCommand(\n subcommand: string,\n args: string[],\n options: Record<string, string | boolean | string[]>,\n): void {\n const rawFormat = options.format ?? options.f ?? \"human\";\n const format: OutputFormat = isOutputFormat(rawFormat) ? rawFormat : \"human\";\n const formatter = new OutputFormatter(format, options[\"no-color\"] === true);\n\n const store = createConfigStore();\n\n switch (subcommand) {\n case \"set\": {\n const [key, value] = args;\n if (!key || !value) {\n formatter.error(\"Usage: forge config set <key> <value>\");\n formatter.info(\"Keys: apiToken, organizationSlug\");\n process.exit(1);\n return;\n }\n\n switch (key) {\n case \"apiToken\":\n setToken(value, store);\n formatter.success(\"API token saved.\");\n break;\n case \"organizationSlug\":\n setOrganizationSlug(value, store);\n formatter.success(`Organization slug set to \"${value}\".`);\n break;\n default:\n formatter.error(`Unknown config key: ${key}`);\n formatter.info(\"Valid keys: apiToken, organizationSlug\");\n process.exit(1);\n }\n break;\n }\n\n case \"get\": {\n const token = getToken(store);\n const orgSlug = getOrganizationSlug(store);\n\n if (format === \"json\") {\n formatter.output({\n apiToken: token ? maskToken(token) : null,\n organizationSlug: orgSlug ?? null,\n });\n } else {\n if (token) {\n console.log(`apiToken: ${maskToken(token)}`);\n } else {\n formatter.warning(\"No API token configured.\");\n }\n if (orgSlug) {\n console.log(`organizationSlug: ${orgSlug}`);\n } else {\n formatter.warning(\"No organization slug configured.\");\n }\n\n if (!token || !orgSlug) {\n formatter.info(\"Run: forge config set <key> <value>\");\n }\n }\n break;\n }\n\n case \"delete\": {\n deleteToken(store);\n formatter.success(\"Configuration deleted.\");\n break;\n }\n\n default:\n showConfigHelp();\n break;\n }\n}\n\nfunction maskToken(token: string): string {\n return token.length > 8\n ? `${token.slice(0, 4)}${\"*\".repeat(token.length - 8)}${token.slice(-4)}`\n : \"****\";\n}\n","import { listDaemons, getDaemon, restartDaemon, updateDaemon } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function daemonsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge daemons list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDaemons({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"user\", \"status\"],\n \"No daemons found.\",\n (d) => `${String(d.id).padEnd(8)} ${d.command.padEnd(50)} ${d.user.padEnd(16)} ${d.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function daemonsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons get <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons get <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDaemon({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"directory\",\n \"processes\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function daemonsUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const options: Record<string, string> = { server_id, id, name };\n if (ctx.options.config) {\n options.config = String(ctx.options.config);\n }\n const result = await updateDaemon(options as never, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"directory\",\n \"processes\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function daemonsRestart(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons restart <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons restart <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await restartDaemon({ server_id, id }, execCtx);\n ctx.formatter.success(`Daemon ${id} restarted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { daemonsList, daemonsGet, daemonsRestart, daemonsUpdate } from \"./handlers.ts\";\n\nexport const handleDaemonsCommand = createCommandRouter({\n resource: \"daemons\",\n handlers: {\n list: daemonsList,\n ls: daemonsList,\n get: [daemonsGet, \"args\"],\n restart: [daemonsRestart, \"args\"],\n update: [daemonsUpdate, \"args\"],\n },\n writeSubcommands: [\"restart\", \"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDaemonsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge daemons list\")} - List daemons on a server\n\n${colors.bold(\"USAGE:\")}\n forge daemons list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge daemons get\")} - Get daemon details\n\n${colors.bold(\"USAGE:\")}\n forge daemons get <daemon_id> --server <server_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge daemons update\")} - Update a daemon\n\n${colors.bold(\"USAGE:\")}\n forge daemons update <daemon_id> --server <server_id> --name <name> [--config <config>]\n`);\n } else if (subcommand === \"restart\") {\n console.log(`\n${colors.bold(\"forge daemons restart\")} - Restart a daemon\n\n${colors.bold(\"USAGE:\")}\n forge daemons restart <daemon_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge daemons\")} - Manage daemons\n\n${colors.bold(\"USAGE:\")}\n forge daemons <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List daemons\n get <id> Get daemon details\n update <id> Update a daemon\n restart <id> Restart a daemon\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge daemons <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listDatabases, getDatabase } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function databasesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge databases list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDatabases({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No databases found.\",\n (db) => `${String(db.id).padEnd(8)} ${db.name.padEnd(30)} ${db.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function databasesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"database_id\",\n \"forge databases get <database_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge databases get <database_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDatabase({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { databasesList, databasesGet } from \"./handlers.ts\";\n\nexport const handleDatabasesCommand = createCommandRouter({\n resource: \"databases\",\n handlers: {\n list: databasesList,\n ls: databasesList,\n get: [databasesGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDatabasesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge databases list\")} - List databases on a server\n\n${colors.bold(\"USAGE:\")}\n forge databases list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge databases get\")} - Get database details\n\n${colors.bold(\"USAGE:\")}\n forge databases get <database_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge databases\")} - Manage databases\n\n${colors.bold(\"USAGE:\")}\n forge databases <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge db\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List databases\n get <id> Get database details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge databases <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createDatabaseUser,\n deleteDatabaseUser,\n getDatabaseUser,\n listDatabaseUsers,\n updateDatabaseUser,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function databaseUsersList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDatabaseUsers({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No database users found.\",\n (u) => `${String(u.id).padEnd(8)} ${u.name.padEnd(30)} ${u.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function databaseUsersGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users get <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users get <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDatabaseUser({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n const password = String(ctx.options.password ?? \"\");\n const databasesRaw = ctx.options.databases;\n const databases = Array.isArray(databasesRaw)\n ? databasesRaw.map(Number)\n : databasesRaw\n ? [Number(databasesRaw)]\n : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n if (!password) {\n exitWithValidationError(\n \"password\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createDatabaseUser(\n { server_id, name, password, ...(databases ? { databases } : {}) },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const password = ctx.options.password != null ? String(ctx.options.password) : undefined;\n const databaseIdsRaw = ctx.options[\"database-ids\"] ?? ctx.options.database_ids;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users update <user_id> --server <server_id> [--password <password>] [--database-ids <ids>]\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users update <user_id> --server <server_id> [--password <password>] [--database-ids <ids>]\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await updateDatabaseUser(\n {\n server_id,\n id,\n ...(password !== undefined ? { password } : {}),\n ...(database_ids ? { database_ids } : {}),\n },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users delete <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users delete <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteDatabaseUser({ server_id, id }, execCtx);\n ctx.formatter.success(`Database user ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n databaseUsersCreate,\n databaseUsersDelete,\n databaseUsersGet,\n databaseUsersList,\n databaseUsersUpdate,\n} from \"./handlers.ts\";\n\nexport const handleDatabaseUsersCommand = createCommandRouter({\n resource: \"database-users\",\n handlers: {\n list: databaseUsersList,\n ls: databaseUsersList,\n get: [databaseUsersGet, \"args\"],\n create: databaseUsersCreate,\n update: [databaseUsersUpdate, \"args\"],\n delete: [databaseUsersDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDatabaseUsersHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge database-users list\")} - List database users on a server\n\n${colors.bold(\"USAGE:\")}\n forge database-users list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge database-users get\")} - Get database user details\n\n${colors.bold(\"USAGE:\")}\n forge database-users get <user_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge database-users create\")} - Create a new database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users create --server <server_id> --name <name> --password <password> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> Database user name (required)\n --password <pass> User password (required)\n --databases <ids> Comma-separated database IDs to grant access to (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge database-users update\")} - Update a database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users update <user_id> --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --password <pass> New password (optional)\n --database-ids <ids> Comma-separated database IDs (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge database-users delete\")} - Delete a database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users delete <user_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge database-users\")} - Manage database users\n\n${colors.bold(\"USAGE:\")}\n forge database-users <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List database users\n get <id> Get database user details\n create Create a new database user\n update <id> Update a database user\n delete <id> Delete a database user\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge database-users <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listDeployments, deploySiteAndWait } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function deploymentsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge deployments list --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge deployments list --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listDeployments({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"status\", \"commit\", \"started_at\"],\n \"No deployments found.\",\n (d) =>\n `${String(d.id).padEnd(8)} ${d.status.padEnd(12)} ${(d.commit.hash ?? \"—\").padEnd(10)} ${d.started_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function deploymentsDeploy(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const streamLogs = Boolean(ctx.options.stream);\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge deployments deploy --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge deployments deploy --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n\n const result = await deploySiteAndWait(\n {\n server_id,\n site_id,\n // Use either progress callback OR log streaming, not both\n onProgress: streamLogs\n ? undefined\n : ({ status, elapsed_ms }) => {\n process.stderr.write(`\\rDeploying… ${status} (${(elapsed_ms / 1000).toFixed(1)}s)`);\n },\n onLog: streamLogs\n ? (chunk) => {\n process.stdout.write(chunk);\n }\n : undefined,\n },\n execCtx,\n );\n\n // Clear the progress line (only needed in non-stream mode)\n if (!streamLogs) {\n process.stderr.write(\"\\n\");\n }\n\n const elapsedSec = (result.data.elapsed_ms / 1000).toFixed(1);\n\n if (result.data.status === \"success\") {\n ctx.formatter.success(`Deployment succeeded for site ${site_id} (${elapsedSec}s).`);\n } else {\n ctx.formatter.error(`Deployment failed for site ${site_id} (${elapsedSec}s).`);\n }\n\n // Only output full log if we didn't stream it\n if (!streamLogs && result.data.log) {\n ctx.formatter.output(result.data.log);\n }\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { deploymentsList, deploymentsDeploy } from \"./handlers.ts\";\n\nexport const handleDeploymentsCommand = createCommandRouter({\n resource: \"deployments\",\n handlers: {\n list: deploymentsList,\n ls: deploymentsList,\n deploy: deploymentsDeploy,\n },\n writeSubcommands: [\"deploy\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDeploymentsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge deployments list\")} - List deployments for a site\n\n${colors.bold(\"USAGE:\")}\n forge deployments list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"deploy\") {\n console.log(`\n${colors.bold(\"forge deployments deploy\")} - Trigger a deployment\n\n${colors.bold(\"USAGE:\")}\n forge deployments deploy --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --stream Stream deployment logs in real-time (default: show progress)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge deployments\")} - Manage deployments\n\n${colors.bold(\"USAGE:\")}\n forge deployments <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge d\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List deployments for a site\n deploy Trigger a deployment\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge deployments <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getEnv, updateEnv } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function envGet(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge env get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge env get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getEnv({ server_id, site_id }, execCtx);\n if (ctx.formatter.isJson()) {\n console.log(JSON.stringify({ content: result.data }));\n } else {\n console.log(result.data);\n }\n }, ctx.formatter);\n}\n\nexport async function envUpdate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await updateEnv({ server_id, site_id, content }, execCtx);\n ctx.formatter.success(\"Environment variables updated.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { envGet, envUpdate } from \"./handlers.ts\";\n\nexport const handleEnvCommand = createCommandRouter({\n resource: \"env\",\n handlers: {\n get: envGet,\n update: envUpdate,\n },\n writeSubcommands: [\"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showEnvHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge env get\")} - Get environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env get --server <server_id> --site <site_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge env update\")} - Update environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env update --server <server_id> --site <site_id> --content <env_content>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge env\")} - Manage environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get environment variables\n update Update environment variables\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --content <str> New env content (for update)\n -f, --format <fmt> Output format: json, human\n\nRun ${colors.cyan(\"forge env <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listFirewallRules, getFirewallRule } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function firewallRulesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge firewall-rules list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listFirewallRules({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"port\", \"type\", \"ip_address\", \"status\"],\n \"No firewall rules found.\",\n (r) =>\n `${String(r.id).padEnd(8)} ${r.name.padEnd(20)} ${String(r.port).padEnd(8)} ${r.type.padEnd(8)} ${(r.ip_address ?? \"any\").padEnd(16)} ${r.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function firewallRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"firewall_rule_id\",\n \"forge firewall-rules get <rule_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge firewall-rules get <rule_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getFirewallRule({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"port\",\n \"type\",\n \"ip_address\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { firewallRulesList, firewallRulesGet } from \"./handlers.ts\";\n\nexport const handleFirewallRulesCommand = createCommandRouter({\n resource: \"firewall-rules\",\n handlers: {\n list: firewallRulesList,\n ls: firewallRulesList,\n get: [firewallRulesGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showFirewallRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge firewall-rules list\")} - List firewall rules on a server\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge firewall-rules get\")} - Get firewall rule details\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules get <rule_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge firewall-rules\")} - Manage firewall rules\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge fw\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List firewall rules\n get <id> Get firewall rule details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge firewall-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","import { createMonitor, deleteMonitor, getMonitor, listMonitors } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function monitorsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge monitors list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listMonitors({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"type\", \"operator\", \"threshold\", \"state\"],\n \"No monitors found.\",\n (m) =>\n `${String(m.id).padEnd(8)} ${m.type.padEnd(20)} ${m.operator.padEnd(8)} ${String(m.threshold).padEnd(6)} ${m.state}`,\n );\n }, ctx.formatter);\n}\n\nexport async function monitorsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"monitor_id\",\n \"forge monitors get <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors get <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getMonitor({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"operator\",\n \"threshold\",\n \"minutes\",\n \"state\",\n \"state_changed_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function monitorsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const type = String(ctx.options.type ?? \"\");\n const operator = String(ctx.options.operator ?? \"\");\n const threshold = Number(ctx.options.threshold ?? 0);\n const notify = String(ctx.options.notify ?? \"\");\n const minutes = Number(ctx.options.minutes ?? 0);\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n if (!type) {\n exitWithValidationError(\n \"type\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n if (!operator) {\n exitWithValidationError(\n \"operator\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createMonitor(\n { server_id, type, operator, threshold, notify, minutes },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"operator\",\n \"threshold\",\n \"minutes\",\n \"state\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function monitorsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"monitor_id\",\n \"forge monitors delete <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors delete <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteMonitor({ server_id, id }, execCtx);\n ctx.formatter.success(`Monitor ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { monitorsCreate, monitorsDelete, monitorsGet, monitorsList } from \"./handlers.ts\";\n\nexport const handleMonitorsCommand = createCommandRouter({\n resource: \"monitors\",\n handlers: {\n list: monitorsList,\n ls: monitorsList,\n get: [monitorsGet, \"args\"],\n create: monitorsCreate,\n delete: [monitorsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showMonitorsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge monitors list\")} - List monitors on a server\n\n${colors.bold(\"USAGE:\")}\n forge monitors list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge monitors get\")} - Get monitor details\n\n${colors.bold(\"USAGE:\")}\n forge monitors get <monitor_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge monitors create\")} - Create a new monitor\n\n${colors.bold(\"USAGE:\")}\n forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --type <type> Monitor type (required)\n --operator <op> Comparison operator (required)\n --threshold <num> Alert threshold value (required)\n --minutes <num> Duration in minutes (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge monitors delete\")} - Delete a monitor\n\n${colors.bold(\"USAGE:\")}\n forge monitors delete <monitor_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge monitors\")} - Manage server monitors\n\n${colors.bold(\"USAGE:\")}\n forge monitors <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List monitors\n get <id> Get monitor details\n create Create a new monitor\n delete <id> Delete a monitor\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge monitors <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getNginxConfig, updateNginxConfig } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function nginxGet(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge nginx get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getNginxConfig({ server_id, site_id }, execCtx);\n if (ctx.formatter.isJson()) {\n console.log(JSON.stringify({ content: result.data }));\n } else {\n console.log(result.data);\n }\n }, ctx.formatter);\n}\n\nexport async function nginxUpdate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await updateNginxConfig({ server_id, site_id, content }, execCtx);\n ctx.formatter.success(\"Nginx configuration updated.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { nginxGet, nginxUpdate } from \"./handlers.ts\";\n\nexport const handleNginxCommand = createCommandRouter({\n resource: \"nginx\",\n handlers: {\n get: nginxGet,\n update: nginxUpdate,\n },\n writeSubcommands: [\"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showNginxHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge nginx get\")} - Get nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx get --server <server_id> --site <site_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge nginx update\")} - Update nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx update --server <server_id> --site <site_id> --content <nginx_config>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge nginx\")} - Manage nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get nginx configuration\n update Update nginx configuration\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --content <str> New nginx config (for update)\n\nRun ${colors.cyan(\"forge nginx <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createNginxTemplate,\n deleteNginxTemplate,\n getNginxTemplate,\n listNginxTemplates,\n updateNginxTemplate,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function nginxTemplatesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listNginxTemplates({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"created_at\"],\n \"No Nginx templates found.\",\n (t) => `${String(t.id).padEnd(8)} ${t.name.padEnd(40)} ${t.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates get <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates get <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getNginxTemplate({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\", \"content\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createNginxTemplate({ server_id, name, content }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates update <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates update <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const name = ctx.options.name ? String(ctx.options.name) : undefined;\n const content = ctx.options.content ? String(ctx.options.content) : undefined;\n const result = await updateNginxTemplate({ server_id, id, name, content }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates delete <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates delete <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteNginxTemplate({ server_id, id }, execCtx);\n ctx.formatter.success(`Nginx template ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n nginxTemplatesCreate,\n nginxTemplatesDelete,\n nginxTemplatesGet,\n nginxTemplatesList,\n nginxTemplatesUpdate,\n} from \"./handlers.ts\";\n\nexport const handleNginxTemplatesCommand = createCommandRouter({\n resource: \"nginx-templates\",\n handlers: {\n list: nginxTemplatesList,\n ls: nginxTemplatesList,\n get: [nginxTemplatesGet, \"args\"],\n create: nginxTemplatesCreate,\n update: [nginxTemplatesUpdate, \"args\"],\n delete: [nginxTemplatesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showNginxTemplatesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge nginx-templates list\")} - List Nginx templates on a server\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge nginx-templates get\")} - Get Nginx template details\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates get <template_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge nginx-templates create\")} - Create a new Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates create --server <server_id> --name <name> --content <content> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> Template name (required)\n --content <text> Template content (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge nginx-templates update\")} - Update an Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates update <template_id> --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> New template name (optional)\n --content <text> New template content (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge nginx-templates delete\")} - Delete an Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates delete <template_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge nginx-templates\")} - Manage Nginx templates\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List Nginx templates\n get <id> Get Nginx template details\n create Create a new Nginx template\n update <id> Update an Nginx template\n delete <id> Delete an Nginx template\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge nginx-templates <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listRecipes, getRecipe, runRecipe, updateRecipe } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\n\nexport async function recipesList(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await listRecipes({}, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"user\", \"created_at\"],\n \"No recipes found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.name.padEnd(40)} ${r.user.padEnd(16)} ${r.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function recipesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n\n if (!id) {\n exitWithValidationError(\"id\", \"forge recipes get <recipe_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await getRecipe({ id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"user\", \"created_at\", \"script\"]);\n }, ctx.formatter);\n}\n\nexport async function recipesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n\n if (!id) {\n exitWithValidationError(\n \"id\",\n \"forge recipes update <recipe_id> [--name ...] [--user ...] [--script ...]\",\n ctx.formatter,\n );\n }\n\n const name = ctx.options.name as string | undefined;\n const user = ctx.options.user as string | undefined;\n const script = ctx.options.script as string | undefined;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await updateRecipe({ id, name, user, script }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"user\", \"created_at\", \"script\"]);\n }, ctx.formatter);\n}\n\nexport async function recipesRun(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const serversRaw = String(ctx.options.servers ?? \"\");\n\n if (!id) {\n exitWithValidationError(\"id\", \"forge recipes run <recipe_id> --servers <ids>\", ctx.formatter);\n }\n\n if (!serversRaw) {\n exitWithValidationError(\n \"servers\",\n \"forge recipes run <recipe_id> --servers <server_id1,server_id2,...>\",\n ctx.formatter,\n );\n }\n\n const servers = serversRaw\n .split(\",\")\n .map((s) => Number(s.trim()))\n .filter((n) => !isNaN(n));\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n await runRecipe({ id, servers }, execCtx);\n ctx.formatter.success(`Recipe ${id} dispatched to ${servers.length} server(s).`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { recipesList, recipesGet, recipesRun, recipesUpdate } from \"./handlers.ts\";\n\nexport const handleRecipesCommand = createCommandRouter({\n resource: \"recipes\",\n handlers: {\n list: recipesList,\n ls: recipesList,\n get: [recipesGet, \"args\"],\n update: [recipesUpdate, \"args\"],\n run: [recipesRun, \"args\"],\n },\n writeSubcommands: [\"update\", \"run\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showRecipesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge recipes list\")} - List all recipes\n\n${colors.bold(\"USAGE:\")}\n forge recipes list [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge recipes get\")} - Get recipe details\n\n${colors.bold(\"USAGE:\")}\n forge recipes get <recipe_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge recipes update\")} - Update a recipe\n\n${colors.bold(\"USAGE:\")}\n forge recipes update <recipe_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --name <name> New recipe name\n --user <user> New recipe user\n --script <script> New recipe script\n`);\n } else if (subcommand === \"run\") {\n console.log(`\n${colors.bold(\"forge recipes run\")} - Run a recipe on servers\n\n${colors.bold(\"USAGE:\")}\n forge recipes run <recipe_id> --servers <server_id1,server_id2,...>\n\n${colors.bold(\"OPTIONS:\")}\n --servers <ids> Comma-separated server IDs to run recipe on\n`);\n } else {\n console.log(`\n${colors.bold(\"forge recipes\")} - Manage recipes\n\n${colors.bold(\"USAGE:\")}\n forge recipes <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List all recipes\n get <id> Get recipe details\n update <id> Update a recipe\n run <id> Run a recipe on servers\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge recipes <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createRedirectRule,\n deleteRedirectRule,\n getRedirectRule,\n listRedirectRules,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function redirectRulesList(ctx: CommandContext): Promise<void> {\n const usage = \"forge redirect-rules list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listRedirectRules({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"from\", \"to\", \"type\"],\n \"No redirect rules found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.from.padEnd(30)} ${r.to.padEnd(30)} ${r.type}`,\n );\n }, ctx.formatter);\n}\n\nexport async function redirectRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge redirect-rules get <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getRedirectRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"from\", \"to\", \"type\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function redirectRulesCreate(ctx: CommandContext): Promise<void> {\n const usage =\n \"forge redirect-rules create --server <server_id> --site <site_id> --from <from> --to <to>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const from = String(ctx.options.from ?? \"\");\n const to = String(ctx.options.to ?? \"\");\n const type = String(ctx.options.type ?? \"redirect\");\n\n if (!from) {\n exitWithValidationError(\"from\", usage, ctx.formatter);\n }\n\n if (!to) {\n exitWithValidationError(\"to\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await createRedirectRule({ server_id, site_id, from, to, type }, execCtx);\n ctx.formatter.success(\"Redirect rule created.\");\n }, ctx.formatter);\n}\n\nexport async function redirectRulesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge redirect-rules delete <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await deleteRedirectRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.success(`Redirect rule ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n redirectRulesCreate,\n redirectRulesDelete,\n redirectRulesGet,\n redirectRulesList,\n} from \"./handlers.ts\";\n\nexport const handleRedirectRulesCommand = createCommandRouter({\n resource: \"redirect-rules\",\n handlers: {\n list: redirectRulesList,\n ls: redirectRulesList,\n get: [redirectRulesGet, \"args\"],\n create: redirectRulesCreate,\n delete: [redirectRulesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showRedirectRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge redirect-rules list\")} - List redirect rules for a site\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge redirect-rules get\")} - Get redirect rule details\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules get <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge redirect-rules create\")} - Create a new redirect rule\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules create --server <server_id> --site <site_id> --from <from> --to <to> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --from <path> Source path to redirect from (required)\n --to <path> Destination path to redirect to (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge redirect-rules delete\")} - Delete a redirect rule\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules delete <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge redirect-rules\")} - Manage site redirect rules\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List redirect rules\n get <id> Get redirect rule details\n create Create a new redirect rule\n delete <id> Delete a redirect rule\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge redirect-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createScheduledJob,\n deleteScheduledJob,\n getScheduledJob,\n listScheduledJobs,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function scheduledJobsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await listScheduledJobs({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"frequency\", \"status\"],\n \"No scheduled jobs found.\",\n (j) =>\n `${String(j.id).padEnd(8)} ${j.command.padEnd(50)} ${j.frequency.padEnd(12)} ${j.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"job_id\",\n \"forge scheduled-jobs get <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs get <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await getScheduledJob({ server_id, id, site_id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"frequency\",\n \"cron\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n const command = String(ctx.options.command ?? \"\");\n const user = String(ctx.options.user ?? \"forge\");\n const frequency = String(ctx.options.frequency ?? \"custom\");\n const cron = ctx.options.cron ? String(ctx.options.cron) : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs create --server <server_id> --command <command> --user <user> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!command) {\n exitWithValidationError(\n \"command\",\n \"forge scheduled-jobs create --server <server_id> --command <command> --user <user> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await createScheduledJob(\n { server_id, site_id, command, user, frequency, cron },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"frequency\",\n \"cron\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"job_id\",\n \"forge scheduled-jobs delete <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs delete <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n await deleteScheduledJob({ server_id, id, site_id }, execCtx);\n ctx.formatter.success(`Scheduled job ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n scheduledJobsCreate,\n scheduledJobsDelete,\n scheduledJobsGet,\n scheduledJobsList,\n} from \"./handlers.ts\";\n\nexport const handleScheduledJobsCommand = createCommandRouter({\n resource: \"scheduled-jobs\",\n handlers: {\n list: scheduledJobsList,\n ls: scheduledJobsList,\n get: [scheduledJobsGet, \"args\"],\n create: scheduledJobsCreate,\n delete: [scheduledJobsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showScheduledJobsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs list\")} - List scheduled jobs on a server\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs get\")} - Get scheduled job details\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs get <job_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs create\")} - Create a new scheduled job\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs create --server <server_id> --command <command> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --command <cmd> Command to run (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs delete\")} - Delete a scheduled job\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs delete <job_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge scheduled-jobs\")} - Manage scheduled jobs (cron)\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List scheduled jobs\n get <id> Get scheduled job details\n create Create a new scheduled job\n delete <id> Delete a scheduled job\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge scheduled-jobs <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createSecurityRule,\n deleteSecurityRule,\n getSecurityRule,\n listSecurityRules,\n updateSecurityRule,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function securityRulesList(ctx: CommandContext): Promise<void> {\n const usage = \"forge security-rules list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listSecurityRules({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"path\"],\n \"No security rules found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.name.padEnd(30)} ${r.path ?? \"—\"}`,\n );\n }, ctx.formatter);\n}\n\nexport async function securityRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge security-rules get <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getSecurityRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesCreate(ctx: CommandContext): Promise<void> {\n const usage = \"forge security-rules create --server <server_id> --site <site_id> --name <name>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const name = String(ctx.options.name ?? \"\");\n\n if (!name) {\n exitWithValidationError(\"name\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await createSecurityRule({ server_id, site_id, name, credentials: [] }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage =\n \"forge security-rules update <rule_id> --server <server_id> --site <site_id> --name <name>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const name = String(ctx.options.name ?? \"\");\n\n if (!name) {\n exitWithValidationError(\"name\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await updateSecurityRule(\n { server_id, site_id, id, name, credentials: [] },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge security-rules delete <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await deleteSecurityRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.success(`Security rule ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n securityRulesCreate,\n securityRulesDelete,\n securityRulesGet,\n securityRulesList,\n securityRulesUpdate,\n} from \"./handlers.ts\";\n\nexport const handleSecurityRulesCommand = createCommandRouter({\n resource: \"security-rules\",\n handlers: {\n list: securityRulesList,\n ls: securityRulesList,\n get: [securityRulesGet, \"args\"],\n create: securityRulesCreate,\n update: [securityRulesUpdate, \"args\"],\n delete: [securityRulesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSecurityRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge security-rules list\")} - List security rules for a site\n\n${colors.bold(\"USAGE:\")}\n forge security-rules list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge security-rules get\")} - Get security rule details\n\n${colors.bold(\"USAGE:\")}\n forge security-rules get <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge security-rules create\")} - Create a new security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules create --server <server_id> --site <site_id> --name <name> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --name <name> Security rule name (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge security-rules update\")} - Update a security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules update <rule_id> --server <server_id> --site <site_id> --name <name> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --name <name> Security rule name (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge security-rules delete\")} - Delete a security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules delete <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge security-rules\")} - Manage site security rules\n\n${colors.bold(\"USAGE:\")}\n forge security-rules <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List security rules\n get <id> Get security rule details\n create Create a new security rule\n update <id> Update a security rule\n delete <id> Delete a security rule\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge security-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * CLI handlers for servers commands.\n * Delegates all HTTP logic to forge-core executors.\n */\n\nimport { listServers, getServer, rebootServer } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\n/**\n * List all servers.\n */\nexport async function serversList(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await listServers({}, execCtx);\n\n const format = String(ctx.options.format ?? ctx.options.f ?? \"human\");\n\n if (format === \"table\" || format === \"json\") {\n ctx.formatter.output(result.data);\n } else {\n if (result.data.length === 0) {\n ctx.formatter.info(\"No servers found.\");\n return;\n }\n for (const server of result.data) {\n console.log(\n `${String(server.id).padEnd(8)} ${server.name.padEnd(30)} ${(server.ip_address ?? \"—\").padEnd(16)} ${server.is_ready ? \"ready\" : \"provisioning\"}`,\n );\n }\n }\n }, ctx.formatter);\n}\n\n/**\n * Get a single server by ID or name.\n */\nexport async function serversGet(args: string[], ctx: CommandContext): Promise<void> {\n const [server] = args;\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge servers get <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getServer({ server_id }, execCtx);\n ctx.formatter.output(result.data);\n }, ctx.formatter);\n}\n\n/**\n * Reboot a server by ID or name.\n */\nexport async function serversReboot(args: string[], ctx: CommandContext): Promise<void> {\n const [server] = args;\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge servers reboot <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await rebootServer({ server_id }, execCtx);\n ctx.formatter.success(`Server ${server_id} reboot initiated.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { serversList, serversGet, serversReboot } from \"./handlers.ts\";\n\nexport const handleServersCommand = createCommandRouter({\n resource: \"servers\",\n handlers: {\n list: serversList,\n ls: serversList,\n get: [serversGet, \"args\"],\n reboot: [serversReboot, \"args\"],\n },\n writeSubcommands: [\"reboot\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showServersHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge servers list\")} - List all servers\n\n${colors.bold(\"USAGE:\")}\n forge servers list [options]\n\n${colors.bold(\"OPTIONS:\")}\n --token <token> Forge API token\n -f, --format <fmt> Output format: json, human, table (default: human)\n --no-color Disable colored output\n -h, --help Show this help\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers list\n forge servers list --format json\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge servers get\")} - Get server details\n\n${colors.bold(\"USAGE:\")}\n forge servers get <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <server_id> Server ID (required)\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers get 123\n forge servers get 123 --format json\n`);\n } else if (subcommand === \"reboot\") {\n console.log(`\n${colors.bold(\"forge servers reboot\")} - Reboot a server\n\n${colors.bold(\"USAGE:\")}\n forge servers reboot <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <server_id> Server ID (required)\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers reboot 123\n`);\n } else {\n console.log(`\n${colors.bold(\"forge servers\")} - Manage servers\n\n${colors.bold(\"USAGE:\")}\n forge servers <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge s\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List all servers\n get <id> Get server details\n reboot <id> Reboot a server\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n -h, --help Show help for a subcommand\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers list\n forge servers get 123\n\nRun ${colors.cyan(\"forge servers <subcommand> --help\")} for subcommand details.\n`);\n }\n}\n","import { listSites, getSite, updateSite } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function sitesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge sites list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listSites({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\", \"php_version\"],\n \"No sites found.\",\n (s) =>\n `${String(s.id).padEnd(8)} ${s.name.padEnd(40)} ${s.status.padEnd(12)} ${s.php_version}`,\n );\n }, ctx.formatter);\n}\n\nexport async function sitesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [site_id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!site_id) {\n exitWithValidationError(\n \"site_id\",\n \"forge sites get <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge sites get <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getSite({ server_id, site_id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"status\",\n \"php_version\",\n \"app_type\",\n \"repository\",\n \"quick_deploy\",\n \"deployment_status\",\n \"https\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function sitesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [site_id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!site_id) {\n exitWithValidationError(\n \"site_id\",\n \"forge sites update <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge sites update <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await updateSite(\n {\n server_id,\n site_id,\n root_path: ctx.options.root_path as string | undefined,\n directory: ctx.options.directory as string | undefined,\n type: ctx.options.type as string | undefined,\n php_version: ctx.options.php_version as string | undefined,\n push_to_deploy:\n ctx.options.push_to_deploy !== undefined\n ? ctx.options.push_to_deploy === \"true\" || ctx.options.push_to_deploy === true\n : undefined,\n repository_branch: ctx.options.repository_branch as string | undefined,\n },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"status\",\n \"php_version\",\n \"app_type\",\n \"repository\",\n \"quick_deploy\",\n \"deployment_status\",\n \"https\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { sitesList, sitesGet, sitesUpdate } from \"./handlers.ts\";\n\nexport const handleSitesCommand = createCommandRouter({\n resource: \"sites\",\n handlers: {\n list: sitesList,\n ls: sitesList,\n get: [sitesGet, \"args\"],\n update: [sitesUpdate, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSitesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge sites list\")} - List sites on a server\n\n${colors.bold(\"USAGE:\")}\n forge sites list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"EXAMPLES:\")}\n forge sites list --server 123\n forge sites list --server 123 --format json\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge sites get\")} - Get site details\n\n${colors.bold(\"USAGE:\")}\n forge sites get <site_id> --server <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <site_id> Site ID (required)\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge sites\")} - Manage sites\n\n${colors.bold(\"USAGE:\")}\n forge sites <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List sites on a server\n get <id> Get site details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required for most commands)\n -f, --format <fmt> Output format: json, human, table\n -h, --help Show help for a subcommand\n\n${colors.bold(\"EXAMPLES:\")}\n forge sites list --server 123\n forge sites get 456 --server 123\n\nRun ${colors.cyan(\"forge sites <subcommand> --help\")} for subcommand details.\n`);\n }\n}\n","import { listSshKeys, getSshKey } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function sshKeysList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge ssh-keys list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listSshKeys({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No SSH keys found.\",\n (k) => `${String(k.id).padEnd(8)} ${k.name.padEnd(30)} ${k.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function sshKeysGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"ssh_key_id\",\n \"forge ssh-keys get <key_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge ssh-keys get <key_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getSshKey({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { sshKeysList, sshKeysGet } from \"./handlers.ts\";\n\nexport const handleSshKeysCommand = createCommandRouter({\n resource: \"ssh-keys\",\n handlers: {\n list: sshKeysList,\n ls: sshKeysList,\n get: [sshKeysGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSshKeysHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge ssh-keys list\")} - List SSH keys on a server\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge ssh-keys get\")} - Get SSH key details\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys get <key_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge ssh-keys\")} - Manage SSH keys\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List SSH keys\n get <id> Get SSH key details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge ssh-keys <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getUser } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { runCommand } from \"../../error-handler.ts\";\n\nexport async function userGet(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await getUser({}, execCtx);\n ctx.formatter.output(result.data);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { userGet } from \"./handlers.ts\";\n\nexport const handleUserCommand = createCommandRouter({\n resource: \"user\",\n handlers: {\n get: userGet,\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showUserHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge user get\")} - Get the authenticated user profile\n\n${colors.bold(\"USAGE:\")}\n forge user get [options]\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge user\")} - Display authenticated user profile\n\n${colors.bold(\"USAGE:\")}\n forge user [subcommand] [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get the authenticated user profile\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge user <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Simple argument parser using native Node.js.\n * Parses process.argv into a structured format with no external deps.\n */\n\nexport type OptionValue = string | boolean | string[];\nexport type CommandOptions = Record<string, OptionValue>;\n\nexport interface ParsedArgs {\n command: string[];\n options: Record<string, OptionValue>;\n positional: string[];\n}\n\nexport function parseArgs(argv: string[] = process.argv.slice(2)): ParsedArgs {\n const options: Record<string, string | boolean | string[]> = {};\n const positional: string[] = [];\n const command: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key value or --flag\n const equalIndex = arg.indexOf(\"=\");\n if (equalIndex > -1) {\n const key = arg.slice(2, equalIndex);\n const value = arg.slice(equalIndex + 1);\n options[key] = value;\n } else {\n const key = arg.slice(2);\n const nextArg = argv[i + 1];\n\n if (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n options[key] = nextArg;\n i++;\n } else {\n options[key] = true;\n }\n }\n } else if (arg.startsWith(\"-\") && arg.length > 1) {\n // Short option: -k value or -abc (multiple flags)\n if (arg.length === 2) {\n const key = arg[1];\n const nextArg = argv[i + 1];\n\n if (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n options[key] = nextArg;\n i++;\n } else {\n options[key] = true;\n }\n } else {\n // Multiple short flags: -abc -> -a -b -c\n for (let j = 1; j < arg.length; j++) {\n options[arg[j]] = true;\n }\n }\n } else {\n // Positional argument or command\n // First two non-option args are command and subcommand\n if (command.length < 2) {\n command.push(arg);\n } else {\n positional.push(arg);\n }\n }\n }\n\n return { command, options, positional };\n}\n\nexport function getOption(\n options: Record<string, OptionValue>,\n names: string[],\n defaultValue?: string,\n): string | undefined {\n for (const name of names) {\n if (name in options) {\n const value = options[name];\n return typeof value === \"string\" ? value : undefined;\n }\n }\n return defaultValue;\n}\n\nexport function hasFlag(options: Record<string, OptionValue>, names: string[]): boolean {\n return names.some((name) => options[name] === true);\n}\n","#!/usr/bin/env node\n\nimport { handleBackupsCommand, showBackupsHelp } from \"./commands/backups/index.ts\";\nimport { handleCompletionCommand, showCompletionHelp } from \"./commands/completion.ts\";\nimport { handleCertificatesCommand, showCertificatesHelp } from \"./commands/certificates/index.ts\";\nimport { handleCommandsCommand, showCommandsHelp } from \"./commands/commands/index.ts\";\nimport { handleConfigCommand, showConfigHelp } from \"./commands/config.ts\";\nimport { handleDaemonsCommand, showDaemonsHelp } from \"./commands/daemons/index.ts\";\nimport { handleDatabasesCommand, showDatabasesHelp } from \"./commands/databases/index.ts\";\nimport {\n handleDatabaseUsersCommand,\n showDatabaseUsersHelp,\n} from \"./commands/database-users/index.ts\";\nimport { handleDeploymentsCommand, showDeploymentsHelp } from \"./commands/deployments/index.ts\";\nimport { handleEnvCommand, showEnvHelp } from \"./commands/env/index.ts\";\nimport {\n handleFirewallRulesCommand,\n showFirewallRulesHelp,\n} from \"./commands/firewall-rules/index.ts\";\nimport { handleMonitorsCommand, showMonitorsHelp } from \"./commands/monitors/index.ts\";\nimport { handleNginxCommand, showNginxHelp } from \"./commands/nginx/index.ts\";\nimport {\n handleNginxTemplatesCommand,\n showNginxTemplatesHelp,\n} from \"./commands/nginx-templates/index.ts\";\nimport { handleRecipesCommand, showRecipesHelp } from \"./commands/recipes/index.ts\";\nimport {\n handleRedirectRulesCommand,\n showRedirectRulesHelp,\n} from \"./commands/redirect-rules/index.ts\";\nimport {\n handleScheduledJobsCommand,\n showScheduledJobsHelp,\n} from \"./commands/scheduled-jobs/index.ts\";\nimport {\n handleSecurityRulesCommand,\n showSecurityRulesHelp,\n} from \"./commands/security-rules/index.ts\";\nimport { handleServersCommand, showServersHelp } from \"./commands/servers/index.ts\";\nimport { handleSitesCommand, showSitesHelp } from \"./commands/sites/index.ts\";\nimport { handleSshKeysCommand, showSshKeysHelp } from \"./commands/ssh-keys/index.ts\";\nimport { handleUserCommand, showUserHelp } from \"./commands/user/index.ts\";\nimport { colors, setColorEnabled } from \"./utils/colors.ts\";\nimport { parseArgs } from \"./utils/args.ts\";\n\ndeclare const __VERSION__: string;\nconst VERSION = __VERSION__;\n\nfunction showHelp(): void {\n console.log(`\n${colors.bold(\"forge\")} v${VERSION}\n\n${colors.bold(\"USAGE:\")}\n forge <command> [subcommand] [options]\n\n${colors.bold(\"COMMANDS:\")}\n config Manage CLI configuration\n set <token> Save API token\n get Show current token (masked)\n delete Delete stored token\n\n servers, s Manage servers\n list, ls List all servers\n get <id> Get server details\n reboot <id> Reboot a server\n\n sites Manage sites\n list, ls List sites (requires --server)\n get <id> Get site details (requires --server)\n\n deployments, d Manage deployments\n list, ls List deployments (requires --server --site)\n deploy Trigger a deployment (requires --server --site)\n\n databases, db Manage databases\n list, ls List databases (requires --server)\n get <id> Get database details (requires --server)\n\n database-users Manage database users\n list, ls List database users (requires --server)\n get <id> Get database user details (requires --server)\n create Create a database user (requires --server --name --password)\n delete <id> Delete a database user (requires --server)\n\n daemons Manage daemons\n list, ls List daemons (requires --server)\n get <id> Get daemon details (requires --server)\n restart <id> Restart a daemon (requires --server)\n\n env Manage environment variables\n get Get env variables (requires --server --site)\n update Update env variables (requires --server --site --content)\n\n nginx Manage nginx configuration\n get Get nginx config (requires --server --site)\n update Update nginx config (requires --server --site --content)\n\n certificates, certs Manage SSL certificates (per-domain in v2)\n get Get certificate for a domain (requires --server --site --domain)\n get <id> Get certificate details (requires --server --site)\n activate <id> Activate a certificate (requires --server --site)\n\n firewall-rules, fw Manage firewall rules\n list, ls List firewall rules (requires --server)\n get <id> Get firewall rule details (requires --server)\n\n ssh-keys Manage SSH keys\n list, ls List SSH keys (requires --server)\n get <id> Get SSH key details (requires --server)\n\n backups Manage backup configurations\n list, ls List backup configurations (requires --server)\n get <id> Get backup configuration details (requires --server)\n create Create a backup configuration (requires --server --provider --frequency)\n delete <id> Delete a backup configuration (requires --server)\n\n commands Manage site commands\n list, ls List commands (requires --server --site)\n get <id> Get command details (requires --server --site)\n create Execute a command (requires --server --site --command)\n\n scheduled-jobs Manage scheduled jobs (cron)\n list, ls List scheduled jobs (requires --server)\n get <id> Get scheduled job details (requires --server)\n create Create a scheduled job (requires --server --command)\n delete <id> Delete a scheduled job (requires --server)\n\n user Display authenticated user profile\n get Get the authenticated user profile\n\n monitors Manage server monitors\n list, ls List monitors (requires --server)\n get <id> Get monitor details (requires --server)\n create Create a monitor (requires --server --type --operator --threshold --minutes)\n delete <id> Delete a monitor (requires --server)\n\n nginx-templates Manage Nginx templates\n list, ls List Nginx templates (requires --server)\n get <id> Get Nginx template details (requires --server)\n create Create a Nginx template (requires --server --name --content)\n update <id> Update a Nginx template (requires --server)\n delete <id> Delete a Nginx template (requires --server)\n\n security-rules Manage site security rules\n list, ls List security rules (requires --server --site)\n get <id> Get security rule details (requires --server --site)\n create Create a security rule (requires --server --site --name)\n delete <id> Delete a security rule (requires --server --site)\n\n redirect-rules Manage site redirect rules\n list, ls List redirect rules (requires --server --site)\n get <id> Get redirect rule details (requires --server --site)\n create Create a redirect rule (requires --server --site --from --to)\n delete <id> Delete a redirect rule (requires --server --site)\n\n recipes Manage recipes\n list, ls List all recipes\n get <id> Get recipe details\n run <id> Run a recipe (requires --servers)\n\n completion Generate shell completion script\n bash Install Bash completion\n zsh Install Zsh completion\n fish Install Fish completion\n\n${colors.bold(\"OPTIONS:\")}\n --token <token> Forge API token (overrides config and env)\n --org <slug> Organization slug (overrides config and FORGE_ORG)\n --server <id> Server ID (required for server-scoped commands)\n --site <id> Site ID (required for site-scoped commands)\n --domain <id> Domain record ID (for certificate commands)\n -f, --format <fmt> Output format: json, human, table (default: human)\n --no-color Disable colored output\n -h, --help Show help\n -v, --version Show version\n\n${colors.bold(\"EXAMPLES:\")}\n # Configure API token\n forge config set YOUR_TOKEN\n\n # Or pass token directly\n forge servers list --token YOUR_TOKEN\n\n # List all servers\n forge servers list\n\n # List sites on a server\n forge sites list --server 123\n\n # Deploy a site\n forge deployments deploy --server 123 --site 456\n\n # Get JSON output (for AI agents)\n forge servers list --format json\n\n${colors.bold(\"CREDENTIAL PRIORITY:\")}\n 1. CLI argument (--token)\n 2. Environment variable (FORGE_API_TOKEN)\n 3. Config file (~/.config/forge-tools/config.json)\n\n${colors.bold(\"ENVIRONMENT VARIABLES:\")}\n FORGE_API_TOKEN API token\n FORGE_ORG Organization slug (e.g. studio-meta)\n NO_COLOR Disable colors\n XDG_CONFIG_HOME Config directory (respects XDG spec)\n`);\n}\n\nasync function main(): Promise<void> {\n const { command, options, positional } = parseArgs();\n\n const [mainCommand, subcommand] = command;\n const wantsHelp = options.help !== undefined || options.h !== undefined;\n\n if (wantsHelp && !mainCommand) {\n showHelp();\n process.exit(0);\n }\n\n if (options.version || options.v) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (options[\"no-color\"]) {\n setColorEnabled(false);\n }\n\n if (!mainCommand) {\n showHelp();\n process.exit(0);\n }\n\n try {\n switch (mainCommand) {\n case \"config\":\n if (wantsHelp) {\n showConfigHelp();\n process.exit(0);\n }\n handleConfigCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"servers\":\n case \"s\":\n if (wantsHelp) {\n showServersHelp(subcommand);\n process.exit(0);\n }\n await handleServersCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"sites\":\n if (wantsHelp) {\n showSitesHelp(subcommand);\n process.exit(0);\n }\n await handleSitesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"deployments\":\n case \"d\":\n if (wantsHelp) {\n showDeploymentsHelp(subcommand);\n process.exit(0);\n }\n await handleDeploymentsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"databases\":\n case \"db\":\n if (wantsHelp) {\n showDatabasesHelp(subcommand);\n process.exit(0);\n }\n await handleDatabasesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"database-users\":\n if (wantsHelp) {\n showDatabaseUsersHelp(subcommand);\n process.exit(0);\n }\n await handleDatabaseUsersCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"daemons\":\n if (wantsHelp) {\n showDaemonsHelp(subcommand);\n process.exit(0);\n }\n await handleDaemonsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"env\":\n if (wantsHelp) {\n showEnvHelp(subcommand);\n process.exit(0);\n }\n await handleEnvCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"nginx\":\n if (wantsHelp) {\n showNginxHelp(subcommand);\n process.exit(0);\n }\n await handleNginxCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"certificates\":\n case \"certs\":\n if (wantsHelp) {\n showCertificatesHelp(subcommand);\n process.exit(0);\n }\n await handleCertificatesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"firewall-rules\":\n case \"fw\":\n if (wantsHelp) {\n showFirewallRulesHelp(subcommand);\n process.exit(0);\n }\n await handleFirewallRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"ssh-keys\":\n if (wantsHelp) {\n showSshKeysHelp(subcommand);\n process.exit(0);\n }\n await handleSshKeysCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"backups\":\n if (wantsHelp) {\n showBackupsHelp(subcommand);\n process.exit(0);\n }\n await handleBackupsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"commands\":\n if (wantsHelp) {\n showCommandsHelp(subcommand);\n process.exit(0);\n }\n await handleCommandsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"scheduled-jobs\":\n if (wantsHelp) {\n showScheduledJobsHelp(subcommand);\n process.exit(0);\n }\n await handleScheduledJobsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"user\":\n if (wantsHelp) {\n showUserHelp(subcommand);\n process.exit(0);\n }\n await handleUserCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"monitors\":\n if (wantsHelp) {\n showMonitorsHelp(subcommand);\n process.exit(0);\n }\n await handleMonitorsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"nginx-templates\":\n if (wantsHelp) {\n showNginxTemplatesHelp(subcommand);\n process.exit(0);\n }\n await handleNginxTemplatesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"security-rules\":\n if (wantsHelp) {\n showSecurityRulesHelp(subcommand);\n process.exit(0);\n }\n await handleSecurityRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"redirect-rules\":\n if (wantsHelp) {\n showRedirectRulesHelp(subcommand);\n process.exit(0);\n }\n await handleRedirectRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"recipes\":\n if (wantsHelp) {\n showRecipesHelp(subcommand);\n process.exit(0);\n }\n await handleRecipesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"completion\":\n if (wantsHelp || !subcommand) {\n showCompletionHelp();\n process.exit(0);\n }\n handleCompletionCommand(subcommand, options);\n break;\n\n default:\n console.error(colors.red(`Unknown command: ${mainCommand}`));\n console.log(`Run ${colors.cyan(\"forge --help\")} for usage information`);\n process.exit(1);\n }\n } catch (error) {\n console.error(colors.red(\"Fatal error:\"), error);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(colors.red(\"Unhandled error:\"), error);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","names":[],"sources":["../src/audit.ts","../src/utils/command-router.ts","../src/utils/resolve.ts","../src/commands/backups/handlers.ts","../src/commands/backups/command.ts","../src/commands/backups/help.ts","../src/commands/completion.ts","../src/commands/certificates/handlers.ts","../src/commands/certificates/command.ts","../src/commands/certificates/help.ts","../src/commands/commands/handlers.ts","../src/commands/commands/command.ts","../src/commands/commands/help.ts","../src/commands/config.ts","../src/commands/daemons/handlers.ts","../src/commands/daemons/command.ts","../src/commands/daemons/help.ts","../src/commands/databases/handlers.ts","../src/commands/databases/command.ts","../src/commands/databases/help.ts","../src/commands/database-users/handlers.ts","../src/commands/database-users/command.ts","../src/commands/database-users/help.ts","../src/commands/deployments/handlers.ts","../src/commands/deployments/command.ts","../src/commands/deployments/help.ts","../src/commands/env/handlers.ts","../src/commands/env/command.ts","../src/commands/env/help.ts","../src/commands/firewall-rules/handlers.ts","../src/commands/firewall-rules/command.ts","../src/commands/firewall-rules/help.ts","../src/commands/monitors/handlers.ts","../src/commands/monitors/command.ts","../src/commands/monitors/help.ts","../src/commands/nginx/handlers.ts","../src/commands/nginx/command.ts","../src/commands/nginx/help.ts","../src/commands/nginx-templates/handlers.ts","../src/commands/nginx-templates/command.ts","../src/commands/nginx-templates/help.ts","../src/commands/recipes/handlers.ts","../src/commands/recipes/command.ts","../src/commands/recipes/help.ts","../src/commands/redirect-rules/handlers.ts","../src/commands/redirect-rules/command.ts","../src/commands/redirect-rules/help.ts","../src/commands/scheduled-jobs/handlers.ts","../src/commands/scheduled-jobs/command.ts","../src/commands/scheduled-jobs/help.ts","../src/commands/security-rules/handlers.ts","../src/commands/security-rules/command.ts","../src/commands/security-rules/help.ts","../src/commands/servers/handlers.ts","../src/commands/servers/command.ts","../src/commands/servers/help.ts","../src/commands/sites/handlers.ts","../src/commands/sites/command.ts","../src/commands/sites/help.ts","../src/commands/ssh-keys/handlers.ts","../src/commands/ssh-keys/command.ts","../src/commands/ssh-keys/help.ts","../src/commands/user/handlers.ts","../src/commands/user/command.ts","../src/commands/user/help.ts","../src/utils/args.ts","../src/cli.ts"],"sourcesContent":["import { createAuditLogger } from \"@studiometa/forge-core\";\nimport type { AuditLogger } from \"@studiometa/forge-core\";\n\n/**\n * Shared audit logger for CLI write operations.\n * Lazily initialized on first use.\n */\nlet _auditLogger: AuditLogger | null = null;\n\nexport function getCliAuditLogger(): AuditLogger {\n if (!_auditLogger) _auditLogger = createAuditLogger(\"cli\");\n return _auditLogger;\n}\n","/**\n * Generic command router factory for CLI commands.\n *\n * Eliminates boilerplate switch/case pattern in command routing.\n *\n * @example\n * ```typescript\n * import { createCommandRouter } from '../../utils/command-router.ts';\n * import { serversList, serversGet } from './handlers.ts';\n *\n * export const handleServersCommand = createCommandRouter({\n * resource: 'servers',\n * handlers: {\n * list: serversList,\n * ls: serversList,\n * get: [serversGet, 'args'],\n * },\n * });\n * ```\n */\n\nimport type { CommandContext } from \"../context.ts\";\nimport { type OutputFormat, isOutputFormat } from \"../types.ts\";\n\nimport { createContext } from \"../context.ts\";\nimport { OutputFormatter } from \"../output.ts\";\nimport { getCliAuditLogger } from \"../audit.ts\";\n\n/**\n * Handler that only receives context (e.g., list commands)\n */\nexport type ListHandler = (ctx: CommandContext) => Promise<void>;\n\n/**\n * Handler that receives args and context (e.g., get/update commands)\n */\nexport type ArgsHandler = (args: string[], ctx: CommandContext) => Promise<void>;\n\n/**\n * Handler definition - either a ListHandler or an ArgsHandler marked with 'args'\n */\nexport type Handler = ListHandler | [ArgsHandler, \"args\"];\n\n/**\n * Configuration for the command router\n */\nexport interface CommandRouterConfig {\n /** Resource name for error messages (e.g., 'servers', 'sites') */\n resource: string;\n /** Map of subcommand names to handlers */\n handlers: Record<string, Handler>;\n /**\n * Set of subcommand names that are write operations.\n * These will be recorded in the audit log on success or failure.\n */\n writeSubcommands?: ReadonlyArray<string>;\n}\n\n/**\n * Creates a command router function that dispatches to the appropriate handler.\n */\nexport function createCommandRouter(config: CommandRouterConfig) {\n return async function (\n subcommand: string,\n args: string[],\n options: Record<string, string | boolean | string[]>,\n ): Promise<void> {\n const rawFormat = options.format ?? options.f ?? \"human\";\n const format: OutputFormat = isOutputFormat(rawFormat) ? rawFormat : \"human\";\n const formatter = new OutputFormatter(format, options[\"no-color\"] === true);\n\n const ctx = createContext(options);\n\n const handler = config.handlers[subcommand];\n if (!handler) {\n formatter.error(`Unknown ${config.resource} subcommand: ${subcommand}`);\n process.exit(1);\n return; // Unreachable in production, but needed for tests where process.exit is mocked\n }\n\n const isWrite = config.writeSubcommands?.includes(subcommand) ?? false;\n\n if (isWrite) {\n // Sanitized args for audit log (strip token)\n const { token: _token, ...safeOptions } = options;\n try {\n if (Array.isArray(handler)) {\n await handler[0](args, ctx);\n } else {\n await handler(ctx);\n }\n getCliAuditLogger().log({\n source: \"cli\",\n resource: config.resource,\n action: subcommand,\n args: safeOptions,\n status: \"success\",\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n getCliAuditLogger().log({\n source: \"cli\",\n resource: config.resource,\n action: subcommand,\n args: safeOptions,\n status: \"error\",\n error: errorMessage,\n });\n throw err;\n }\n } else {\n if (Array.isArray(handler)) {\n // ArgsHandler - receives args and context\n await handler[0](args, ctx);\n } else {\n // ListHandler - receives only context\n await handler(ctx);\n }\n }\n };\n}\n","/**\n * Smart resolution utilities for --server and --site options.\n *\n * Accepts numeric IDs (used as-is) or plain strings (resolved by name/partial match).\n */\n\nimport { listServers, listSites, matchByName } from \"@studiometa/forge-core\";\nimport type { ExecutorContext } from \"@studiometa/forge-core\";\nimport { ValidationError } from \"../errors.ts\";\n\n/**\n * Resolve a --server value to a numeric server ID string.\n *\n * - Numeric string → returned as-is (no API call)\n * - Plain string → fetch all servers, exact match first, then partial match\n * - 0 matches → ValidationError listing available servers\n * - 2+ matches → ValidationError listing ambiguous matches\n */\nexport async function resolveServerId(value: string, execCtx: ExecutorContext): Promise<string> {\n if (/^\\d+$/.test(value)) {\n return value;\n }\n\n const result = await listServers({}, execCtx);\n const servers = result.data;\n\n const { exact, partial } = matchByName(servers, value, (s) => s.name);\n\n if (exact.length === 1) {\n return String(exact[0].id);\n }\n\n if (partial.length === 0) {\n const available = servers.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(`No server found matching \"${value}\"`, \"server\", [\n `Available servers:\\n${available}`,\n ]);\n }\n\n if (partial.length > 1) {\n const matches = partial.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(\n `Ambiguous server name \"${value}\" — ${partial.length} matches found`,\n \"server\",\n [`Matching servers:\\n${matches}`, \"Use a more specific name or pass the numeric ID\"],\n );\n }\n\n return String(partial[0].id);\n}\n\n/**\n * Resolve a --site value to a numeric site ID string.\n *\n * - Numeric string → returned as-is (no API call)\n * - Plain string → fetch all sites for the server, exact domain match first, then partial\n * - 0 matches → ValidationError listing available sites\n * - 2+ matches → ValidationError listing ambiguous matches\n */\nexport async function resolveSiteId(\n value: string,\n serverId: string,\n execCtx: ExecutorContext,\n): Promise<string> {\n if (/^\\d+$/.test(value)) {\n return value;\n }\n\n const result = await listSites({ server_id: serverId }, execCtx);\n const sites = result.data;\n\n const { exact, partial } = matchByName(sites, value, (s) => s.name);\n\n if (exact.length === 1) {\n return String(exact[0].id);\n }\n\n if (partial.length === 0) {\n const available = sites.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(`No site found matching \"${value}\" on server ${serverId}`, \"site\", [\n `Available sites:\\n${available}`,\n ]);\n }\n\n if (partial.length > 1) {\n const matches = partial.map((s) => ` ${s.name} (${s.id})`).join(\"\\n\");\n throw new ValidationError(\n `Ambiguous site name \"${value}\" — ${partial.length} matches found`,\n \"site\",\n [`Matching sites:\\n${matches}`, \"Use a more specific name or pass the numeric ID\"],\n );\n }\n\n return String(partial[0].id);\n}\n","import {\n createBackupConfig,\n deleteBackupConfig,\n getBackupConfig,\n listBackupConfigs,\n updateBackupConfig,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function backupsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge backups list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listBackupConfigs({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"schedule\", \"status\"],\n \"No backup configurations found.\",\n (b) => `${String(b.id).padEnd(8)} ${b.name.padEnd(20)} ${b.schedule.padEnd(12)} ${b.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function backupsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups get <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups get <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getBackupConfig({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"provider\",\n \"schedule\",\n \"displayable_schedule\",\n \"retention\",\n \"status\",\n \"next_run_time\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function backupsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const storageProviderId = Number(ctx.options.provider ?? 0);\n const frequency = String(ctx.options.frequency ?? \"\");\n const databaseIdsRaw = ctx.options.databases;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : [];\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!storageProviderId) {\n exitWithValidationError(\n \"provider\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!frequency) {\n exitWithValidationError(\n \"frequency\",\n \"forge backups create --server <server_id> --provider <provider> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await createBackupConfig(\n { server_id, storage_provider_id: storageProviderId, frequency, retention: 5, database_ids },\n execCtx,\n );\n ctx.formatter.success(\"Backup configuration created.\");\n }, ctx.formatter);\n}\n\nexport async function backupsUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const storageProviderId = Number(ctx.options.provider ?? 0);\n const frequency = String(ctx.options.frequency ?? \"\");\n const retention = Number(ctx.options.retention ?? 0);\n const databaseIdsRaw = ctx.options.databases;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : [];\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!storageProviderId) {\n exitWithValidationError(\n \"provider\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!frequency) {\n exitWithValidationError(\n \"frequency\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n if (!retention) {\n exitWithValidationError(\n \"retention\",\n \"forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await updateBackupConfig(\n {\n server_id,\n id,\n storage_provider_id: storageProviderId,\n frequency,\n retention,\n database_ids,\n ...(ctx.options.name != null ? { name: String(ctx.options.name) } : {}),\n ...(ctx.options.bucket != null ? { bucket: String(ctx.options.bucket) } : {}),\n ...(ctx.options.directory != null ? { directory: String(ctx.options.directory) } : {}),\n ...(ctx.options.day != null ? { day: String(ctx.options.day) } : {}),\n ...(ctx.options.time != null ? { time: String(ctx.options.time) } : {}),\n ...(ctx.options.cron != null ? { cron: String(ctx.options.cron) } : {}),\n ...(ctx.options[\"notification-email\"] != null\n ? { notification_email: String(ctx.options[\"notification-email\"]) }\n : {}),\n },\n execCtx,\n );\n ctx.formatter.success(`Backup configuration ${id} updated.`);\n }, ctx.formatter);\n}\n\nexport async function backupsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"backup_id\",\n \"forge backups delete <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge backups delete <backup_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteBackupConfig({ server_id, id }, execCtx);\n ctx.formatter.success(`Backup configuration ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n backupsCreate,\n backupsDelete,\n backupsGet,\n backupsList,\n backupsUpdate,\n} from \"./handlers.ts\";\n\nexport const handleBackupsCommand = createCommandRouter({\n resource: \"backups\",\n handlers: {\n list: backupsList,\n ls: backupsList,\n get: [backupsGet, \"args\"],\n create: backupsCreate,\n update: [backupsUpdate, \"args\"],\n delete: [backupsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showBackupsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge backups list\")} - List backup configurations on a server\n\n${colors.bold(\"USAGE:\")}\n forge backups list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge backups get\")} - Get backup configuration details\n\n${colors.bold(\"USAGE:\")}\n forge backups get <backup_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge backups create\")} - Create a new backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups create --server <server_id> --provider <provider> --frequency <frequency> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --provider <name> Backup provider (required)\n --frequency <freq> Backup frequency (required)\n --databases <ids> Comma-separated database IDs to back up (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge backups update\")} - Update a backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups update <backup_id> --server <server_id> --provider <provider> --frequency <frequency> --retention <retention> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --provider <id> Storage provider ID (required)\n --frequency <freq> Backup frequency (required)\n --retention <n> Retention count (required)\n --databases <ids> Comma-separated database IDs (optional)\n --name <name> Backup name (optional)\n --bucket <bucket> Bucket name (optional)\n --directory <dir> Directory (optional)\n --day <day> Day of week (optional)\n --time <time> Time (optional)\n --cron <cron> Cron expression (optional)\n --notification-email <email> Notification email (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge backups delete\")} - Delete a backup configuration\n\n${colors.bold(\"USAGE:\")}\n forge backups delete <backup_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge backups\")} - Manage backup configurations\n\n${colors.bold(\"USAGE:\")}\n forge backups <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List backup configurations\n get <id> Get backup configuration details\n create Create a new backup configuration\n update <id> Update a backup configuration\n delete <id> Delete a backup configuration\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge backups <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Shell completion installation command\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { colors } from \"../utils/colors.ts\";\n\nconst BASH_COMPLETION = `#!/usr/bin/env bash\n\n_forge_completions() {\n local cur prev commands subcommands options\n\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n # Main commands\n commands=\"config servers s sites deployments d databases db database-users daemons env nginx certificates certs firewall-rules fw ssh-keys backups commands scheduled-jobs user monitors nginx-templates security-rules redirect-rules recipes completion help\"\n\n # Subcommands for each command\n local config_cmds=\"set get delete\"\n local servers_cmds=\"list ls get reboot\"\n local sites_cmds=\"list ls get\"\n local deployments_cmds=\"list ls deploy\"\n local databases_cmds=\"list ls get\"\n local database_users_cmds=\"list ls get create delete\"\n local daemons_cmds=\"list ls get restart\"\n local env_cmds=\"get update\"\n local nginx_cmds=\"get update\"\n local certificates_cmds=\"get activate\"\n local firewall_rules_cmds=\"list ls get\"\n local ssh_keys_cmds=\"list ls get\"\n local backups_cmds=\"list ls get create delete\"\n local commands_cmds=\"list ls get create\"\n local scheduled_jobs_cmds=\"list ls get create delete\"\n local user_cmds=\"get\"\n local monitors_cmds=\"list ls get create delete\"\n local nginx_templates_cmds=\"list ls get create update delete\"\n local security_rules_cmds=\"list ls get create delete\"\n local redirect_rules_cmds=\"list ls get create delete\"\n local recipes_cmds=\"list ls get run\"\n local completion_cmds=\"bash zsh fish\"\n\n # Global options\n options=\"--token --server --site -f --format --no-color -h --help -v --version --name --command --content --from --to --provider --frequency --type --operator --threshold --minutes --key --port --ip-address --user --script --servers --domain --password --credential-id --region --size --project-type --directory\"\n\n # Format options\n local formats=\"json human table\"\n\n # Completion logic\n case \"\\${COMP_CWORD}\" in\n 1)\n # Complete main commands\n COMPREPLY=( $(compgen -W \"\\${commands}\" -- \"\\${cur}\") )\n ;;\n 2)\n # Complete subcommands based on main command\n case \"\\${prev}\" in\n config)\n COMPREPLY=( $(compgen -W \"\\${config_cmds}\" -- \"\\${cur}\") )\n ;;\n servers|s)\n COMPREPLY=( $(compgen -W \"\\${servers_cmds}\" -- \"\\${cur}\") )\n ;;\n sites)\n COMPREPLY=( $(compgen -W \"\\${sites_cmds}\" -- \"\\${cur}\") )\n ;;\n deployments|d)\n COMPREPLY=( $(compgen -W \"\\${deployments_cmds}\" -- \"\\${cur}\") )\n ;;\n databases|db)\n COMPREPLY=( $(compgen -W \"\\${databases_cmds}\" -- \"\\${cur}\") )\n ;;\n database-users)\n COMPREPLY=( $(compgen -W \"\\${database_users_cmds}\" -- \"\\${cur}\") )\n ;;\n daemons)\n COMPREPLY=( $(compgen -W \"\\${daemons_cmds}\" -- \"\\${cur}\") )\n ;;\n env)\n COMPREPLY=( $(compgen -W \"\\${env_cmds}\" -- \"\\${cur}\") )\n ;;\n nginx)\n COMPREPLY=( $(compgen -W \"\\${nginx_cmds}\" -- \"\\${cur}\") )\n ;;\n certificates|certs)\n COMPREPLY=( $(compgen -W \"\\${certificates_cmds}\" -- \"\\${cur}\") )\n ;;\n firewall-rules|fw)\n COMPREPLY=( $(compgen -W \"\\${firewall_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n ssh-keys)\n COMPREPLY=( $(compgen -W \"\\${ssh_keys_cmds}\" -- \"\\${cur}\") )\n ;;\n backups)\n COMPREPLY=( $(compgen -W \"\\${backups_cmds}\" -- \"\\${cur}\") )\n ;;\n commands)\n COMPREPLY=( $(compgen -W \"\\${commands_cmds}\" -- \"\\${cur}\") )\n ;;\n scheduled-jobs)\n COMPREPLY=( $(compgen -W \"\\${scheduled_jobs_cmds}\" -- \"\\${cur}\") )\n ;;\n user)\n COMPREPLY=( $(compgen -W \"\\${user_cmds}\" -- \"\\${cur}\") )\n ;;\n monitors)\n COMPREPLY=( $(compgen -W \"\\${monitors_cmds}\" -- \"\\${cur}\") )\n ;;\n nginx-templates)\n COMPREPLY=( $(compgen -W \"\\${nginx_templates_cmds}\" -- \"\\${cur}\") )\n ;;\n security-rules)\n COMPREPLY=( $(compgen -W \"\\${security_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n redirect-rules)\n COMPREPLY=( $(compgen -W \"\\${redirect_rules_cmds}\" -- \"\\${cur}\") )\n ;;\n recipes)\n COMPREPLY=( $(compgen -W \"\\${recipes_cmds}\" -- \"\\${cur}\") )\n ;;\n completion)\n COMPREPLY=( $(compgen -W \"\\${completion_cmds}\" -- \"\\${cur}\") )\n ;;\n *)\n COMPREPLY=( $(compgen -W \"\\${options}\" -- \"\\${cur}\") )\n ;;\n esac\n ;;\n *)\n # Complete options and their values\n case \"\\${prev}\" in\n --format|-f)\n COMPREPLY=( $(compgen -W \"\\${formats}\" -- \"\\${cur}\") )\n ;;\n --token|--server|--site|--name|--command|--content|--from|--to|--provider|--frequency|--type|--operator|--threshold|--minutes|--key|--port|--ip-address|--user|--script|--servers|--domain|--password|--credential-id|--region|--size|--project-type|--directory)\n # No completion for values requiring arguments\n COMPREPLY=()\n ;;\n *)\n COMPREPLY=( $(compgen -W \"\\${options}\" -- \"\\${cur}\") )\n ;;\n esac\n ;;\n esac\n\n return 0\n}\n\ncomplete -F _forge_completions forge\n`;\n\nconst ZSH_COMPLETION = `#compdef forge\n\n_forge() {\n local line state\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '2: :->subcommand' \\\\\n '*: :->args'\n\n case $state in\n command)\n local -a commands\n commands=(\n 'config:Manage CLI configuration'\n 'servers:Manage servers'\n 's:Manage servers (alias)'\n 'sites:Manage sites'\n 'deployments:Manage deployments'\n 'd:Manage deployments (alias)'\n 'databases:Manage databases'\n 'db:Manage databases (alias)'\n 'database-users:Manage database users'\n 'daemons:Manage daemons'\n 'env:Manage environment variables'\n 'nginx:Manage nginx configuration'\n 'certificates:Manage SSL certificates'\n 'certs:Manage SSL certificates (alias)'\n 'firewall-rules:Manage firewall rules'\n 'fw:Manage firewall rules (alias)'\n 'ssh-keys:Manage SSH keys'\n 'backups:Manage backup configurations'\n 'commands:Manage site commands'\n 'scheduled-jobs:Manage scheduled jobs'\n 'user:Display authenticated user profile'\n 'monitors:Manage server monitors'\n 'nginx-templates:Manage Nginx templates'\n 'security-rules:Manage site security rules'\n 'redirect-rules:Manage site redirect rules'\n 'recipes:Manage recipes'\n 'completion:Generate shell completion script'\n 'help:Show help'\n )\n _describe 'command' commands\n ;;\n subcommand)\n case $line[1] in\n config)\n local -a config_cmds\n config_cmds=(\n 'set:Save API token'\n 'get:Show current token'\n 'delete:Delete stored token'\n )\n _describe 'config command' config_cmds\n ;;\n servers|s)\n local -a servers_cmds\n servers_cmds=(\n 'list:List all servers'\n 'ls:List all servers (alias)'\n 'get:Get server details'\n 'reboot:Reboot a server'\n )\n _describe 'servers command' servers_cmds\n ;;\n sites)\n local -a sites_cmds\n sites_cmds=(\n 'list:List sites'\n 'ls:List sites (alias)'\n 'get:Get site details'\n )\n _describe 'sites command' sites_cmds\n ;;\n deployments|d)\n local -a deployments_cmds\n deployments_cmds=(\n 'list:List deployments'\n 'ls:List deployments (alias)'\n 'deploy:Trigger a deployment'\n )\n _describe 'deployments command' deployments_cmds\n ;;\n databases|db)\n local -a databases_cmds\n databases_cmds=(\n 'list:List databases'\n 'ls:List databases (alias)'\n 'get:Get database details'\n )\n _describe 'databases command' databases_cmds\n ;;\n database-users)\n local -a database_users_cmds\n database_users_cmds=(\n 'list:List database users'\n 'ls:List database users (alias)'\n 'get:Get database user details'\n 'create:Create a database user'\n 'delete:Delete a database user'\n )\n _describe 'database-users command' database_users_cmds\n ;;\n daemons)\n local -a daemons_cmds\n daemons_cmds=(\n 'list:List daemons'\n 'ls:List daemons (alias)'\n 'get:Get daemon details'\n 'restart:Restart a daemon'\n )\n _describe 'daemons command' daemons_cmds\n ;;\n env)\n local -a env_cmds\n env_cmds=(\n 'get:Get env variables'\n 'update:Update env variables'\n )\n _describe 'env command' env_cmds\n ;;\n nginx)\n local -a nginx_cmds\n nginx_cmds=(\n 'get:Get nginx config'\n 'update:Update nginx config'\n )\n _describe 'nginx command' nginx_cmds\n ;;\n certificates|certs)\n local -a certificates_cmds\n certificates_cmds=(\n 'get:Get certificate for a domain'\n 'activate:Activate a certificate'\n )\n _describe 'certificates command' certificates_cmds\n ;;\n firewall-rules|fw)\n local -a firewall_rules_cmds\n firewall_rules_cmds=(\n 'list:List firewall rules'\n 'ls:List firewall rules (alias)'\n 'get:Get firewall rule details'\n )\n _describe 'firewall-rules command' firewall_rules_cmds\n ;;\n ssh-keys)\n local -a ssh_keys_cmds\n ssh_keys_cmds=(\n 'list:List SSH keys'\n 'ls:List SSH keys (alias)'\n 'get:Get SSH key details'\n )\n _describe 'ssh-keys command' ssh_keys_cmds\n ;;\n backups)\n local -a backups_cmds\n backups_cmds=(\n 'list:List backup configurations'\n 'ls:List backup configurations (alias)'\n 'get:Get backup configuration details'\n 'create:Create a backup configuration'\n 'delete:Delete a backup configuration'\n )\n _describe 'backups command' backups_cmds\n ;;\n commands)\n local -a commands_cmds\n commands_cmds=(\n 'list:List commands'\n 'ls:List commands (alias)'\n 'get:Get command details'\n 'create:Execute a command'\n )\n _describe 'commands command' commands_cmds\n ;;\n scheduled-jobs)\n local -a scheduled_jobs_cmds\n scheduled_jobs_cmds=(\n 'list:List scheduled jobs'\n 'ls:List scheduled jobs (alias)'\n 'get:Get scheduled job details'\n 'create:Create a scheduled job'\n 'delete:Delete a scheduled job'\n )\n _describe 'scheduled-jobs command' scheduled_jobs_cmds\n ;;\n user)\n local -a user_cmds\n user_cmds=(\n 'get:Get the authenticated user profile'\n )\n _describe 'user command' user_cmds\n ;;\n monitors)\n local -a monitors_cmds\n monitors_cmds=(\n 'list:List monitors'\n 'ls:List monitors (alias)'\n 'get:Get monitor details'\n 'create:Create a monitor'\n 'delete:Delete a monitor'\n )\n _describe 'monitors command' monitors_cmds\n ;;\n nginx-templates)\n local -a nginx_templates_cmds\n nginx_templates_cmds=(\n 'list:List Nginx templates'\n 'ls:List Nginx templates (alias)'\n 'get:Get Nginx template details'\n 'create:Create a Nginx template'\n 'update:Update a Nginx template'\n 'delete:Delete a Nginx template'\n )\n _describe 'nginx-templates command' nginx_templates_cmds\n ;;\n security-rules)\n local -a security_rules_cmds\n security_rules_cmds=(\n 'list:List security rules'\n 'ls:List security rules (alias)'\n 'get:Get security rule details'\n 'create:Create a security rule'\n 'delete:Delete a security rule'\n )\n _describe 'security-rules command' security_rules_cmds\n ;;\n redirect-rules)\n local -a redirect_rules_cmds\n redirect_rules_cmds=(\n 'list:List redirect rules'\n 'ls:List redirect rules (alias)'\n 'get:Get redirect rule details'\n 'create:Create a redirect rule'\n 'delete:Delete a redirect rule'\n )\n _describe 'redirect-rules command' redirect_rules_cmds\n ;;\n recipes)\n local -a recipes_cmds\n recipes_cmds=(\n 'list:List all recipes'\n 'ls:List all recipes (alias)'\n 'get:Get recipe details'\n 'run:Run a recipe'\n )\n _describe 'recipes command' recipes_cmds\n ;;\n completion)\n local -a completion_cmds\n completion_cmds=(\n 'bash:Generate Bash completion script'\n 'zsh:Generate Zsh completion script'\n 'fish:Generate Fish completion script'\n )\n _describe 'completion shell' completion_cmds\n ;;\n esac\n ;;\n args)\n _arguments \\\\\n '--token[API token]:token:' \\\\\n '--server[Server ID]:server id:' \\\\\n '--site[Site ID]:site id:' \\\\\n '(-f --format)'{-f,--format}'[Output format]:format:(json human table)' \\\\\n '--no-color[Disable colored output]' \\\\\n '(-h --help)'{-h,--help}'[Show help]' \\\\\n '(-v --version)'{-v,--version}'[Show version]' \\\\\n '--name[Name]:name:' \\\\\n '--command[Command]:command:' \\\\\n '--content[Content]:content:' \\\\\n '--from[From]:from:' \\\\\n '--to[To]:to:' \\\\\n '--provider[Provider]:provider:' \\\\\n '--frequency[Frequency]:frequency:' \\\\\n '--type[Type]:type:' \\\\\n '--operator[Operator]:operator:' \\\\\n '--threshold[Threshold]:threshold:' \\\\\n '--minutes[Minutes]:minutes:' \\\\\n '--key[Key]:key:' \\\\\n '--port[Port]:port:' \\\\\n '--ip-address[IP address]:ip address:' \\\\\n '--user[User]:user:' \\\\\n '--script[Script]:script:' \\\\\n '--servers[Servers]:servers:' \\\\\n '--domain[Domain]:domain:' \\\\\n '--password[Password]:password:' \\\\\n '--credential-id[Credential ID]:credential id:' \\\\\n '--region[Region]:region:' \\\\\n '--size[Size]:size:' \\\\\n '--project-type[Project type]:project type:' \\\\\n '--directory[Directory]:directory:'\n ;;\n esac\n}\n\n_forge \"$@\"\n`;\n\nconst FISH_COMPLETION = `# Completions for forge\n\n# Main commands\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"config\" -d \"Manage CLI configuration\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"servers\" -d \"Manage servers\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"s\" -d \"Manage servers (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"sites\" -d \"Manage sites\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"deployments\" -d \"Manage deployments\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"d\" -d \"Manage deployments (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"databases\" -d \"Manage databases\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"db\" -d \"Manage databases (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"database-users\" -d \"Manage database users\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"daemons\" -d \"Manage daemons\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"env\" -d \"Manage environment variables\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"nginx\" -d \"Manage nginx configuration\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"certificates\" -d \"Manage SSL certificates\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"certs\" -d \"Manage SSL certificates (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"firewall-rules\" -d \"Manage firewall rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"fw\" -d \"Manage firewall rules (alias)\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"ssh-keys\" -d \"Manage SSH keys\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"backups\" -d \"Manage backup configurations\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"commands\" -d \"Manage site commands\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"scheduled-jobs\" -d \"Manage scheduled jobs\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"user\" -d \"Display authenticated user profile\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"monitors\" -d \"Manage server monitors\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"nginx-templates\" -d \"Manage Nginx templates\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"security-rules\" -d \"Manage site security rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"redirect-rules\" -d \"Manage site redirect rules\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"recipes\" -d \"Manage recipes\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate shell completion script\"\ncomplete -c forge -f -n \"__fish_use_subcommand\" -a \"help\" -d \"Show help\"\n\n# config subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"set\" -d \"Save API token\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"get\" -d \"Show current token\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from config\" -a \"delete\" -d \"Delete stored token\"\n\n# servers subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"list\" -d \"List all servers\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"ls\" -d \"List all servers (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"get\" -d \"Get server details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from servers s\" -a \"reboot\" -d \"Reboot a server\"\n\n# sites subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"list\" -d \"List sites\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"ls\" -d \"List sites (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from sites\" -a \"get\" -d \"Get site details\"\n\n# deployments subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"list\" -d \"List deployments\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"ls\" -d \"List deployments (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from deployments d\" -a \"deploy\" -d \"Trigger a deployment\"\n\n# databases subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"list\" -d \"List databases\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"ls\" -d \"List databases (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from databases db\" -a \"get\" -d \"Get database details\"\n\n# database-users subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"list\" -d \"List database users\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"ls\" -d \"List database users (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"get\" -d \"Get database user details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"create\" -d \"Create a database user\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from database-users\" -a \"delete\" -d \"Delete a database user\"\n\n# daemons subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"list\" -d \"List daemons\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"ls\" -d \"List daemons (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"get\" -d \"Get daemon details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from daemons\" -a \"restart\" -d \"Restart a daemon\"\n\n# env subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from env\" -a \"get\" -d \"Get env variables\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from env\" -a \"update\" -d \"Update env variables\"\n\n# nginx subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx\" -a \"get\" -d \"Get nginx config\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx\" -a \"update\" -d \"Update nginx config\"\n\n# certificates subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"get\" -d \"Get certificate for a domain\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"get\" -d \"Get certificate details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from certificates certs\" -a \"activate\" -d \"Activate a certificate\"\n\n# firewall-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"list\" -d \"List firewall rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"ls\" -d \"List firewall rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from firewall-rules fw\" -a \"get\" -d \"Get firewall rule details\"\n\n# ssh-keys subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"list\" -d \"List SSH keys\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"ls\" -d \"List SSH keys (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from ssh-keys\" -a \"get\" -d \"Get SSH key details\"\n\n# backups subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"list\" -d \"List backup configurations\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"ls\" -d \"List backup configurations (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"get\" -d \"Get backup configuration details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"create\" -d \"Create a backup configuration\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from backups\" -a \"delete\" -d \"Delete a backup configuration\"\n\n# commands subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"list\" -d \"List commands\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"ls\" -d \"List commands (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"get\" -d \"Get command details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from commands\" -a \"create\" -d \"Execute a command\"\n\n# scheduled-jobs subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"list\" -d \"List scheduled jobs\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"ls\" -d \"List scheduled jobs (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"get\" -d \"Get scheduled job details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"create\" -d \"Create a scheduled job\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from scheduled-jobs\" -a \"delete\" -d \"Delete a scheduled job\"\n\n# user subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from user\" -a \"get\" -d \"Get the authenticated user profile\"\n\n# monitors subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"list\" -d \"List monitors\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"ls\" -d \"List monitors (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"get\" -d \"Get monitor details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"create\" -d \"Create a monitor\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from monitors\" -a \"delete\" -d \"Delete a monitor\"\n\n# nginx-templates subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"list\" -d \"List Nginx templates\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"ls\" -d \"List Nginx templates (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"get\" -d \"Get Nginx template details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"create\" -d \"Create a Nginx template\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"update\" -d \"Update a Nginx template\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from nginx-templates\" -a \"delete\" -d \"Delete a Nginx template\"\n\n# security-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"list\" -d \"List security rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"ls\" -d \"List security rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"get\" -d \"Get security rule details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"create\" -d \"Create a security rule\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from security-rules\" -a \"delete\" -d \"Delete a security rule\"\n\n# redirect-rules subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"list\" -d \"List redirect rules\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"ls\" -d \"List redirect rules (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"get\" -d \"Get redirect rule details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"create\" -d \"Create a redirect rule\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from redirect-rules\" -a \"delete\" -d \"Delete a redirect rule\"\n\n# recipes subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"list\" -d \"List all recipes\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"ls\" -d \"List all recipes (alias)\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"get\" -d \"Get recipe details\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from recipes\" -a \"run\" -d \"Run a recipe\"\n\n# completion subcommands\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"bash\" -d \"Install Bash completion\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"zsh\" -d \"Install Zsh completion\"\ncomplete -c forge -f -n \"__fish_seen_subcommand_from completion\" -a \"fish\" -d \"Install Fish completion\"\n\n# Global options\ncomplete -c forge -l token -d \"API token\" -r\ncomplete -c forge -l server -d \"Server ID\" -r\ncomplete -c forge -l site -d \"Site ID\" -r\ncomplete -c forge -s f -l format -d \"Output format\" -xa \"json human table\"\ncomplete -c forge -l no-color -d \"Disable colored output\"\ncomplete -c forge -s h -l help -d \"Show help\"\ncomplete -c forge -s v -l version -d \"Show version\"\ncomplete -c forge -l name -d \"Name\" -r\ncomplete -c forge -l command -d \"Command\" -r\ncomplete -c forge -l content -d \"Content\" -r\ncomplete -c forge -l from -d \"From\" -r\ncomplete -c forge -l to -d \"To\" -r\ncomplete -c forge -l provider -d \"Provider\" -r\ncomplete -c forge -l frequency -d \"Frequency\" -r\ncomplete -c forge -l type -d \"Type\" -r\ncomplete -c forge -l operator -d \"Operator\" -r\ncomplete -c forge -l threshold -d \"Threshold\" -r\ncomplete -c forge -l minutes -d \"Minutes\" -r\ncomplete -c forge -l key -d \"Key\" -r\ncomplete -c forge -l port -d \"Port\" -r\ncomplete -c forge -l ip-address -d \"IP address\" -r\ncomplete -c forge -l user -d \"User\" -r\ncomplete -c forge -l script -d \"Script\" -r\ncomplete -c forge -l servers -d \"Servers\" -r\ncomplete -c forge -l domain -d \"Domain\" -r\ncomplete -c forge -l password -d \"Password\" -r\ncomplete -c forge -l credential-id -d \"Credential ID\" -r\ncomplete -c forge -l region -d \"Region\" -r\ncomplete -c forge -l size -d \"Size\" -r\ncomplete -c forge -l project-type -d \"Project type\" -r\ncomplete -c forge -l directory -d \"Directory\" -r\n`;\n\n/**\n * Get the appropriate completion file path for the shell\n */\nfunction getCompletionPath(shell: string): string {\n const home = homedir();\n\n switch (shell) {\n case \"bash\":\n return join(home, \".local/share/bash-completion/completions/forge\");\n case \"zsh\":\n return join(home, \".zfunc/_forge\");\n case \"fish\": {\n const configHome = process.env[\"XDG_CONFIG_HOME\"] ?? join(home, \".config\");\n return join(configHome, \"fish/completions/forge.fish\");\n }\n default:\n throw new Error(`Unknown shell: ${shell}`);\n }\n}\n\nexport function showCompletionHelp(): void {\n console.log(`\n${colors.bold(\"forge completion\")} - Install shell completion\n\n${colors.bold(\"USAGE:\")}\n forge completion <shell> [--print]\n\n${colors.bold(\"SHELLS:\")}\n bash Install Bash completion\n zsh Install Zsh completion\n fish Install Fish completion\n\n${colors.bold(\"OPTIONS:\")}\n --print Print completion script instead of installing\n\n${colors.bold(\"INSTALLATION:\")}\n The completion script is automatically installed to the appropriate\n standard directory for your shell. After installation, restart your\n shell to activate completions.\n\n ${colors.bold(\"Bash:\")}\n forge completion bash\n # Installs to: ~/.local/share/bash-completion/completions/forge\n # Then run: exec bash\n\n ${colors.bold(\"Zsh:\")}\n forge completion zsh\n # Installs to: ~/.zfunc/_forge\n # Ensure fpath includes ~/.zfunc (add to ~/.zshrc before compinit):\n # fpath=(~/.zfunc $fpath)\n # Then run: exec zsh\n\n ${colors.bold(\"Fish:\")}\n forge completion fish\n # Installs to: ~/.config/fish/completions/forge.fish\n # Completions are loaded automatically\n\n${colors.bold(\"PRINT ONLY:\")}\n Use --print to output the script without installing:\n\n forge completion bash --print > my-completion.sh\n forge completion zsh --print | less\n`);\n}\n\nexport function handleCompletionCommand(\n shell: string,\n options: Record<string, string | boolean | string[]> = {},\n): void {\n const shouldPrint = options[\"print\"] !== undefined;\n\n const shellLower = shell.toLowerCase();\n\n // Get completion script\n let script: string;\n switch (shellLower) {\n case \"bash\":\n script = BASH_COMPLETION;\n break;\n case \"zsh\":\n script = ZSH_COMPLETION;\n break;\n case \"fish\":\n script = FISH_COMPLETION;\n break;\n default:\n console.error(\n `${colors.red(\"✗\")} Unknown shell: ${shell}. Supported shells: bash, zsh, fish`,\n );\n console.error(`Run ${colors.cyan(\"forge completion --help\")} for usage information.`);\n process.exit(1);\n return;\n }\n\n // If --print flag, just output the script\n if (shouldPrint) {\n process.stdout.write(script);\n return;\n }\n\n // Otherwise, install to appropriate directory\n const installPath = getCompletionPath(shellLower);\n const dir = installPath.substring(0, installPath.lastIndexOf(\"/\"));\n\n try {\n mkdirSync(dir, { recursive: true });\n writeFileSync(installPath, script, \"utf8\");\n\n console.log(\n `${colors.green(\"✓\")} Installed ${shell} completion to ${colors.cyan(installPath)}`,\n );\n console.log();\n console.log(colors.bold(\"Next steps:\"));\n\n switch (shellLower) {\n case \"bash\":\n console.log(` 1. Restart your shell: ${colors.cyan(\"exec bash\")}`);\n console.log(` 2. Or source the file: ${colors.cyan(`source ${installPath}`)}`);\n break;\n case \"zsh\":\n console.log(\n ` 1. Ensure ${colors.cyan(\"~/.zfunc\")} is in your $fpath (add to ~/.zshrc before compinit):`,\n );\n console.log(` ${colors.cyan(\"fpath=(~/.zfunc $fpath)\")}`);\n console.log(` 2. Restart your shell: ${colors.cyan(\"exec zsh\")}`);\n break;\n case \"fish\":\n console.log(` Completions are loaded automatically. Restart fish if needed.`);\n break;\n }\n } catch (error) {\n console.error(\n `${colors.red(\"✗\")} Failed to install completion: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n}\n","import { getCertificate, activateCertificate } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerSiteDomainRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string; domain: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const domain = String(ctx.options.domain ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n if (!domain) {\n exitWithValidationError(\"domain_id\", usage, ctx.formatter);\n }\n\n return { server, site, domain };\n}\n\nexport async function certificatesGet(args: string[], ctx: CommandContext): Promise<void> {\n const usage = \"forge certificates get --server <server_id> --site <site_id> --domain <domain_id>\";\n\n const { server, site, domain } = requireServerSiteDomainRaw(ctx, usage);\n\n // Allow positional domain_id as first arg for convenience\n const domainId = args[0] || domain;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getCertificate({ server_id, site_id, domain_id: domainId }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"verification_method\",\n \"key_type\",\n \"status\",\n \"request_status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function certificatesActivate(args: string[], ctx: CommandContext): Promise<void> {\n const usage =\n \"forge certificates activate --server <server_id> --site <site_id> --domain <domain_id>\";\n\n const { server, site, domain } = requireServerSiteDomainRaw(ctx, usage);\n\n // Allow positional domain_id as first arg for convenience\n const domainId = args[0] || domain;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await activateCertificate({ server_id, site_id, domain_id: domainId }, execCtx);\n ctx.formatter.success(`Certificate for domain ${domainId} activated.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { certificatesGet, certificatesActivate } from \"./handlers.ts\";\n\nexport const handleCertificatesCommand = createCommandRouter({\n resource: \"certificates\",\n handlers: {\n get: [certificatesGet, \"args\"],\n activate: [certificatesActivate, \"args\"],\n },\n writeSubcommands: [\"activate\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showCertificatesHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge certificates get\")} - Get certificate for a domain\n\n${colors.bold(\"USAGE:\")}\n forge certificates get --server <server_id> --site <site_id> --domain <domain_id>\n`);\n } else if (subcommand === \"activate\") {\n console.log(`\n${colors.bold(\"forge certificates activate\")} - Activate a certificate\n\n${colors.bold(\"USAGE:\")}\n forge certificates activate --server <server_id> --site <site_id> --domain <domain_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge certificates\")} - Manage SSL certificates\n\n${colors.bold(\"USAGE:\")}\n forge certificates <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge certs\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get certificate for a domain\n activate Activate a certificate\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --domain <id> Domain record ID (required)\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"NOTE:\")}\n In Forge v2, certificates are per-domain. Use domains to manage certificates.\n\nRun ${colors.cyan(\"forge certificates <subcommand> --help\")} for details.\n`);\n }\n}\n","import { createCommand, getCommand, listCommands } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function commandsList(ctx: CommandContext): Promise<void> {\n const usage = \"forge commands list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listCommands({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"status\", \"created_at\"],\n \"No commands found.\",\n (c) =>\n `${String(c.id).padEnd(8)} ${c.command.padEnd(50)} ${c.status.padEnd(12)} ${c.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function commandsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge commands get <command_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"command_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getCommand({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"status\",\n \"user_id\",\n \"duration\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function commandsCreate(ctx: CommandContext): Promise<void> {\n const usage = \"forge commands create --server <server_id> --site <site_id> --command <command>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const command = String(ctx.options.command ?? \"\");\n\n if (!command) {\n exitWithValidationError(\"command\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await createCommand({ server_id, site_id, command }, execCtx);\n ctx.formatter.success(\"Command queued for execution.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { commandsCreate, commandsGet, commandsList } from \"./handlers.ts\";\n\nexport const handleCommandsCommand = createCommandRouter({\n resource: \"commands\",\n handlers: {\n list: commandsList,\n ls: commandsList,\n get: [commandsGet, \"args\"],\n create: commandsCreate,\n },\n writeSubcommands: [\"create\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showCommandsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge commands list\")} - List commands executed on a site\n\n${colors.bold(\"USAGE:\")}\n forge commands list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge commands get\")} - Get command details\n\n${colors.bold(\"USAGE:\")}\n forge commands get <command_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge commands create\")} - Execute a command on a site\n\n${colors.bold(\"USAGE:\")}\n forge commands create --server <server_id> --site <site_id> --command <command> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --command <cmd> Command to execute (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge commands\")} - Manage site commands\n\n${colors.bold(\"USAGE:\")}\n forge commands <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List commands\n get <id> Get command details\n create Execute a command on a site\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge commands <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Config command — manage forge configuration\n */\n\nimport {\n createConfigStore,\n setToken,\n deleteToken,\n getToken,\n getOrganizationSlug,\n setOrganizationSlug,\n} from \"../config.ts\";\nimport { OutputFormatter } from \"../output.ts\";\nimport { type OutputFormat, isOutputFormat } from \"../types.ts\";\nimport { colors } from \"../utils/colors.ts\";\n\nexport function showConfigHelp(): void {\n console.log(`\n${colors.bold(\"forge config\")} - Manage CLI configuration\n\n${colors.bold(\"USAGE:\")}\n forge config <subcommand> [key] [value]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n set <key> <value> Save a config value\n get Show current configuration (masked)\n delete Delete all stored configuration\n\n${colors.bold(\"CONFIG KEYS:\")}\n apiToken Forge API token (scoped, from Forge dashboard)\n organizationSlug Default organization slug (e.g. 'studio-meta')\n\n${colors.bold(\"EXAMPLES:\")}\n forge config set apiToken YOUR_FORGE_TOKEN\n forge config set organizationSlug studio-meta\n forge config get\n forge config delete\n`);\n}\n\nexport function handleConfigCommand(\n subcommand: string,\n args: string[],\n options: Record<string, string | boolean | string[]>,\n): void {\n const rawFormat = options.format ?? options.f ?? \"human\";\n const format: OutputFormat = isOutputFormat(rawFormat) ? rawFormat : \"human\";\n const formatter = new OutputFormatter(format, options[\"no-color\"] === true);\n\n const store = createConfigStore();\n\n switch (subcommand) {\n case \"set\": {\n const [key, value] = args;\n if (!key || !value) {\n formatter.error(\"Usage: forge config set <key> <value>\");\n formatter.info(\"Keys: apiToken, organizationSlug\");\n process.exit(1);\n return;\n }\n\n switch (key) {\n case \"apiToken\":\n setToken(value, store);\n formatter.success(\"API token saved.\");\n break;\n case \"organizationSlug\":\n setOrganizationSlug(value, store);\n formatter.success(`Organization slug set to \"${value}\".`);\n break;\n default:\n formatter.error(`Unknown config key: ${key}`);\n formatter.info(\"Valid keys: apiToken, organizationSlug\");\n process.exit(1);\n }\n break;\n }\n\n case \"get\": {\n const token = getToken(store);\n const orgSlug = getOrganizationSlug(store);\n\n if (format === \"json\") {\n formatter.output({\n apiToken: token ? maskToken(token) : null,\n organizationSlug: orgSlug ?? null,\n });\n } else {\n if (token) {\n console.log(`apiToken: ${maskToken(token)}`);\n } else {\n formatter.warning(\"No API token configured.\");\n }\n if (orgSlug) {\n console.log(`organizationSlug: ${orgSlug}`);\n } else {\n formatter.warning(\"No organization slug configured.\");\n }\n\n if (!token || !orgSlug) {\n formatter.info(\"Run: forge config set <key> <value>\");\n }\n }\n break;\n }\n\n case \"delete\": {\n deleteToken(store);\n formatter.success(\"Configuration deleted.\");\n break;\n }\n\n default:\n showConfigHelp();\n break;\n }\n}\n\nfunction maskToken(token: string): string {\n return token.length > 8\n ? `${token.slice(0, 4)}${\"*\".repeat(token.length - 8)}${token.slice(-4)}`\n : \"****\";\n}\n","import { listDaemons, getDaemon, restartDaemon, updateDaemon } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function daemonsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge daemons list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDaemons({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"user\", \"status\"],\n \"No daemons found.\",\n (d) => `${String(d.id).padEnd(8)} ${d.command.padEnd(50)} ${d.user.padEnd(16)} ${d.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function daemonsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons get <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons get <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDaemon({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"directory\",\n \"processes\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function daemonsUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge daemons update <daemon_id> --server <server_id> --name <name>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const options: Record<string, string> = { server_id, id, name };\n if (ctx.options.config) {\n options.config = String(ctx.options.config);\n }\n const result = await updateDaemon(options as never, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"directory\",\n \"processes\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function daemonsRestart(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"daemon_id\",\n \"forge daemons restart <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge daemons restart <daemon_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await restartDaemon({ server_id, id }, execCtx);\n ctx.formatter.success(`Daemon ${id} restarted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { daemonsList, daemonsGet, daemonsRestart, daemonsUpdate } from \"./handlers.ts\";\n\nexport const handleDaemonsCommand = createCommandRouter({\n resource: \"daemons\",\n handlers: {\n list: daemonsList,\n ls: daemonsList,\n get: [daemonsGet, \"args\"],\n restart: [daemonsRestart, \"args\"],\n update: [daemonsUpdate, \"args\"],\n },\n writeSubcommands: [\"restart\", \"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDaemonsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge daemons list\")} - List daemons on a server\n\n${colors.bold(\"USAGE:\")}\n forge daemons list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge daemons get\")} - Get daemon details\n\n${colors.bold(\"USAGE:\")}\n forge daemons get <daemon_id> --server <server_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge daemons update\")} - Update a daemon\n\n${colors.bold(\"USAGE:\")}\n forge daemons update <daemon_id> --server <server_id> --name <name> [--config <config>]\n`);\n } else if (subcommand === \"restart\") {\n console.log(`\n${colors.bold(\"forge daemons restart\")} - Restart a daemon\n\n${colors.bold(\"USAGE:\")}\n forge daemons restart <daemon_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge daemons\")} - Manage daemons\n\n${colors.bold(\"USAGE:\")}\n forge daemons <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List daemons\n get <id> Get daemon details\n update <id> Update a daemon\n restart <id> Restart a daemon\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge daemons <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listDatabases, getDatabase } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function databasesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge databases list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDatabases({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No databases found.\",\n (db) => `${String(db.id).padEnd(8)} ${db.name.padEnd(30)} ${db.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function databasesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"database_id\",\n \"forge databases get <database_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge databases get <database_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDatabase({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { databasesList, databasesGet } from \"./handlers.ts\";\n\nexport const handleDatabasesCommand = createCommandRouter({\n resource: \"databases\",\n handlers: {\n list: databasesList,\n ls: databasesList,\n get: [databasesGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDatabasesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge databases list\")} - List databases on a server\n\n${colors.bold(\"USAGE:\")}\n forge databases list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge databases get\")} - Get database details\n\n${colors.bold(\"USAGE:\")}\n forge databases get <database_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge databases\")} - Manage databases\n\n${colors.bold(\"USAGE:\")}\n forge databases <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge db\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List databases\n get <id> Get database details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge databases <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createDatabaseUser,\n deleteDatabaseUser,\n getDatabaseUser,\n listDatabaseUsers,\n updateDatabaseUser,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function databaseUsersList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listDatabaseUsers({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No database users found.\",\n (u) => `${String(u.id).padEnd(8)} ${u.name.padEnd(30)} ${u.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function databaseUsersGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users get <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users get <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getDatabaseUser({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n const password = String(ctx.options.password ?? \"\");\n const databasesRaw = ctx.options.databases;\n const databases = Array.isArray(databasesRaw)\n ? databasesRaw.map(Number)\n : databasesRaw\n ? [Number(databasesRaw)]\n : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n if (!password) {\n exitWithValidationError(\n \"password\",\n \"forge database-users create --server <server_id> --name <name> --password <password>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createDatabaseUser(\n { server_id, name, password, ...(databases ? { databases } : {}) },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const password = ctx.options.password != null ? String(ctx.options.password) : undefined;\n const databaseIdsRaw = ctx.options[\"database-ids\"] ?? ctx.options.database_ids;\n const database_ids = Array.isArray(databaseIdsRaw)\n ? databaseIdsRaw.map(Number)\n : databaseIdsRaw\n ? [Number(databaseIdsRaw)]\n : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users update <user_id> --server <server_id> [--password <password>] [--database-ids <ids>]\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users update <user_id> --server <server_id> [--password <password>] [--database-ids <ids>]\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await updateDatabaseUser(\n {\n server_id,\n id,\n ...(password !== undefined ? { password } : {}),\n ...(database_ids ? { database_ids } : {}),\n },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function databaseUsersDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"user_id\",\n \"forge database-users delete <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge database-users delete <user_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteDatabaseUser({ server_id, id }, execCtx);\n ctx.formatter.success(`Database user ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n databaseUsersCreate,\n databaseUsersDelete,\n databaseUsersGet,\n databaseUsersList,\n databaseUsersUpdate,\n} from \"./handlers.ts\";\n\nexport const handleDatabaseUsersCommand = createCommandRouter({\n resource: \"database-users\",\n handlers: {\n list: databaseUsersList,\n ls: databaseUsersList,\n get: [databaseUsersGet, \"args\"],\n create: databaseUsersCreate,\n update: [databaseUsersUpdate, \"args\"],\n delete: [databaseUsersDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDatabaseUsersHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge database-users list\")} - List database users on a server\n\n${colors.bold(\"USAGE:\")}\n forge database-users list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge database-users get\")} - Get database user details\n\n${colors.bold(\"USAGE:\")}\n forge database-users get <user_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge database-users create\")} - Create a new database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users create --server <server_id> --name <name> --password <password> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> Database user name (required)\n --password <pass> User password (required)\n --databases <ids> Comma-separated database IDs to grant access to (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge database-users update\")} - Update a database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users update <user_id> --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --password <pass> New password (optional)\n --database-ids <ids> Comma-separated database IDs (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge database-users delete\")} - Delete a database user\n\n${colors.bold(\"USAGE:\")}\n forge database-users delete <user_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge database-users\")} - Manage database users\n\n${colors.bold(\"USAGE:\")}\n forge database-users <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List database users\n get <id> Get database user details\n create Create a new database user\n update <id> Update a database user\n delete <id> Delete a database user\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge database-users <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listDeployments, deploySiteAndWait } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function deploymentsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge deployments list --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge deployments list --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listDeployments({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"status\", \"commit\", \"started_at\"],\n \"No deployments found.\",\n (d) =>\n `${String(d.id).padEnd(8)} ${d.status.padEnd(12)} ${(d.commit.hash ?? \"—\").padEnd(10)} ${d.started_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function deploymentsDeploy(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const streamLogs = Boolean(ctx.options.stream);\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge deployments deploy --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge deployments deploy --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n\n const result = await deploySiteAndWait(\n {\n server_id,\n site_id,\n // Use either progress callback OR log streaming, not both\n onProgress: streamLogs\n ? undefined\n : ({ status, elapsed_ms }) => {\n process.stderr.write(`\\rDeploying… ${status} (${(elapsed_ms / 1000).toFixed(1)}s)`);\n },\n onLog: streamLogs\n ? (chunk) => {\n process.stdout.write(chunk);\n }\n : undefined,\n },\n execCtx,\n );\n\n // Clear the progress line (only needed in non-stream mode)\n if (!streamLogs) {\n process.stderr.write(\"\\n\");\n }\n\n const elapsedSec = (result.data.elapsed_ms / 1000).toFixed(1);\n\n if (result.data.status === \"success\") {\n ctx.formatter.success(`Deployment succeeded for site ${site_id} (${elapsedSec}s).`);\n } else {\n ctx.formatter.error(`Deployment failed for site ${site_id} (${elapsedSec}s).`);\n }\n\n // Only output full log if we didn't stream it\n if (!streamLogs && result.data.log) {\n ctx.formatter.output(result.data.log);\n }\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { deploymentsList, deploymentsDeploy } from \"./handlers.ts\";\n\nexport const handleDeploymentsCommand = createCommandRouter({\n resource: \"deployments\",\n handlers: {\n list: deploymentsList,\n ls: deploymentsList,\n deploy: deploymentsDeploy,\n },\n writeSubcommands: [\"deploy\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showDeploymentsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge deployments list\")} - List deployments for a site\n\n${colors.bold(\"USAGE:\")}\n forge deployments list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"deploy\") {\n console.log(`\n${colors.bold(\"forge deployments deploy\")} - Trigger a deployment\n\n${colors.bold(\"USAGE:\")}\n forge deployments deploy --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --stream Stream deployment logs in real-time (default: show progress)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge deployments\")} - Manage deployments\n\n${colors.bold(\"USAGE:\")}\n forge deployments <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge d\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List deployments for a site\n deploy Trigger a deployment\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge deployments <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getEnv, updateEnv } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function envGet(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge env get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge env get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getEnv({ server_id, site_id }, execCtx);\n if (ctx.formatter.isJson()) {\n console.log(JSON.stringify({ content: result.data }));\n } else {\n console.log(result.data);\n }\n }, ctx.formatter);\n}\n\nexport async function envUpdate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge env update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await updateEnv({ server_id, site_id, content }, execCtx);\n ctx.formatter.success(\"Environment variables updated.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { envGet, envUpdate } from \"./handlers.ts\";\n\nexport const handleEnvCommand = createCommandRouter({\n resource: \"env\",\n handlers: {\n get: envGet,\n update: envUpdate,\n },\n writeSubcommands: [\"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showEnvHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge env get\")} - Get environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env get --server <server_id> --site <site_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge env update\")} - Update environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env update --server <server_id> --site <site_id> --content <env_content>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge env\")} - Manage environment variables\n\n${colors.bold(\"USAGE:\")}\n forge env <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get environment variables\n update Update environment variables\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --content <str> New env content (for update)\n -f, --format <fmt> Output format: json, human\n\nRun ${colors.cyan(\"forge env <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listFirewallRules, getFirewallRule } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function firewallRulesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge firewall-rules list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listFirewallRules({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"port\", \"type\", \"ip_address\", \"status\"],\n \"No firewall rules found.\",\n (r) =>\n `${String(r.id).padEnd(8)} ${r.name.padEnd(20)} ${String(r.port).padEnd(8)} ${r.type.padEnd(8)} ${(r.ip_address ?? \"any\").padEnd(16)} ${r.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function firewallRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"firewall_rule_id\",\n \"forge firewall-rules get <rule_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge firewall-rules get <rule_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getFirewallRule({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"port\",\n \"type\",\n \"ip_address\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { firewallRulesList, firewallRulesGet } from \"./handlers.ts\";\n\nexport const handleFirewallRulesCommand = createCommandRouter({\n resource: \"firewall-rules\",\n handlers: {\n list: firewallRulesList,\n ls: firewallRulesList,\n get: [firewallRulesGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showFirewallRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge firewall-rules list\")} - List firewall rules on a server\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge firewall-rules get\")} - Get firewall rule details\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules get <rule_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge firewall-rules\")} - Manage firewall rules\n\n${colors.bold(\"USAGE:\")}\n forge firewall-rules <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge fw\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List firewall rules\n get <id> Get firewall rule details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge firewall-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","import { createMonitor, deleteMonitor, getMonitor, listMonitors } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function monitorsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge monitors list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listMonitors({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"type\", \"operator\", \"threshold\", \"state\"],\n \"No monitors found.\",\n (m) =>\n `${String(m.id).padEnd(8)} ${m.type.padEnd(20)} ${m.operator.padEnd(8)} ${String(m.threshold).padEnd(6)} ${m.state}`,\n );\n }, ctx.formatter);\n}\n\nexport async function monitorsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"monitor_id\",\n \"forge monitors get <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors get <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getMonitor({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"operator\",\n \"threshold\",\n \"minutes\",\n \"state\",\n \"state_changed_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function monitorsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const type = String(ctx.options.type ?? \"\");\n const operator = String(ctx.options.operator ?? \"\");\n const threshold = Number(ctx.options.threshold ?? 0);\n const notify = String(ctx.options.notify ?? \"\");\n const minutes = Number(ctx.options.minutes ?? 0);\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n if (!type) {\n exitWithValidationError(\n \"type\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n if (!operator) {\n exitWithValidationError(\n \"operator\",\n \"forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createMonitor(\n { server_id, type, operator, threshold, notify, minutes },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"type\",\n \"operator\",\n \"threshold\",\n \"minutes\",\n \"state\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function monitorsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"monitor_id\",\n \"forge monitors delete <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge monitors delete <monitor_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteMonitor({ server_id, id }, execCtx);\n ctx.formatter.success(`Monitor ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { monitorsCreate, monitorsDelete, monitorsGet, monitorsList } from \"./handlers.ts\";\n\nexport const handleMonitorsCommand = createCommandRouter({\n resource: \"monitors\",\n handlers: {\n list: monitorsList,\n ls: monitorsList,\n get: [monitorsGet, \"args\"],\n create: monitorsCreate,\n delete: [monitorsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showMonitorsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge monitors list\")} - List monitors on a server\n\n${colors.bold(\"USAGE:\")}\n forge monitors list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge monitors get\")} - Get monitor details\n\n${colors.bold(\"USAGE:\")}\n forge monitors get <monitor_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge monitors create\")} - Create a new monitor\n\n${colors.bold(\"USAGE:\")}\n forge monitors create --server <server_id> --type <type> --operator <operator> --threshold <threshold> --minutes <minutes> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --type <type> Monitor type (required)\n --operator <op> Comparison operator (required)\n --threshold <num> Alert threshold value (required)\n --minutes <num> Duration in minutes (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge monitors delete\")} - Delete a monitor\n\n${colors.bold(\"USAGE:\")}\n forge monitors delete <monitor_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge monitors\")} - Manage server monitors\n\n${colors.bold(\"USAGE:\")}\n forge monitors <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List monitors\n get <id> Get monitor details\n create Create a new monitor\n delete <id> Delete a monitor\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge monitors <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getNginxConfig, updateNginxConfig } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function nginxGet(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge nginx get --server <server_id> --site <site_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getNginxConfig({ server_id, site_id }, execCtx);\n if (ctx.formatter.isJson()) {\n console.log(JSON.stringify({ content: result.data }));\n } else {\n console.log(result.data);\n }\n }, ctx.formatter);\n}\n\nexport async function nginxUpdate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!site) {\n exitWithValidationError(\n \"site_id\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge nginx update --server <server_id> --site <site_id> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await updateNginxConfig({ server_id, site_id, content }, execCtx);\n ctx.formatter.success(\"Nginx configuration updated.\");\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { nginxGet, nginxUpdate } from \"./handlers.ts\";\n\nexport const handleNginxCommand = createCommandRouter({\n resource: \"nginx\",\n handlers: {\n get: nginxGet,\n update: nginxUpdate,\n },\n writeSubcommands: [\"update\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showNginxHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge nginx get\")} - Get nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx get --server <server_id> --site <site_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge nginx update\")} - Update nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx update --server <server_id> --site <site_id> --content <nginx_config>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge nginx\")} - Manage nginx configuration\n\n${colors.bold(\"USAGE:\")}\n forge nginx <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get nginx configuration\n update Update nginx configuration\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --content <str> New nginx config (for update)\n\nRun ${colors.cyan(\"forge nginx <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createNginxTemplate,\n deleteNginxTemplate,\n getNginxTemplate,\n listNginxTemplates,\n updateNginxTemplate,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function nginxTemplatesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listNginxTemplates({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"created_at\"],\n \"No Nginx templates found.\",\n (t) => `${String(t.id).padEnd(8)} ${t.name.padEnd(40)} ${t.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates get <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates get <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getNginxTemplate({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\", \"content\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const name = String(ctx.options.name ?? \"\");\n const content = String(ctx.options.content ?? \"\");\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!name) {\n exitWithValidationError(\n \"name\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n if (!content) {\n exitWithValidationError(\n \"content\",\n \"forge nginx-templates create --server <server_id> --name <name> --content <content>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await createNginxTemplate({ server_id, name, content }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates update <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates update <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const name = ctx.options.name ? String(ctx.options.name) : undefined;\n const content = ctx.options.content ? String(ctx.options.content) : undefined;\n const result = await updateNginxTemplate({ server_id, id, name, content }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function nginxTemplatesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"template_id\",\n \"forge nginx-templates delete <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge nginx-templates delete <template_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await deleteNginxTemplate({ server_id, id }, execCtx);\n ctx.formatter.success(`Nginx template ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n nginxTemplatesCreate,\n nginxTemplatesDelete,\n nginxTemplatesGet,\n nginxTemplatesList,\n nginxTemplatesUpdate,\n} from \"./handlers.ts\";\n\nexport const handleNginxTemplatesCommand = createCommandRouter({\n resource: \"nginx-templates\",\n handlers: {\n list: nginxTemplatesList,\n ls: nginxTemplatesList,\n get: [nginxTemplatesGet, \"args\"],\n create: nginxTemplatesCreate,\n update: [nginxTemplatesUpdate, \"args\"],\n delete: [nginxTemplatesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showNginxTemplatesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge nginx-templates list\")} - List Nginx templates on a server\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge nginx-templates get\")} - Get Nginx template details\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates get <template_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge nginx-templates create\")} - Create a new Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates create --server <server_id> --name <name> --content <content> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> Template name (required)\n --content <text> Template content (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge nginx-templates update\")} - Update an Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates update <template_id> --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --name <name> New template name (optional)\n --content <text> New template content (optional)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge nginx-templates delete\")} - Delete an Nginx template\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates delete <template_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge nginx-templates\")} - Manage Nginx templates\n\n${colors.bold(\"USAGE:\")}\n forge nginx-templates <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List Nginx templates\n get <id> Get Nginx template details\n create Create a new Nginx template\n update <id> Update an Nginx template\n delete <id> Delete an Nginx template\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge nginx-templates <subcommand> --help\")} for details.\n`);\n }\n}\n","import { listRecipes, getRecipe, runRecipe, updateRecipe } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\n\nexport async function recipesList(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await listRecipes({}, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"user\", \"created_at\"],\n \"No recipes found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.name.padEnd(40)} ${r.user.padEnd(16)} ${r.created_at}`,\n );\n }, ctx.formatter);\n}\n\nexport async function recipesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n\n if (!id) {\n exitWithValidationError(\"id\", \"forge recipes get <recipe_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await getRecipe({ id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"user\", \"created_at\", \"script\"]);\n }, ctx.formatter);\n}\n\nexport async function recipesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n\n if (!id) {\n exitWithValidationError(\n \"id\",\n \"forge recipes update <recipe_id> [--name ...] [--user ...] [--script ...]\",\n ctx.formatter,\n );\n }\n\n const name = ctx.options.name as string | undefined;\n const user = ctx.options.user as string | undefined;\n const script = ctx.options.script as string | undefined;\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await updateRecipe({ id, name, user, script }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"user\", \"created_at\", \"script\"]);\n }, ctx.formatter);\n}\n\nexport async function recipesRun(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const serversRaw = String(ctx.options.servers ?? \"\");\n\n if (!id) {\n exitWithValidationError(\"id\", \"forge recipes run <recipe_id> --servers <ids>\", ctx.formatter);\n }\n\n if (!serversRaw) {\n exitWithValidationError(\n \"servers\",\n \"forge recipes run <recipe_id> --servers <server_id1,server_id2,...>\",\n ctx.formatter,\n );\n }\n\n const servers = serversRaw\n .split(\",\")\n .map((s) => Number(s.trim()))\n .filter((n) => !isNaN(n));\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n await runRecipe({ id, servers }, execCtx);\n ctx.formatter.success(`Recipe ${id} dispatched to ${servers.length} server(s).`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { recipesList, recipesGet, recipesRun, recipesUpdate } from \"./handlers.ts\";\n\nexport const handleRecipesCommand = createCommandRouter({\n resource: \"recipes\",\n handlers: {\n list: recipesList,\n ls: recipesList,\n get: [recipesGet, \"args\"],\n update: [recipesUpdate, \"args\"],\n run: [recipesRun, \"args\"],\n },\n writeSubcommands: [\"update\", \"run\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showRecipesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge recipes list\")} - List all recipes\n\n${colors.bold(\"USAGE:\")}\n forge recipes list [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge recipes get\")} - Get recipe details\n\n${colors.bold(\"USAGE:\")}\n forge recipes get <recipe_id>\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge recipes update\")} - Update a recipe\n\n${colors.bold(\"USAGE:\")}\n forge recipes update <recipe_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --name <name> New recipe name\n --user <user> New recipe user\n --script <script> New recipe script\n`);\n } else if (subcommand === \"run\") {\n console.log(`\n${colors.bold(\"forge recipes run\")} - Run a recipe on servers\n\n${colors.bold(\"USAGE:\")}\n forge recipes run <recipe_id> --servers <server_id1,server_id2,...>\n\n${colors.bold(\"OPTIONS:\")}\n --servers <ids> Comma-separated server IDs to run recipe on\n`);\n } else {\n console.log(`\n${colors.bold(\"forge recipes\")} - Manage recipes\n\n${colors.bold(\"USAGE:\")}\n forge recipes <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List all recipes\n get <id> Get recipe details\n update <id> Update a recipe\n run <id> Run a recipe on servers\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge recipes <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createRedirectRule,\n deleteRedirectRule,\n getRedirectRule,\n listRedirectRules,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function redirectRulesList(ctx: CommandContext): Promise<void> {\n const usage = \"forge redirect-rules list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listRedirectRules({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"from\", \"to\", \"type\"],\n \"No redirect rules found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.from.padEnd(30)} ${r.to.padEnd(30)} ${r.type}`,\n );\n }, ctx.formatter);\n}\n\nexport async function redirectRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge redirect-rules get <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getRedirectRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"from\", \"to\", \"type\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function redirectRulesCreate(ctx: CommandContext): Promise<void> {\n const usage =\n \"forge redirect-rules create --server <server_id> --site <site_id> --from <from> --to <to>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const from = String(ctx.options.from ?? \"\");\n const to = String(ctx.options.to ?? \"\");\n const type = String(ctx.options.type ?? \"redirect\");\n\n if (!from) {\n exitWithValidationError(\"from\", usage, ctx.formatter);\n }\n\n if (!to) {\n exitWithValidationError(\"to\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await createRedirectRule({ server_id, site_id, from, to, type }, execCtx);\n ctx.formatter.success(\"Redirect rule created.\");\n }, ctx.formatter);\n}\n\nexport async function redirectRulesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge redirect-rules delete <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await deleteRedirectRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.success(`Redirect rule ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n redirectRulesCreate,\n redirectRulesDelete,\n redirectRulesGet,\n redirectRulesList,\n} from \"./handlers.ts\";\n\nexport const handleRedirectRulesCommand = createCommandRouter({\n resource: \"redirect-rules\",\n handlers: {\n list: redirectRulesList,\n ls: redirectRulesList,\n get: [redirectRulesGet, \"args\"],\n create: redirectRulesCreate,\n delete: [redirectRulesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showRedirectRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge redirect-rules list\")} - List redirect rules for a site\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge redirect-rules get\")} - Get redirect rule details\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules get <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge redirect-rules create\")} - Create a new redirect rule\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules create --server <server_id> --site <site_id> --from <from> --to <to> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --from <path> Source path to redirect from (required)\n --to <path> Destination path to redirect to (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge redirect-rules delete\")} - Delete a redirect rule\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules delete <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge redirect-rules\")} - Manage site redirect rules\n\n${colors.bold(\"USAGE:\")}\n forge redirect-rules <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List redirect rules\n get <id> Get redirect rule details\n create Create a new redirect rule\n delete <id> Delete a redirect rule\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge redirect-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createScheduledJob,\n deleteScheduledJob,\n getScheduledJob,\n listScheduledJobs,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function scheduledJobsList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs list --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await listScheduledJobs({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"command\", \"frequency\", \"status\"],\n \"No scheduled jobs found.\",\n (j) =>\n `${String(j.id).padEnd(8)} ${j.command.padEnd(50)} ${j.frequency.padEnd(12)} ${j.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"job_id\",\n \"forge scheduled-jobs get <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs get <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await getScheduledJob({ server_id, id, site_id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"frequency\",\n \"cron\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsCreate(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n const command = String(ctx.options.command ?? \"\");\n const user = String(ctx.options.user ?? \"forge\");\n const frequency = String(ctx.options.frequency ?? \"custom\");\n const cron = ctx.options.cron ? String(ctx.options.cron) : undefined;\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs create --server <server_id> --command <command> --user <user> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n if (!command) {\n exitWithValidationError(\n \"command\",\n \"forge scheduled-jobs create --server <server_id> --command <command> --user <user> --frequency <frequency>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n const result = await createScheduledJob(\n { server_id, site_id, command, user, frequency, cron },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"command\",\n \"user\",\n \"frequency\",\n \"cron\",\n \"status\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function scheduledJobsDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n const site = ctx.options.site ? String(ctx.options.site) : undefined;\n\n if (!id) {\n exitWithValidationError(\n \"job_id\",\n \"forge scheduled-jobs delete <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge scheduled-jobs delete <job_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = site ? await resolveSiteId(site, server_id, execCtx) : undefined;\n await deleteScheduledJob({ server_id, id, site_id }, execCtx);\n ctx.formatter.success(`Scheduled job ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n scheduledJobsCreate,\n scheduledJobsDelete,\n scheduledJobsGet,\n scheduledJobsList,\n} from \"./handlers.ts\";\n\nexport const handleScheduledJobsCommand = createCommandRouter({\n resource: \"scheduled-jobs\",\n handlers: {\n list: scheduledJobsList,\n ls: scheduledJobsList,\n get: [scheduledJobsGet, \"args\"],\n create: scheduledJobsCreate,\n delete: [scheduledJobsDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showScheduledJobsHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs list\")} - List scheduled jobs on a server\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs get\")} - Get scheduled job details\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs get <job_id> --server <server_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs create\")} - Create a new scheduled job\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs create --server <server_id> --command <command> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --command <cmd> Command to run (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge scheduled-jobs delete\")} - Delete a scheduled job\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs delete <job_id> --server <server_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge scheduled-jobs\")} - Manage scheduled jobs (cron)\n\n${colors.bold(\"USAGE:\")}\n forge scheduled-jobs <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List scheduled jobs\n get <id> Get scheduled job details\n create Create a new scheduled job\n delete <id> Delete a scheduled job\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge scheduled-jobs <subcommand> --help\")} for details.\n`);\n }\n}\n","import {\n createSecurityRule,\n deleteSecurityRule,\n getSecurityRule,\n listSecurityRules,\n updateSecurityRule,\n} from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nfunction requireServerAndSiteRaw(\n ctx: CommandContext,\n usage: string,\n): { server: string; site: string } {\n const server = String(ctx.options.server ?? \"\");\n const site = String(ctx.options.site ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", usage, ctx.formatter);\n }\n if (!site) {\n exitWithValidationError(\"site_id\", usage, ctx.formatter);\n }\n\n return { server, site };\n}\n\nexport async function securityRulesList(ctx: CommandContext): Promise<void> {\n const usage = \"forge security-rules list --server <server_id> --site <site_id>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await listSecurityRules({ server_id, site_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"path\"],\n \"No security rules found.\",\n (r) => `${String(r.id).padEnd(8)} ${r.name.padEnd(30)} ${r.path ?? \"—\"}`,\n );\n }, ctx.formatter);\n}\n\nexport async function securityRulesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge security-rules get <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await getSecurityRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesCreate(ctx: CommandContext): Promise<void> {\n const usage = \"forge security-rules create --server <server_id> --site <site_id> --name <name>\";\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const name = String(ctx.options.name ?? \"\");\n\n if (!name) {\n exitWithValidationError(\"name\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await createSecurityRule({ server_id, site_id, name, credentials: [] }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage =\n \"forge security-rules update <rule_id> --server <server_id> --site <site_id> --name <name>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n const name = String(ctx.options.name ?? \"\");\n\n if (!name) {\n exitWithValidationError(\"name\", usage, ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n const result = await updateSecurityRule(\n { server_id, site_id, id, name, credentials: [] },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"path\", \"created_at\"]);\n }, ctx.formatter);\n}\n\nexport async function securityRulesDelete(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const usage = \"forge security-rules delete <rule_id> --server <server_id> --site <site_id>\";\n\n if (!id) {\n exitWithValidationError(\"rule_id\", usage, ctx.formatter);\n }\n\n const { server, site } = requireServerAndSiteRaw(ctx, usage);\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(site, server_id, execCtx);\n await deleteSecurityRule({ server_id, site_id, id }, execCtx);\n ctx.formatter.success(`Security rule ${id} deleted.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport {\n securityRulesCreate,\n securityRulesDelete,\n securityRulesGet,\n securityRulesList,\n securityRulesUpdate,\n} from \"./handlers.ts\";\n\nexport const handleSecurityRulesCommand = createCommandRouter({\n resource: \"security-rules\",\n handlers: {\n list: securityRulesList,\n ls: securityRulesList,\n get: [securityRulesGet, \"args\"],\n create: securityRulesCreate,\n update: [securityRulesUpdate, \"args\"],\n delete: [securityRulesDelete, \"args\"],\n },\n writeSubcommands: [\"create\", \"update\", \"delete\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSecurityRulesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge security-rules list\")} - List security rules for a site\n\n${colors.bold(\"USAGE:\")}\n forge security-rules list --server <server_id> --site <site_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge security-rules get\")} - Get security rule details\n\n${colors.bold(\"USAGE:\")}\n forge security-rules get <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else if (subcommand === \"create\") {\n console.log(`\n${colors.bold(\"forge security-rules create\")} - Create a new security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules create --server <server_id> --site <site_id> --name <name> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --name <name> Security rule name (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"update\") {\n console.log(`\n${colors.bold(\"forge security-rules update\")} - Update a security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules update <rule_id> --server <server_id> --site <site_id> --name <name> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n --name <name> Security rule name (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else if (subcommand === \"delete\") {\n console.log(`\n${colors.bold(\"forge security-rules delete\")} - Delete a security rule\n\n${colors.bold(\"USAGE:\")}\n forge security-rules delete <rule_id> --server <server_id> --site <site_id> [options]\n`);\n } else {\n console.log(`\n${colors.bold(\"forge security-rules\")} - Manage site security rules\n\n${colors.bold(\"USAGE:\")}\n forge security-rules <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List security rules\n get <id> Get security rule details\n create Create a new security rule\n update <id> Update a security rule\n delete <id> Delete a security rule\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n --site <id> Site ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge security-rules <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * CLI handlers for servers commands.\n * Delegates all HTTP logic to forge-core executors.\n */\n\nimport { listServers, getServer, rebootServer } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\n/**\n * List all servers.\n */\nexport async function serversList(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await listServers({}, execCtx);\n\n const format = String(ctx.options.format ?? ctx.options.f ?? \"human\");\n\n if (format === \"table\" || format === \"json\") {\n ctx.formatter.output(result.data);\n } else {\n if (result.data.length === 0) {\n ctx.formatter.info(\"No servers found.\");\n return;\n }\n for (const server of result.data) {\n console.log(\n `${String(server.id).padEnd(8)} ${server.name.padEnd(30)} ${(server.ip_address ?? \"—\").padEnd(16)} ${server.is_ready ? \"ready\" : \"provisioning\"}`,\n );\n }\n }\n }, ctx.formatter);\n}\n\n/**\n * Get a single server by ID or name.\n */\nexport async function serversGet(args: string[], ctx: CommandContext): Promise<void> {\n const [server] = args;\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge servers get <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getServer({ server_id }, execCtx);\n ctx.formatter.output(result.data);\n }, ctx.formatter);\n}\n\n/**\n * Reboot a server by ID or name.\n */\nexport async function serversReboot(args: string[], ctx: CommandContext): Promise<void> {\n const [server] = args;\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge servers reboot <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n await rebootServer({ server_id }, execCtx);\n ctx.formatter.success(`Server ${server_id} reboot initiated.`);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { serversList, serversGet, serversReboot } from \"./handlers.ts\";\n\nexport const handleServersCommand = createCommandRouter({\n resource: \"servers\",\n handlers: {\n list: serversList,\n ls: serversList,\n get: [serversGet, \"args\"],\n reboot: [serversReboot, \"args\"],\n },\n writeSubcommands: [\"reboot\"],\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showServersHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge servers list\")} - List all servers\n\n${colors.bold(\"USAGE:\")}\n forge servers list [options]\n\n${colors.bold(\"OPTIONS:\")}\n --token <token> Forge API token\n -f, --format <fmt> Output format: json, human, table (default: human)\n --no-color Disable colored output\n -h, --help Show this help\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers list\n forge servers list --format json\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge servers get\")} - Get server details\n\n${colors.bold(\"USAGE:\")}\n forge servers get <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <server_id> Server ID (required)\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers get 123\n forge servers get 123 --format json\n`);\n } else if (subcommand === \"reboot\") {\n console.log(`\n${colors.bold(\"forge servers reboot\")} - Reboot a server\n\n${colors.bold(\"USAGE:\")}\n forge servers reboot <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <server_id> Server ID (required)\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers reboot 123\n`);\n } else {\n console.log(`\n${colors.bold(\"forge servers\")} - Manage servers\n\n${colors.bold(\"USAGE:\")}\n forge servers <subcommand> [options]\n\n${colors.bold(\"ALIASES:\")}\n forge s\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List all servers\n get <id> Get server details\n reboot <id> Reboot a server\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n -h, --help Show help for a subcommand\n\n${colors.bold(\"EXAMPLES:\")}\n forge servers list\n forge servers get 123\n\nRun ${colors.cyan(\"forge servers <subcommand> --help\")} for subcommand details.\n`);\n }\n}\n","import { listSites, getSite, updateSite } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId, resolveSiteId } from \"../../utils/resolve.ts\";\n\nexport async function sitesList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge sites list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listSites({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\", \"php_version\"],\n \"No sites found.\",\n (s) =>\n `${String(s.id).padEnd(8)} ${s.name.padEnd(40)} ${s.status.padEnd(12)} ${s.php_version}`,\n );\n }, ctx.formatter);\n}\n\nexport async function sitesGet(args: string[], ctx: CommandContext): Promise<void> {\n const [siteArg] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!siteArg) {\n exitWithValidationError(\n \"site_id\",\n \"forge sites get <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge sites get <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(siteArg, server_id, execCtx);\n const result = await getSite({ server_id, site_id }, execCtx);\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"status\",\n \"php_version\",\n \"app_type\",\n \"repository\",\n \"quick_deploy\",\n \"deployment_status\",\n \"https\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n\nexport async function sitesUpdate(args: string[], ctx: CommandContext): Promise<void> {\n const [siteArg] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!siteArg) {\n exitWithValidationError(\n \"site_id\",\n \"forge sites update <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge sites update <site_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const site_id = await resolveSiteId(siteArg, server_id, execCtx);\n const result = await updateSite(\n {\n server_id,\n site_id,\n root_path: ctx.options.root_path as string | undefined,\n directory: ctx.options.directory as string | undefined,\n type: ctx.options.type as string | undefined,\n php_version: ctx.options.php_version as string | undefined,\n push_to_deploy:\n ctx.options.push_to_deploy !== undefined\n ? ctx.options.push_to_deploy === \"true\" || ctx.options.push_to_deploy === true\n : undefined,\n repository_branch: ctx.options.repository_branch as string | undefined,\n },\n execCtx,\n );\n ctx.formatter.outputOne(result.data, [\n \"id\",\n \"name\",\n \"status\",\n \"php_version\",\n \"app_type\",\n \"repository\",\n \"quick_deploy\",\n \"deployment_status\",\n \"https\",\n \"created_at\",\n ]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { sitesList, sitesGet, sitesUpdate } from \"./handlers.ts\";\n\nexport const handleSitesCommand = createCommandRouter({\n resource: \"sites\",\n handlers: {\n list: sitesList,\n ls: sitesList,\n get: [sitesGet, \"args\"],\n update: [sitesUpdate, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSitesHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge sites list\")} - List sites on a server\n\n${colors.bold(\"USAGE:\")}\n forge sites list --server <server_id> [options]\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\n${colors.bold(\"EXAMPLES:\")}\n forge sites list --server 123\n forge sites list --server 123 --format json\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge sites get\")} - Get site details\n\n${colors.bold(\"USAGE:\")}\n forge sites get <site_id> --server <server_id> [options]\n\n${colors.bold(\"ARGUMENTS:\")}\n <site_id> Site ID (required)\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge sites\")} - Manage sites\n\n${colors.bold(\"USAGE:\")}\n forge sites <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List sites on a server\n get <id> Get site details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required for most commands)\n -f, --format <fmt> Output format: json, human, table\n -h, --help Show help for a subcommand\n\n${colors.bold(\"EXAMPLES:\")}\n forge sites list --server 123\n forge sites get 456 --server 123\n\nRun ${colors.cyan(\"forge sites <subcommand> --help\")} for subcommand details.\n`);\n }\n}\n","import { listSshKeys, getSshKey } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { exitWithValidationError, runCommand } from \"../../error-handler.ts\";\nimport { resolveServerId } from \"../../utils/resolve.ts\";\n\nexport async function sshKeysList(ctx: CommandContext): Promise<void> {\n const server = String(ctx.options.server ?? \"\");\n\n if (!server) {\n exitWithValidationError(\"server_id\", \"forge ssh-keys list --server <server_id>\", ctx.formatter);\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await listSshKeys({ server_id }, execCtx);\n ctx.formatter.outputList(\n result.data,\n [\"id\", \"name\", \"status\"],\n \"No SSH keys found.\",\n (k) => `${String(k.id).padEnd(8)} ${k.name.padEnd(30)} ${k.status}`,\n );\n }, ctx.formatter);\n}\n\nexport async function sshKeysGet(args: string[], ctx: CommandContext): Promise<void> {\n const [id] = args;\n const server = String(ctx.options.server ?? \"\");\n\n if (!id) {\n exitWithValidationError(\n \"ssh_key_id\",\n \"forge ssh-keys get <key_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n if (!server) {\n exitWithValidationError(\n \"server_id\",\n \"forge ssh-keys get <key_id> --server <server_id>\",\n ctx.formatter,\n );\n }\n\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const server_id = await resolveServerId(server, execCtx);\n const result = await getSshKey({ server_id, id }, execCtx);\n ctx.formatter.outputOne(result.data, [\"id\", \"name\", \"status\", \"created_at\"]);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { sshKeysList, sshKeysGet } from \"./handlers.ts\";\n\nexport const handleSshKeysCommand = createCommandRouter({\n resource: \"ssh-keys\",\n handlers: {\n list: sshKeysList,\n ls: sshKeysList,\n get: [sshKeysGet, \"args\"],\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showSshKeysHelp(subcommand?: string): void {\n if (subcommand === \"list\" || subcommand === \"ls\") {\n console.log(`\n${colors.bold(\"forge ssh-keys list\")} - List SSH keys on a server\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys list --server <server_id> [options]\n`);\n } else if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge ssh-keys get\")} - Get SSH key details\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys get <key_id> --server <server_id>\n`);\n } else {\n console.log(`\n${colors.bold(\"forge ssh-keys\")} - Manage SSH keys\n\n${colors.bold(\"USAGE:\")}\n forge ssh-keys <subcommand> [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n list, ls List SSH keys\n get <id> Get SSH key details\n\n${colors.bold(\"OPTIONS:\")}\n --server <id> Server ID (required)\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge ssh-keys <subcommand> --help\")} for details.\n`);\n }\n}\n","import { getUser } from \"@studiometa/forge-core\";\n\nimport type { CommandContext } from \"../../context.ts\";\n\nimport { runCommand } from \"../../error-handler.ts\";\n\nexport async function userGet(ctx: CommandContext): Promise<void> {\n await runCommand(async () => {\n const token = ctx.getToken();\n const execCtx = ctx.createExecutorContext(token);\n const result = await getUser({}, execCtx);\n ctx.formatter.output(result.data);\n }, ctx.formatter);\n}\n","import { createCommandRouter } from \"../../utils/command-router.ts\";\nimport { userGet } from \"./handlers.ts\";\n\nexport const handleUserCommand = createCommandRouter({\n resource: \"user\",\n handlers: {\n get: userGet,\n },\n});\n","import { colors } from \"../../utils/colors.ts\";\n\nexport function showUserHelp(subcommand?: string): void {\n if (subcommand === \"get\") {\n console.log(`\n${colors.bold(\"forge user get\")} - Get the authenticated user profile\n\n${colors.bold(\"USAGE:\")}\n forge user get [options]\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n`);\n } else {\n console.log(`\n${colors.bold(\"forge user\")} - Display authenticated user profile\n\n${colors.bold(\"USAGE:\")}\n forge user [subcommand] [options]\n\n${colors.bold(\"SUBCOMMANDS:\")}\n get Get the authenticated user profile\n\n${colors.bold(\"OPTIONS:\")}\n -f, --format <fmt> Output format: json, human, table\n\nRun ${colors.cyan(\"forge user <subcommand> --help\")} for details.\n`);\n }\n}\n","/**\n * Simple argument parser using native Node.js.\n * Parses process.argv into a structured format with no external deps.\n */\n\nexport type OptionValue = string | boolean | string[];\nexport type CommandOptions = Record<string, OptionValue>;\n\nexport interface ParsedArgs {\n command: string[];\n options: Record<string, OptionValue>;\n positional: string[];\n}\n\nexport function parseArgs(argv: string[] = process.argv.slice(2)): ParsedArgs {\n const options: Record<string, string | boolean | string[]> = {};\n const positional: string[] = [];\n const command: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key value or --flag\n const equalIndex = arg.indexOf(\"=\");\n if (equalIndex > -1) {\n const key = arg.slice(2, equalIndex);\n const value = arg.slice(equalIndex + 1);\n options[key] = value;\n } else {\n const key = arg.slice(2);\n const nextArg = argv[i + 1];\n\n if (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n options[key] = nextArg;\n i++;\n } else {\n options[key] = true;\n }\n }\n } else if (arg.startsWith(\"-\") && arg.length > 1) {\n // Short option: -k value or -abc (multiple flags)\n if (arg.length === 2) {\n const key = arg[1];\n const nextArg = argv[i + 1];\n\n if (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n options[key] = nextArg;\n i++;\n } else {\n options[key] = true;\n }\n } else {\n // Multiple short flags: -abc -> -a -b -c\n for (let j = 1; j < arg.length; j++) {\n options[arg[j]] = true;\n }\n }\n } else {\n // Positional argument or command\n // First two non-option args are command and subcommand\n if (command.length < 2) {\n command.push(arg);\n } else {\n positional.push(arg);\n }\n }\n }\n\n return { command, options, positional };\n}\n\nexport function getOption(\n options: Record<string, OptionValue>,\n names: string[],\n defaultValue?: string,\n): string | undefined {\n for (const name of names) {\n if (name in options) {\n const value = options[name];\n return typeof value === \"string\" ? value : undefined;\n }\n }\n return defaultValue;\n}\n\nexport function hasFlag(options: Record<string, OptionValue>, names: string[]): boolean {\n return names.some((name) => options[name] === true);\n}\n","#!/usr/bin/env node\n\nimport { handleBackupsCommand, showBackupsHelp } from \"./commands/backups/index.ts\";\nimport { handleCompletionCommand, showCompletionHelp } from \"./commands/completion.ts\";\nimport { handleCertificatesCommand, showCertificatesHelp } from \"./commands/certificates/index.ts\";\nimport { handleCommandsCommand, showCommandsHelp } from \"./commands/commands/index.ts\";\nimport { handleConfigCommand, showConfigHelp } from \"./commands/config.ts\";\nimport { handleDaemonsCommand, showDaemonsHelp } from \"./commands/daemons/index.ts\";\nimport { handleDatabasesCommand, showDatabasesHelp } from \"./commands/databases/index.ts\";\nimport {\n handleDatabaseUsersCommand,\n showDatabaseUsersHelp,\n} from \"./commands/database-users/index.ts\";\nimport { handleDeploymentsCommand, showDeploymentsHelp } from \"./commands/deployments/index.ts\";\nimport { handleEnvCommand, showEnvHelp } from \"./commands/env/index.ts\";\nimport {\n handleFirewallRulesCommand,\n showFirewallRulesHelp,\n} from \"./commands/firewall-rules/index.ts\";\nimport { handleMonitorsCommand, showMonitorsHelp } from \"./commands/monitors/index.ts\";\nimport { handleNginxCommand, showNginxHelp } from \"./commands/nginx/index.ts\";\nimport {\n handleNginxTemplatesCommand,\n showNginxTemplatesHelp,\n} from \"./commands/nginx-templates/index.ts\";\nimport { handleRecipesCommand, showRecipesHelp } from \"./commands/recipes/index.ts\";\nimport {\n handleRedirectRulesCommand,\n showRedirectRulesHelp,\n} from \"./commands/redirect-rules/index.ts\";\nimport {\n handleScheduledJobsCommand,\n showScheduledJobsHelp,\n} from \"./commands/scheduled-jobs/index.ts\";\nimport {\n handleSecurityRulesCommand,\n showSecurityRulesHelp,\n} from \"./commands/security-rules/index.ts\";\nimport { handleServersCommand, showServersHelp } from \"./commands/servers/index.ts\";\nimport { handleSitesCommand, showSitesHelp } from \"./commands/sites/index.ts\";\nimport { handleSshKeysCommand, showSshKeysHelp } from \"./commands/ssh-keys/index.ts\";\nimport { handleUserCommand, showUserHelp } from \"./commands/user/index.ts\";\nimport { colors, setColorEnabled } from \"./utils/colors.ts\";\nimport { parseArgs } from \"./utils/args.ts\";\n\ndeclare const __VERSION__: string;\nconst VERSION = __VERSION__;\n\nfunction showHelp(): void {\n console.log(`\n${colors.bold(\"forge\")} v${VERSION}\n\n${colors.bold(\"USAGE:\")}\n forge <command> [subcommand] [options]\n\n${colors.bold(\"COMMANDS:\")}\n config Manage CLI configuration\n set <token> Save API token\n get Show current token (masked)\n delete Delete stored token\n\n servers, s Manage servers\n list, ls List all servers\n get <id> Get server details\n reboot <id> Reboot a server\n\n sites Manage sites\n list, ls List sites (requires --server)\n get <id> Get site details (requires --server)\n\n deployments, d Manage deployments\n list, ls List deployments (requires --server --site)\n deploy Trigger a deployment (requires --server --site)\n\n databases, db Manage databases\n list, ls List databases (requires --server)\n get <id> Get database details (requires --server)\n\n database-users Manage database users\n list, ls List database users (requires --server)\n get <id> Get database user details (requires --server)\n create Create a database user (requires --server --name --password)\n delete <id> Delete a database user (requires --server)\n\n daemons Manage daemons\n list, ls List daemons (requires --server)\n get <id> Get daemon details (requires --server)\n restart <id> Restart a daemon (requires --server)\n\n env Manage environment variables\n get Get env variables (requires --server --site)\n update Update env variables (requires --server --site --content)\n\n nginx Manage nginx configuration\n get Get nginx config (requires --server --site)\n update Update nginx config (requires --server --site --content)\n\n certificates, certs Manage SSL certificates (per-domain in v2)\n get Get certificate for a domain (requires --server --site --domain)\n get <id> Get certificate details (requires --server --site)\n activate <id> Activate a certificate (requires --server --site)\n\n firewall-rules, fw Manage firewall rules\n list, ls List firewall rules (requires --server)\n get <id> Get firewall rule details (requires --server)\n\n ssh-keys Manage SSH keys\n list, ls List SSH keys (requires --server)\n get <id> Get SSH key details (requires --server)\n\n backups Manage backup configurations\n list, ls List backup configurations (requires --server)\n get <id> Get backup configuration details (requires --server)\n create Create a backup configuration (requires --server --provider --frequency)\n delete <id> Delete a backup configuration (requires --server)\n\n commands Manage site commands\n list, ls List commands (requires --server --site)\n get <id> Get command details (requires --server --site)\n create Execute a command (requires --server --site --command)\n\n scheduled-jobs Manage scheduled jobs (cron)\n list, ls List scheduled jobs (requires --server)\n get <id> Get scheduled job details (requires --server)\n create Create a scheduled job (requires --server --command)\n delete <id> Delete a scheduled job (requires --server)\n\n user Display authenticated user profile\n get Get the authenticated user profile\n\n monitors Manage server monitors\n list, ls List monitors (requires --server)\n get <id> Get monitor details (requires --server)\n create Create a monitor (requires --server --type --operator --threshold --minutes)\n delete <id> Delete a monitor (requires --server)\n\n nginx-templates Manage Nginx templates\n list, ls List Nginx templates (requires --server)\n get <id> Get Nginx template details (requires --server)\n create Create a Nginx template (requires --server --name --content)\n update <id> Update a Nginx template (requires --server)\n delete <id> Delete a Nginx template (requires --server)\n\n security-rules Manage site security rules\n list, ls List security rules (requires --server --site)\n get <id> Get security rule details (requires --server --site)\n create Create a security rule (requires --server --site --name)\n delete <id> Delete a security rule (requires --server --site)\n\n redirect-rules Manage site redirect rules\n list, ls List redirect rules (requires --server --site)\n get <id> Get redirect rule details (requires --server --site)\n create Create a redirect rule (requires --server --site --from --to)\n delete <id> Delete a redirect rule (requires --server --site)\n\n recipes Manage recipes\n list, ls List all recipes\n get <id> Get recipe details\n run <id> Run a recipe (requires --servers)\n\n completion Generate shell completion script\n bash Install Bash completion\n zsh Install Zsh completion\n fish Install Fish completion\n\n${colors.bold(\"OPTIONS:\")}\n --token <token> Forge API token (overrides config and env)\n --org <slug> Organization slug (overrides config and FORGE_ORG)\n --server <id> Server ID (required for server-scoped commands)\n --site <id> Site ID (required for site-scoped commands)\n --domain <id> Domain record ID (for certificate commands)\n -f, --format <fmt> Output format: json, human, table (default: human)\n --no-color Disable colored output\n -h, --help Show help\n -v, --version Show version\n\n${colors.bold(\"EXAMPLES:\")}\n # Configure API token\n forge config set YOUR_TOKEN\n\n # Or pass token directly\n forge servers list --token YOUR_TOKEN\n\n # List all servers\n forge servers list\n\n # List sites on a server\n forge sites list --server 123\n\n # Deploy a site\n forge deployments deploy --server 123 --site 456\n\n # Get JSON output (for AI agents)\n forge servers list --format json\n\n${colors.bold(\"CREDENTIAL PRIORITY:\")}\n 1. CLI argument (--token)\n 2. Environment variable (FORGE_API_TOKEN)\n 3. Config file (~/.config/forge-tools/config.json)\n\n${colors.bold(\"ENVIRONMENT VARIABLES:\")}\n FORGE_API_TOKEN API token\n FORGE_ORG Organization slug (e.g. studio-meta)\n NO_COLOR Disable colors\n XDG_CONFIG_HOME Config directory (respects XDG spec)\n`);\n}\n\nasync function main(): Promise<void> {\n const { command, options, positional } = parseArgs();\n\n const [mainCommand, subcommand] = command;\n const wantsHelp = options.help !== undefined || options.h !== undefined;\n\n if (wantsHelp && !mainCommand) {\n showHelp();\n process.exit(0);\n }\n\n if (options.version || options.v) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (options[\"no-color\"]) {\n setColorEnabled(false);\n }\n\n if (!mainCommand) {\n showHelp();\n process.exit(0);\n }\n\n try {\n switch (mainCommand) {\n case \"config\":\n if (wantsHelp) {\n showConfigHelp();\n process.exit(0);\n }\n handleConfigCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"servers\":\n case \"s\":\n if (wantsHelp) {\n showServersHelp(subcommand);\n process.exit(0);\n }\n await handleServersCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"sites\":\n if (wantsHelp) {\n showSitesHelp(subcommand);\n process.exit(0);\n }\n await handleSitesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"deployments\":\n case \"d\":\n if (wantsHelp) {\n showDeploymentsHelp(subcommand);\n process.exit(0);\n }\n await handleDeploymentsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"databases\":\n case \"db\":\n if (wantsHelp) {\n showDatabasesHelp(subcommand);\n process.exit(0);\n }\n await handleDatabasesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"database-users\":\n if (wantsHelp) {\n showDatabaseUsersHelp(subcommand);\n process.exit(0);\n }\n await handleDatabaseUsersCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"daemons\":\n if (wantsHelp) {\n showDaemonsHelp(subcommand);\n process.exit(0);\n }\n await handleDaemonsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"env\":\n if (wantsHelp) {\n showEnvHelp(subcommand);\n process.exit(0);\n }\n await handleEnvCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"nginx\":\n if (wantsHelp) {\n showNginxHelp(subcommand);\n process.exit(0);\n }\n await handleNginxCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"certificates\":\n case \"certs\":\n if (wantsHelp) {\n showCertificatesHelp(subcommand);\n process.exit(0);\n }\n await handleCertificatesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"firewall-rules\":\n case \"fw\":\n if (wantsHelp) {\n showFirewallRulesHelp(subcommand);\n process.exit(0);\n }\n await handleFirewallRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"ssh-keys\":\n if (wantsHelp) {\n showSshKeysHelp(subcommand);\n process.exit(0);\n }\n await handleSshKeysCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"backups\":\n if (wantsHelp) {\n showBackupsHelp(subcommand);\n process.exit(0);\n }\n await handleBackupsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"commands\":\n if (wantsHelp) {\n showCommandsHelp(subcommand);\n process.exit(0);\n }\n await handleCommandsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"scheduled-jobs\":\n if (wantsHelp) {\n showScheduledJobsHelp(subcommand);\n process.exit(0);\n }\n await handleScheduledJobsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"user\":\n if (wantsHelp) {\n showUserHelp(subcommand);\n process.exit(0);\n }\n await handleUserCommand(subcommand ?? \"get\", positional, options);\n break;\n\n case \"monitors\":\n if (wantsHelp) {\n showMonitorsHelp(subcommand);\n process.exit(0);\n }\n await handleMonitorsCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"nginx-templates\":\n if (wantsHelp) {\n showNginxTemplatesHelp(subcommand);\n process.exit(0);\n }\n await handleNginxTemplatesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"security-rules\":\n if (wantsHelp) {\n showSecurityRulesHelp(subcommand);\n process.exit(0);\n }\n await handleSecurityRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"redirect-rules\":\n if (wantsHelp) {\n showRedirectRulesHelp(subcommand);\n process.exit(0);\n }\n await handleRedirectRulesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"recipes\":\n if (wantsHelp) {\n showRecipesHelp(subcommand);\n process.exit(0);\n }\n await handleRecipesCommand(subcommand ?? \"list\", positional, options);\n break;\n\n case \"completion\":\n if (wantsHelp || !subcommand) {\n showCompletionHelp();\n process.exit(0);\n }\n handleCompletionCommand(subcommand, options);\n break;\n\n default:\n console.error(colors.red(`Unknown command: ${mainCommand}`));\n console.log(`Run ${colors.cyan(\"forge --help\")} for usage information`);\n process.exit(1);\n }\n } catch (error) {\n console.error(colors.red(\"Fatal error:\"), error);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(colors.red(\"Unhandled error:\"), error);\n process.exit(1);\n});\n"],"mappings":"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"}