diff --git a/CLAUDE.md b/CLAUDE.md index d4f89ce..0ba66bd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -50,7 +50,7 @@ forge-cli → forge-core # CLI tool (human + AI agent use) - **forge-sdk** (`packages/sdk`): `Forge` class with fluent chainable API (`forge.servers(123).sites(456).deploy()`). Thin wrapper over forge-api — delegates all HTTP. JSDoc on every public method. The hero package with standalone README. - **forge-core** (`packages/core`): Pure executor functions `(options, context) → ExecutorResult`, `ExecutorContext` with DI, centralized constants (`RESOURCES`, `ACTIONS`). Includes `matchByName` helper for auto-resolving resource names to numeric IDs. Same pattern as productive-core. - **forge-mcp** (`packages/mcp`): Two MCP tools — `forge` (read-only: `list`, `get`, `resolve`, `context`, `help`, `schema`) and `forge_write` (destructive: `create`, `update`, `delete`, `deploy`, `reboot`, `restart`, `activate`, `run`) with `resource` + `action` routing, `createResourceHandler()` factory, stdio and HTTP transports. Supports `batch` resource for multi-action calls. Auto-resolve middleware translates name strings to numeric IDs before dispatching. -- **forge-cli** (`packages/cli`): CLI tool for managing Forge servers, sites, and more. Human-friendly output by default, `--format json` for scripting and AI agent use. +- **forge-cli** (`packages/cli`): CLI tool for managing Forge servers, sites, and more. Binary is `forge`. Human-friendly output by default, `--format json` for scripting and AI agent use. ### Key Design Principles diff --git a/README.md b/README.md index e277b9a..b4fcf94 100644 --- a/README.md +++ b/README.md @@ -27,19 +27,19 @@ npm install -g @studiometa/forge-cli ```bash # Save your API token -forge-cli config set YOUR_FORGE_TOKEN +forge config set YOUR_FORGE_TOKEN # List all servers -forge-cli servers list +forge servers list # List sites on a server -forge-cli sites list --server 123 +forge sites list --server 123 # Deploy a site -forge-cli deployments deploy --server 123 --site 456 +forge deployments deploy --server 123 --site 456 # Get JSON output (for scripting and AI agents) -forge-cli servers list --format json +forge servers list --format json ``` ### SDK diff --git a/packages/cli/README.md b/packages/cli/README.md index 2ee51a1..8757c3c 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -23,9 +23,9 @@ Credentials can be provided in three ways (highest priority first): 3. **Config file** (XDG-compliant): ```bash -forge-cli config set YOUR_FORGE_TOKEN -forge-cli config get -forge-cli config delete +forge config set YOUR_FORGE_TOKEN +forge config get +forge config delete ``` | Platform | Config path | @@ -37,7 +37,7 @@ forge-cli config delete ## Commands ``` -forge-cli [subcommand] [options] +forge [subcommand] [options] ``` | Command | Alias | Description | @@ -65,25 +65,25 @@ forge-cli [subcommand] [options] | `user` | | Get the authenticated user's profile | | `completion` | | Install shell completion (bash, zsh, fish) | -Run `forge-cli --help` for detailed usage of each command. +Run `forge --help` for detailed usage of each command. ## Quick Start ```bash # Save your API token -forge-cli config set YOUR_FORGE_TOKEN +forge config set YOUR_FORGE_TOKEN # List all servers -forge-cli servers list +forge servers list # List sites on a server -forge-cli sites list --server 123 +forge sites list --server 123 # Deploy a site -forge-cli deployments deploy --server 123 --site 456 +forge deployments deploy --server 123 --site 456 # Get environment variables -forge-cli env get --server 123 --site 456 +forge env get --server 123 --site 456 ``` ## Output Formats @@ -97,8 +97,8 @@ All list/get commands support `--format`: | Table | `--format table` | ASCII table | ```bash -forge-cli servers list --format json -forge-cli sites list --server 123 --format table +forge servers list --format json +forge sites list --server 123 --format table ``` ## Command Reference @@ -106,31 +106,31 @@ forge-cli sites list --server 123 --format table ### `config` — Manage configuration ```bash -forge-cli config set # Save API token to config file -forge-cli config get # Show current token (masked) -forge-cli config delete # Delete stored token +forge config set # Save API token to config file +forge config get # Show current token (masked) +forge config delete # Delete stored token ``` ### `servers` (`s`) — Manage servers ```bash -forge-cli servers list # List all servers -forge-cli servers get # Get server details -forge-cli servers reboot # Reboot a server +forge servers list # List all servers +forge servers get # Get server details +forge servers reboot # Reboot a server ``` ### `sites` — Manage sites ```bash -forge-cli sites list --server # List sites on a server -forge-cli sites get --server # Get site details +forge sites list --server # List sites on a server +forge sites get --server # Get site details ``` ### `deployments` (`d`) — Manage deployments ```bash -forge-cli deployments list --server --site # List deployments -forge-cli deployments deploy --server --site # Trigger a deployment +forge deployments list --server --site # List deployments +forge deployments deploy --server --site # Trigger a deployment ``` The `deploy` command waits for deployment to complete, showing live progress. On completion it prints the deployment log and elapsed time. @@ -138,69 +138,69 @@ The `deploy` command waits for deployment to complete, showing live progress. On ### `databases` (`db`) — Manage databases ```bash -forge-cli databases list --server # List databases -forge-cli databases get --server # Get database details +forge databases list --server # List databases +forge databases get --server # Get database details ``` ### `daemons` — Manage background processes ```bash -forge-cli daemons list --server # List daemons -forge-cli daemons get --server # Get daemon details -forge-cli daemons restart --server # Restart a daemon +forge daemons list --server # List daemons +forge daemons get --server # Get daemon details +forge daemons restart --server # Restart a daemon ``` ### `env` — Manage environment variables ```bash -forge-cli env get --server --site # Get .env content -forge-cli env update --server --site --content "KEY=value" # Update .env +forge env get --server --site # Get .env content +forge env update --server --site --content "KEY=value" # Update .env ``` ### `nginx` — Manage Nginx configuration ```bash -forge-cli nginx get --server --site # Get Nginx config -forge-cli nginx update --server --site --content "server { ... }" # Update Nginx config +forge nginx get --server --site # Get Nginx config +forge nginx update --server --site --content "server { ... }" # Update Nginx config ``` ### `certificates` (`certs`) — Manage SSL certificates ```bash -forge-cli certificates list --server --site # List certificates -forge-cli certificates get --server --site # Get certificate details -forge-cli certificates activate --server --site # Activate a certificate +forge certificates list --server --site # List certificates +forge certificates get --server --site # Get certificate details +forge certificates activate --server --site # Activate a certificate ``` ### `firewall-rules` (`fw`) — Manage firewall rules ```bash -forge-cli firewall-rules list --server # List firewall rules -forge-cli firewall-rules get --server # Get rule details +forge firewall-rules list --server # List firewall rules +forge firewall-rules get --server # Get rule details ``` ### `ssh-keys` — Manage SSH keys ```bash -forge-cli ssh-keys list --server # List SSH keys -forge-cli ssh-keys get --server # Get SSH key details +forge ssh-keys list --server # List SSH keys +forge ssh-keys get --server # Get SSH key details ``` ### `recipes` — Manage recipes ```bash -forge-cli recipes list # List all recipes -forge-cli recipes get # Get recipe details -forge-cli recipes run --servers 123,456 # Run recipe on servers +forge recipes list # List all recipes +forge recipes get # Get recipe details +forge recipes run --servers 123,456 # Run recipe on servers ``` ### `completion` — Shell completion ```bash -forge-cli completion bash # Install Bash completion -forge-cli completion zsh # Install Zsh completion -forge-cli completion fish # Install Fish completion -forge-cli completion bash --print # Print script without installing +forge completion bash # Install Bash completion +forge completion zsh # Install Zsh completion +forge completion fish # Install Fish completion +forge completion bash --print # Print script without installing ``` ## Audit Logging @@ -229,10 +229,10 @@ The CLI is designed for programmatic use by AI agents: ```bash # Get all servers as JSON -forge-cli servers list --format json +forge servers list --format json # Deploy and capture output -forge-cli deployments deploy --server 123 --site 456 --format json +forge deployments deploy --server 123 --site 456 --format json ``` ## Requirements diff --git a/packages/cli/package.json b/packages/cli/package.json index ee2ba5c..ef52d50 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -19,7 +19,7 @@ "directory": "packages/cli" }, "bin": { - "forge-cli": "./dist/cli.js" + "forge": "./dist/cli.js" }, "files": [ "dist" diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 9160389..ebe9c15 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -48,10 +48,10 @@ const VERSION = __VERSION__; function showHelp(): void { console.log(` -${colors.bold("forge-cli")} v${VERSION} +${colors.bold("forge")} v${VERSION} ${colors.bold("USAGE:")} - forge-cli [subcommand] [options] + forge [subcommand] [options] ${colors.bold("COMMANDS:")} config Manage CLI configuration @@ -174,22 +174,22 @@ ${colors.bold("OPTIONS:")} ${colors.bold("EXAMPLES:")} # Configure API token - forge-cli config set YOUR_TOKEN + forge config set YOUR_TOKEN # Or pass token directly - forge-cli servers list --token YOUR_TOKEN + forge servers list --token YOUR_TOKEN # List all servers - forge-cli servers list + forge servers list # List sites on a server - forge-cli sites list --server 123 + forge sites list --server 123 # Deploy a site - forge-cli deployments deploy --server 123 --site 456 + forge deployments deploy --server 123 --site 456 # Get JSON output (for AI agents) - forge-cli servers list --format json + forge servers list --format json ${colors.bold("CREDENTIAL PRIORITY:")} 1. CLI argument (--token) @@ -497,7 +497,7 @@ async function main(): Promise { default: console.error(colors.red(`Unknown command: ${mainCommand}`)); - console.log(`Run ${colors.cyan("forge-cli --help")} for usage information`); + console.log(`Run ${colors.cyan("forge --help")} for usage information`); process.exit(1); } } catch (error) { diff --git a/packages/cli/src/commands/backups/handlers.ts b/packages/cli/src/commands/backups/handlers.ts index 4a3e257..b2c3dbd 100644 --- a/packages/cli/src/commands/backups/handlers.ts +++ b/packages/cli/src/commands/backups/handlers.ts @@ -14,11 +14,7 @@ export async function backupsList(ctx: CommandContext): Promise { const server = String(ctx.options.server ?? ""); if (!server) { - exitWithValidationError( - "server_id", - "forge-cli backups list --server ", - ctx.formatter, - ); + exitWithValidationError("server_id", "forge backups list --server ", ctx.formatter); } await runCommand(async () => { @@ -43,7 +39,7 @@ export async function backupsGet(args: string[], ctx: CommandContext): Promise --server ", + "forge backups get --server ", ctx.formatter, ); } @@ -51,7 +47,7 @@ export async function backupsGet(args: string[], ctx: CommandContext): Promise --server ", + "forge backups get --server ", ctx.formatter, ); } @@ -87,7 +83,7 @@ export async function backupsCreate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli backups create --server --provider --frequency ", + "forge backups create --server --provider --frequency ", ctx.formatter, ); } @@ -95,7 +91,7 @@ export async function backupsCreate(ctx: CommandContext): Promise { if (!provider) { exitWithValidationError( "provider", - "forge-cli backups create --server --provider --frequency ", + "forge backups create --server --provider --frequency ", ctx.formatter, ); } @@ -103,7 +99,7 @@ export async function backupsCreate(ctx: CommandContext): Promise { if (!frequency) { exitWithValidationError( "frequency", - "forge-cli backups create --server --provider --frequency ", + "forge backups create --server --provider --frequency ", ctx.formatter, ); } @@ -134,7 +130,7 @@ export async function backupsDelete(args: string[], ctx: CommandContext): Promis if (!id) { exitWithValidationError( "backup_id", - "forge-cli backups delete --server ", + "forge backups delete --server ", ctx.formatter, ); } @@ -142,7 +138,7 @@ export async function backupsDelete(args: string[], ctx: CommandContext): Promis if (!server) { exitWithValidationError( "server_id", - "forge-cli backups delete --server ", + "forge backups delete --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/backups/help.ts b/packages/cli/src/commands/backups/help.ts index 4e642e7..194b6e8 100644 --- a/packages/cli/src/commands/backups/help.ts +++ b/packages/cli/src/commands/backups/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showBackupsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli backups list")} - List backup configurations on a server +${colors.bold("forge backups list")} - List backup configurations on a server ${colors.bold("USAGE:")} - forge-cli backups list --server [options] + forge backups list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,17 +14,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli backups get")} - Get backup configuration details +${colors.bold("forge backups get")} - Get backup configuration details ${colors.bold("USAGE:")} - forge-cli backups get --server [options] + forge backups get --server [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli backups create")} - Create a new backup configuration +${colors.bold("forge backups create")} - Create a new backup configuration ${colors.bold("USAGE:")} - forge-cli backups create --server --provider --frequency [options] + forge backups create --server --provider --frequency [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -35,17 +35,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli backups delete")} - Delete a backup configuration +${colors.bold("forge backups delete")} - Delete a backup configuration ${colors.bold("USAGE:")} - forge-cli backups delete --server [options] + forge backups delete --server [options] `); } else { console.log(` -${colors.bold("forge-cli backups")} - Manage backup configurations +${colors.bold("forge backups")} - Manage backup configurations ${colors.bold("USAGE:")} - forge-cli backups [options] + forge backups [options] ${colors.bold("SUBCOMMANDS:")} list, ls List backup configurations @@ -57,7 +57,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli backups --help")} for details. +Run ${colors.cyan("forge backups --help")} for details. `); } } diff --git a/packages/cli/src/commands/certificates/handlers.ts b/packages/cli/src/commands/certificates/handlers.ts index 033ee60..bcc5be9 100644 --- a/packages/cli/src/commands/certificates/handlers.ts +++ b/packages/cli/src/commands/certificates/handlers.ts @@ -23,7 +23,7 @@ function requireServerAndSiteRaw( } export async function certificatesList(ctx: CommandContext): Promise { - const usage = "forge-cli certificates list --server --site "; + const usage = "forge certificates list --server --site "; const { server, site } = requireServerAndSiteRaw(ctx, usage); await runCommand(async () => { @@ -44,7 +44,7 @@ export async function certificatesList(ctx: CommandContext): Promise { export async function certificatesGet(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli certificates get --server --site "; + const usage = "forge certificates get --server --site "; if (!id) { exitWithValidationError("certificate_id", usage, ctx.formatter); @@ -73,7 +73,7 @@ export async function certificatesGet(args: string[], ctx: CommandContext): Prom export async function certificatesActivate(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli certificates activate --server --site "; + const usage = "forge certificates activate --server --site "; if (!id) { exitWithValidationError("certificate_id", usage, ctx.formatter); diff --git a/packages/cli/src/commands/certificates/help.ts b/packages/cli/src/commands/certificates/help.ts index e9b1ccd..47b2518 100644 --- a/packages/cli/src/commands/certificates/help.ts +++ b/packages/cli/src/commands/certificates/help.ts @@ -3,34 +3,34 @@ import { colors } from "../../utils/colors.ts"; export function showCertificatesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli certificates list")} - List certificates for a site +${colors.bold("forge certificates list")} - List certificates for a site ${colors.bold("USAGE:")} - forge-cli certificates list --server --site [options] + forge certificates list --server --site [options] `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli certificates get")} - Get certificate details +${colors.bold("forge certificates get")} - Get certificate details ${colors.bold("USAGE:")} - forge-cli certificates get --server --site + forge certificates get --server --site `); } else if (subcommand === "activate") { console.log(` -${colors.bold("forge-cli certificates activate")} - Activate a certificate +${colors.bold("forge certificates activate")} - Activate a certificate ${colors.bold("USAGE:")} - forge-cli certificates activate --server --site + forge certificates activate --server --site `); } else { console.log(` -${colors.bold("forge-cli certificates")} - Manage SSL certificates +${colors.bold("forge certificates")} - Manage SSL certificates ${colors.bold("USAGE:")} - forge-cli certificates [options] + forge certificates [options] ${colors.bold("ALIASES:")} - forge-cli certs + forge certs ${colors.bold("SUBCOMMANDS:")} list, ls List certificates @@ -42,7 +42,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli certificates --help")} for details. +Run ${colors.cyan("forge certificates --help")} for details. `); } } diff --git a/packages/cli/src/commands/commands/handlers.ts b/packages/cli/src/commands/commands/handlers.ts index 41f390f..b0937b2 100644 --- a/packages/cli/src/commands/commands/handlers.ts +++ b/packages/cli/src/commands/commands/handlers.ts @@ -23,7 +23,7 @@ function requireServerAndSiteRaw( } export async function commandsList(ctx: CommandContext): Promise { - const usage = "forge-cli commands list --server --site "; + const usage = "forge commands list --server --site "; const { server, site } = requireServerAndSiteRaw(ctx, usage); await runCommand(async () => { @@ -44,7 +44,7 @@ export async function commandsList(ctx: CommandContext): Promise { export async function commandsGet(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli commands get --server --site "; + const usage = "forge commands get --server --site "; if (!id) { exitWithValidationError("command_id", usage, ctx.formatter); @@ -63,8 +63,7 @@ export async function commandsGet(args: string[], ctx: CommandContext): Promise< } export async function commandsCreate(ctx: CommandContext): Promise { - const usage = - "forge-cli commands create --server --site --command "; + const usage = "forge commands create --server --site --command "; const { server, site } = requireServerAndSiteRaw(ctx, usage); const command = String(ctx.options.command ?? ""); diff --git a/packages/cli/src/commands/commands/help.ts b/packages/cli/src/commands/commands/help.ts index 744047c..79015c2 100644 --- a/packages/cli/src/commands/commands/help.ts +++ b/packages/cli/src/commands/commands/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showCommandsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli commands list")} - List commands executed on a site +${colors.bold("forge commands list")} - List commands executed on a site ${colors.bold("USAGE:")} - forge-cli commands list --server --site [options] + forge commands list --server --site [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -15,17 +15,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli commands get")} - Get command details +${colors.bold("forge commands get")} - Get command details ${colors.bold("USAGE:")} - forge-cli commands get --server --site [options] + forge commands get --server --site [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli commands create")} - Execute a command on a site +${colors.bold("forge commands create")} - Execute a command on a site ${colors.bold("USAGE:")} - forge-cli commands create --server --site --command [options] + forge commands create --server --site --command [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -35,10 +35,10 @@ ${colors.bold("OPTIONS:")} `); } else { console.log(` -${colors.bold("forge-cli commands")} - Manage site commands +${colors.bold("forge commands")} - Manage site commands ${colors.bold("USAGE:")} - forge-cli commands [options] + forge commands [options] ${colors.bold("SUBCOMMANDS:")} list, ls List commands @@ -50,7 +50,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli commands --help")} for details. +Run ${colors.cyan("forge commands --help")} for details. `); } } diff --git a/packages/cli/src/commands/completion.test.ts b/packages/cli/src/commands/completion.test.ts index b37b235..e470cb8 100644 --- a/packages/cli/src/commands/completion.test.ts +++ b/packages/cli/src/commands/completion.test.ts @@ -15,7 +15,7 @@ describe("showCompletionHelp", () => { it("should print help text", () => { const spy = vi.spyOn(console, "log").mockImplementation(() => {}); showCompletionHelp(); - expect(spy).toHaveBeenCalledWith(expect.stringContaining("forge-cli completion")); + expect(spy).toHaveBeenCalledWith(expect.stringContaining("forge completion")); spy.mockRestore(); }); @@ -50,21 +50,19 @@ describe("handleCompletionCommand", () => { describe("--print flag", () => { it("should print bash script to stdout without installing", () => { handleCompletionCommand("bash", { print: true }); - expect(stdoutWriteSpy).toHaveBeenCalledWith(expect.stringContaining("forge-cli")); - expect(stdoutWriteSpy).toHaveBeenCalledWith( - expect.stringContaining("_forge_cli_completions"), - ); + expect(stdoutWriteSpy).toHaveBeenCalledWith(expect.stringContaining("forge")); + expect(stdoutWriteSpy).toHaveBeenCalledWith(expect.stringContaining("_forge_completions")); }); it("should print zsh script to stdout without installing", () => { handleCompletionCommand("zsh", { print: true }); - expect(stdoutWriteSpy).toHaveBeenCalledWith(expect.stringContaining("#compdef forge-cli")); + expect(stdoutWriteSpy).toHaveBeenCalledWith(expect.stringContaining("#compdef forge")); }); it("should print fish script to stdout without installing", () => { handleCompletionCommand("fish", { print: true }); expect(stdoutWriteSpy).toHaveBeenCalledWith( - expect.stringContaining("# Completions for forge-cli"), + expect.stringContaining("# Completions for forge"), ); }); @@ -84,7 +82,7 @@ describe("handleCompletionCommand", () => { { recursive: true }, ); expect(writeFileSync).toHaveBeenCalledWith( - expect.stringContaining("forge-cli"), + expect.stringContaining("forge"), expect.any(String), "utf8", ); @@ -97,7 +95,7 @@ describe("handleCompletionCommand", () => { recursive: true, }); expect(writeFileSync).toHaveBeenCalledWith( - expect.stringContaining("_forge-cli"), + expect.stringContaining("_forge"), expect.any(String), "utf8", ); @@ -110,7 +108,7 @@ describe("handleCompletionCommand", () => { recursive: true, }); expect(writeFileSync).toHaveBeenCalledWith( - expect.stringContaining("forge-cli.fish"), + expect.stringContaining("forge.fish"), expect.any(String), "utf8", ); diff --git a/packages/cli/src/commands/completion.ts b/packages/cli/src/commands/completion.ts index 24e3567..d0f13cb 100644 --- a/packages/cli/src/commands/completion.ts +++ b/packages/cli/src/commands/completion.ts @@ -10,7 +10,7 @@ import { colors } from "../utils/colors.ts"; const BASH_COMPLETION = `#!/usr/bin/env bash -_forge_cli_completions() { +_forge_completions() { local cur prev commands subcommands options COMPREPLY=() @@ -150,12 +150,12 @@ _forge_cli_completions() { return 0 } -complete -F _forge_cli_completions forge-cli +complete -F _forge_completions forge `; -const ZSH_COMPLETION = `#compdef forge-cli +const ZSH_COMPLETION = `#compdef forge -_forge_cli() { +_forge() { local line state _arguments -C \\ @@ -453,199 +453,199 @@ _forge_cli() { esac } -_forge_cli "$@" +_forge "$@" `; -const FISH_COMPLETION = `# Completions for forge-cli +const FISH_COMPLETION = `# Completions for forge # Main commands -complete -c forge-cli -f -n "__fish_use_subcommand" -a "config" -d "Manage CLI configuration" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "servers" -d "Manage servers" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "s" -d "Manage servers (alias)" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "sites" -d "Manage sites" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "deployments" -d "Manage deployments" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "d" -d "Manage deployments (alias)" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "databases" -d "Manage databases" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "db" -d "Manage databases (alias)" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "database-users" -d "Manage database users" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "daemons" -d "Manage daemons" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "env" -d "Manage environment variables" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "nginx" -d "Manage nginx configuration" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "certificates" -d "Manage SSL certificates" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "certs" -d "Manage SSL certificates (alias)" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "firewall-rules" -d "Manage firewall rules" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "fw" -d "Manage firewall rules (alias)" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "ssh-keys" -d "Manage SSH keys" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "backups" -d "Manage backup configurations" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "commands" -d "Manage site commands" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "scheduled-jobs" -d "Manage scheduled jobs" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "user" -d "Display authenticated user profile" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "monitors" -d "Manage server monitors" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "nginx-templates" -d "Manage Nginx templates" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "security-rules" -d "Manage site security rules" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "redirect-rules" -d "Manage site redirect rules" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "recipes" -d "Manage recipes" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "completion" -d "Generate shell completion script" -complete -c forge-cli -f -n "__fish_use_subcommand" -a "help" -d "Show help" +complete -c forge -f -n "__fish_use_subcommand" -a "config" -d "Manage CLI configuration" +complete -c forge -f -n "__fish_use_subcommand" -a "servers" -d "Manage servers" +complete -c forge -f -n "__fish_use_subcommand" -a "s" -d "Manage servers (alias)" +complete -c forge -f -n "__fish_use_subcommand" -a "sites" -d "Manage sites" +complete -c forge -f -n "__fish_use_subcommand" -a "deployments" -d "Manage deployments" +complete -c forge -f -n "__fish_use_subcommand" -a "d" -d "Manage deployments (alias)" +complete -c forge -f -n "__fish_use_subcommand" -a "databases" -d "Manage databases" +complete -c forge -f -n "__fish_use_subcommand" -a "db" -d "Manage databases (alias)" +complete -c forge -f -n "__fish_use_subcommand" -a "database-users" -d "Manage database users" +complete -c forge -f -n "__fish_use_subcommand" -a "daemons" -d "Manage daemons" +complete -c forge -f -n "__fish_use_subcommand" -a "env" -d "Manage environment variables" +complete -c forge -f -n "__fish_use_subcommand" -a "nginx" -d "Manage nginx configuration" +complete -c forge -f -n "__fish_use_subcommand" -a "certificates" -d "Manage SSL certificates" +complete -c forge -f -n "__fish_use_subcommand" -a "certs" -d "Manage SSL certificates (alias)" +complete -c forge -f -n "__fish_use_subcommand" -a "firewall-rules" -d "Manage firewall rules" +complete -c forge -f -n "__fish_use_subcommand" -a "fw" -d "Manage firewall rules (alias)" +complete -c forge -f -n "__fish_use_subcommand" -a "ssh-keys" -d "Manage SSH keys" +complete -c forge -f -n "__fish_use_subcommand" -a "backups" -d "Manage backup configurations" +complete -c forge -f -n "__fish_use_subcommand" -a "commands" -d "Manage site commands" +complete -c forge -f -n "__fish_use_subcommand" -a "scheduled-jobs" -d "Manage scheduled jobs" +complete -c forge -f -n "__fish_use_subcommand" -a "user" -d "Display authenticated user profile" +complete -c forge -f -n "__fish_use_subcommand" -a "monitors" -d "Manage server monitors" +complete -c forge -f -n "__fish_use_subcommand" -a "nginx-templates" -d "Manage Nginx templates" +complete -c forge -f -n "__fish_use_subcommand" -a "security-rules" -d "Manage site security rules" +complete -c forge -f -n "__fish_use_subcommand" -a "redirect-rules" -d "Manage site redirect rules" +complete -c forge -f -n "__fish_use_subcommand" -a "recipes" -d "Manage recipes" +complete -c forge -f -n "__fish_use_subcommand" -a "completion" -d "Generate shell completion script" +complete -c forge -f -n "__fish_use_subcommand" -a "help" -d "Show help" # config subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from config" -a "set" -d "Save API token" -complete -c forge-cli -f -n "__fish_seen_subcommand_from config" -a "get" -d "Show current token" -complete -c forge-cli -f -n "__fish_seen_subcommand_from config" -a "delete" -d "Delete stored token" +complete -c forge -f -n "__fish_seen_subcommand_from config" -a "set" -d "Save API token" +complete -c forge -f -n "__fish_seen_subcommand_from config" -a "get" -d "Show current token" +complete -c forge -f -n "__fish_seen_subcommand_from config" -a "delete" -d "Delete stored token" # servers subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from servers s" -a "list" -d "List all servers" -complete -c forge-cli -f -n "__fish_seen_subcommand_from servers s" -a "ls" -d "List all servers (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from servers s" -a "get" -d "Get server details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from servers s" -a "reboot" -d "Reboot a server" +complete -c forge -f -n "__fish_seen_subcommand_from servers s" -a "list" -d "List all servers" +complete -c forge -f -n "__fish_seen_subcommand_from servers s" -a "ls" -d "List all servers (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from servers s" -a "get" -d "Get server details" +complete -c forge -f -n "__fish_seen_subcommand_from servers s" -a "reboot" -d "Reboot a server" # sites subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from sites" -a "list" -d "List sites" -complete -c forge-cli -f -n "__fish_seen_subcommand_from sites" -a "ls" -d "List sites (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from sites" -a "get" -d "Get site details" +complete -c forge -f -n "__fish_seen_subcommand_from sites" -a "list" -d "List sites" +complete -c forge -f -n "__fish_seen_subcommand_from sites" -a "ls" -d "List sites (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from sites" -a "get" -d "Get site details" # deployments subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from deployments d" -a "list" -d "List deployments" -complete -c forge-cli -f -n "__fish_seen_subcommand_from deployments d" -a "ls" -d "List deployments (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from deployments d" -a "deploy" -d "Trigger a deployment" +complete -c forge -f -n "__fish_seen_subcommand_from deployments d" -a "list" -d "List deployments" +complete -c forge -f -n "__fish_seen_subcommand_from deployments d" -a "ls" -d "List deployments (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from deployments d" -a "deploy" -d "Trigger a deployment" # databases subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from databases db" -a "list" -d "List databases" -complete -c forge-cli -f -n "__fish_seen_subcommand_from databases db" -a "ls" -d "List databases (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from databases db" -a "get" -d "Get database details" +complete -c forge -f -n "__fish_seen_subcommand_from databases db" -a "list" -d "List databases" +complete -c forge -f -n "__fish_seen_subcommand_from databases db" -a "ls" -d "List databases (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from databases db" -a "get" -d "Get database details" # database-users subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from database-users" -a "list" -d "List database users" -complete -c forge-cli -f -n "__fish_seen_subcommand_from database-users" -a "ls" -d "List database users (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from database-users" -a "get" -d "Get database user details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from database-users" -a "create" -d "Create a database user" -complete -c forge-cli -f -n "__fish_seen_subcommand_from database-users" -a "delete" -d "Delete a database user" +complete -c forge -f -n "__fish_seen_subcommand_from database-users" -a "list" -d "List database users" +complete -c forge -f -n "__fish_seen_subcommand_from database-users" -a "ls" -d "List database users (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from database-users" -a "get" -d "Get database user details" +complete -c forge -f -n "__fish_seen_subcommand_from database-users" -a "create" -d "Create a database user" +complete -c forge -f -n "__fish_seen_subcommand_from database-users" -a "delete" -d "Delete a database user" # daemons subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from daemons" -a "list" -d "List daemons" -complete -c forge-cli -f -n "__fish_seen_subcommand_from daemons" -a "ls" -d "List daemons (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from daemons" -a "get" -d "Get daemon details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from daemons" -a "restart" -d "Restart a daemon" +complete -c forge -f -n "__fish_seen_subcommand_from daemons" -a "list" -d "List daemons" +complete -c forge -f -n "__fish_seen_subcommand_from daemons" -a "ls" -d "List daemons (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from daemons" -a "get" -d "Get daemon details" +complete -c forge -f -n "__fish_seen_subcommand_from daemons" -a "restart" -d "Restart a daemon" # env subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from env" -a "get" -d "Get env variables" -complete -c forge-cli -f -n "__fish_seen_subcommand_from env" -a "update" -d "Update env variables" +complete -c forge -f -n "__fish_seen_subcommand_from env" -a "get" -d "Get env variables" +complete -c forge -f -n "__fish_seen_subcommand_from env" -a "update" -d "Update env variables" # nginx subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx" -a "get" -d "Get nginx config" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx" -a "update" -d "Update nginx config" +complete -c forge -f -n "__fish_seen_subcommand_from nginx" -a "get" -d "Get nginx config" +complete -c forge -f -n "__fish_seen_subcommand_from nginx" -a "update" -d "Update nginx config" # certificates subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from certificates certs" -a "list" -d "List certificates" -complete -c forge-cli -f -n "__fish_seen_subcommand_from certificates certs" -a "ls" -d "List certificates (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from certificates certs" -a "get" -d "Get certificate details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from certificates certs" -a "activate" -d "Activate a certificate" +complete -c forge -f -n "__fish_seen_subcommand_from certificates certs" -a "list" -d "List certificates" +complete -c forge -f -n "__fish_seen_subcommand_from certificates certs" -a "ls" -d "List certificates (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from certificates certs" -a "get" -d "Get certificate details" +complete -c forge -f -n "__fish_seen_subcommand_from certificates certs" -a "activate" -d "Activate a certificate" # firewall-rules subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "list" -d "List firewall rules" -complete -c forge-cli -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "ls" -d "List firewall rules (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "get" -d "Get firewall rule details" +complete -c forge -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "list" -d "List firewall rules" +complete -c forge -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "ls" -d "List firewall rules (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from firewall-rules fw" -a "get" -d "Get firewall rule details" # ssh-keys subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from ssh-keys" -a "list" -d "List SSH keys" -complete -c forge-cli -f -n "__fish_seen_subcommand_from ssh-keys" -a "ls" -d "List SSH keys (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from ssh-keys" -a "get" -d "Get SSH key details" +complete -c forge -f -n "__fish_seen_subcommand_from ssh-keys" -a "list" -d "List SSH keys" +complete -c forge -f -n "__fish_seen_subcommand_from ssh-keys" -a "ls" -d "List SSH keys (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from ssh-keys" -a "get" -d "Get SSH key details" # backups subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from backups" -a "list" -d "List backup configurations" -complete -c forge-cli -f -n "__fish_seen_subcommand_from backups" -a "ls" -d "List backup configurations (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from backups" -a "get" -d "Get backup configuration details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from backups" -a "create" -d "Create a backup configuration" -complete -c forge-cli -f -n "__fish_seen_subcommand_from backups" -a "delete" -d "Delete a backup configuration" +complete -c forge -f -n "__fish_seen_subcommand_from backups" -a "list" -d "List backup configurations" +complete -c forge -f -n "__fish_seen_subcommand_from backups" -a "ls" -d "List backup configurations (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from backups" -a "get" -d "Get backup configuration details" +complete -c forge -f -n "__fish_seen_subcommand_from backups" -a "create" -d "Create a backup configuration" +complete -c forge -f -n "__fish_seen_subcommand_from backups" -a "delete" -d "Delete a backup configuration" # commands subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from commands" -a "list" -d "List commands" -complete -c forge-cli -f -n "__fish_seen_subcommand_from commands" -a "ls" -d "List commands (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from commands" -a "get" -d "Get command details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from commands" -a "create" -d "Execute a command" +complete -c forge -f -n "__fish_seen_subcommand_from commands" -a "list" -d "List commands" +complete -c forge -f -n "__fish_seen_subcommand_from commands" -a "ls" -d "List commands (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from commands" -a "get" -d "Get command details" +complete -c forge -f -n "__fish_seen_subcommand_from commands" -a "create" -d "Execute a command" # scheduled-jobs subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "list" -d "List scheduled jobs" -complete -c forge-cli -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "ls" -d "List scheduled jobs (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "get" -d "Get scheduled job details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "create" -d "Create a scheduled job" -complete -c forge-cli -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "delete" -d "Delete a scheduled job" +complete -c forge -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "list" -d "List scheduled jobs" +complete -c forge -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "ls" -d "List scheduled jobs (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "get" -d "Get scheduled job details" +complete -c forge -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "create" -d "Create a scheduled job" +complete -c forge -f -n "__fish_seen_subcommand_from scheduled-jobs" -a "delete" -d "Delete a scheduled job" # user subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from user" -a "get" -d "Get the authenticated user profile" +complete -c forge -f -n "__fish_seen_subcommand_from user" -a "get" -d "Get the authenticated user profile" # monitors subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from monitors" -a "list" -d "List monitors" -complete -c forge-cli -f -n "__fish_seen_subcommand_from monitors" -a "ls" -d "List monitors (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from monitors" -a "get" -d "Get monitor details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from monitors" -a "create" -d "Create a monitor" -complete -c forge-cli -f -n "__fish_seen_subcommand_from monitors" -a "delete" -d "Delete a monitor" +complete -c forge -f -n "__fish_seen_subcommand_from monitors" -a "list" -d "List monitors" +complete -c forge -f -n "__fish_seen_subcommand_from monitors" -a "ls" -d "List monitors (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from monitors" -a "get" -d "Get monitor details" +complete -c forge -f -n "__fish_seen_subcommand_from monitors" -a "create" -d "Create a monitor" +complete -c forge -f -n "__fish_seen_subcommand_from monitors" -a "delete" -d "Delete a monitor" # nginx-templates subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "list" -d "List Nginx templates" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "ls" -d "List Nginx templates (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "get" -d "Get Nginx template details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "create" -d "Create a Nginx template" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "update" -d "Update a Nginx template" -complete -c forge-cli -f -n "__fish_seen_subcommand_from nginx-templates" -a "delete" -d "Delete a Nginx template" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "list" -d "List Nginx templates" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "ls" -d "List Nginx templates (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "get" -d "Get Nginx template details" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "create" -d "Create a Nginx template" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "update" -d "Update a Nginx template" +complete -c forge -f -n "__fish_seen_subcommand_from nginx-templates" -a "delete" -d "Delete a Nginx template" # security-rules subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from security-rules" -a "list" -d "List security rules" -complete -c forge-cli -f -n "__fish_seen_subcommand_from security-rules" -a "ls" -d "List security rules (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from security-rules" -a "get" -d "Get security rule details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from security-rules" -a "create" -d "Create a security rule" -complete -c forge-cli -f -n "__fish_seen_subcommand_from security-rules" -a "delete" -d "Delete a security rule" +complete -c forge -f -n "__fish_seen_subcommand_from security-rules" -a "list" -d "List security rules" +complete -c forge -f -n "__fish_seen_subcommand_from security-rules" -a "ls" -d "List security rules (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from security-rules" -a "get" -d "Get security rule details" +complete -c forge -f -n "__fish_seen_subcommand_from security-rules" -a "create" -d "Create a security rule" +complete -c forge -f -n "__fish_seen_subcommand_from security-rules" -a "delete" -d "Delete a security rule" # redirect-rules subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from redirect-rules" -a "list" -d "List redirect rules" -complete -c forge-cli -f -n "__fish_seen_subcommand_from redirect-rules" -a "ls" -d "List redirect rules (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from redirect-rules" -a "get" -d "Get redirect rule details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from redirect-rules" -a "create" -d "Create a redirect rule" -complete -c forge-cli -f -n "__fish_seen_subcommand_from redirect-rules" -a "delete" -d "Delete a redirect rule" +complete -c forge -f -n "__fish_seen_subcommand_from redirect-rules" -a "list" -d "List redirect rules" +complete -c forge -f -n "__fish_seen_subcommand_from redirect-rules" -a "ls" -d "List redirect rules (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from redirect-rules" -a "get" -d "Get redirect rule details" +complete -c forge -f -n "__fish_seen_subcommand_from redirect-rules" -a "create" -d "Create a redirect rule" +complete -c forge -f -n "__fish_seen_subcommand_from redirect-rules" -a "delete" -d "Delete a redirect rule" # recipes subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from recipes" -a "list" -d "List all recipes" -complete -c forge-cli -f -n "__fish_seen_subcommand_from recipes" -a "ls" -d "List all recipes (alias)" -complete -c forge-cli -f -n "__fish_seen_subcommand_from recipes" -a "get" -d "Get recipe details" -complete -c forge-cli -f -n "__fish_seen_subcommand_from recipes" -a "run" -d "Run a recipe" +complete -c forge -f -n "__fish_seen_subcommand_from recipes" -a "list" -d "List all recipes" +complete -c forge -f -n "__fish_seen_subcommand_from recipes" -a "ls" -d "List all recipes (alias)" +complete -c forge -f -n "__fish_seen_subcommand_from recipes" -a "get" -d "Get recipe details" +complete -c forge -f -n "__fish_seen_subcommand_from recipes" -a "run" -d "Run a recipe" # completion subcommands -complete -c forge-cli -f -n "__fish_seen_subcommand_from completion" -a "bash" -d "Install Bash completion" -complete -c forge-cli -f -n "__fish_seen_subcommand_from completion" -a "zsh" -d "Install Zsh completion" -complete -c forge-cli -f -n "__fish_seen_subcommand_from completion" -a "fish" -d "Install Fish completion" +complete -c forge -f -n "__fish_seen_subcommand_from completion" -a "bash" -d "Install Bash completion" +complete -c forge -f -n "__fish_seen_subcommand_from completion" -a "zsh" -d "Install Zsh completion" +complete -c forge -f -n "__fish_seen_subcommand_from completion" -a "fish" -d "Install Fish completion" # Global options -complete -c forge-cli -l token -d "API token" -r -complete -c forge-cli -l server -d "Server ID" -r -complete -c forge-cli -l site -d "Site ID" -r -complete -c forge-cli -s f -l format -d "Output format" -xa "json human table" -complete -c forge-cli -l no-color -d "Disable colored output" -complete -c forge-cli -s h -l help -d "Show help" -complete -c forge-cli -s v -l version -d "Show version" -complete -c forge-cli -l name -d "Name" -r -complete -c forge-cli -l command -d "Command" -r -complete -c forge-cli -l content -d "Content" -r -complete -c forge-cli -l from -d "From" -r -complete -c forge-cli -l to -d "To" -r -complete -c forge-cli -l provider -d "Provider" -r -complete -c forge-cli -l frequency -d "Frequency" -r -complete -c forge-cli -l type -d "Type" -r -complete -c forge-cli -l operator -d "Operator" -r -complete -c forge-cli -l threshold -d "Threshold" -r -complete -c forge-cli -l minutes -d "Minutes" -r -complete -c forge-cli -l key -d "Key" -r -complete -c forge-cli -l port -d "Port" -r -complete -c forge-cli -l ip-address -d "IP address" -r -complete -c forge-cli -l user -d "User" -r -complete -c forge-cli -l script -d "Script" -r -complete -c forge-cli -l servers -d "Servers" -r -complete -c forge-cli -l domain -d "Domain" -r -complete -c forge-cli -l password -d "Password" -r -complete -c forge-cli -l credential-id -d "Credential ID" -r -complete -c forge-cli -l region -d "Region" -r -complete -c forge-cli -l size -d "Size" -r -complete -c forge-cli -l project-type -d "Project type" -r -complete -c forge-cli -l directory -d "Directory" -r +complete -c forge -l token -d "API token" -r +complete -c forge -l server -d "Server ID" -r +complete -c forge -l site -d "Site ID" -r +complete -c forge -s f -l format -d "Output format" -xa "json human table" +complete -c forge -l no-color -d "Disable colored output" +complete -c forge -s h -l help -d "Show help" +complete -c forge -s v -l version -d "Show version" +complete -c forge -l name -d "Name" -r +complete -c forge -l command -d "Command" -r +complete -c forge -l content -d "Content" -r +complete -c forge -l from -d "From" -r +complete -c forge -l to -d "To" -r +complete -c forge -l provider -d "Provider" -r +complete -c forge -l frequency -d "Frequency" -r +complete -c forge -l type -d "Type" -r +complete -c forge -l operator -d "Operator" -r +complete -c forge -l threshold -d "Threshold" -r +complete -c forge -l minutes -d "Minutes" -r +complete -c forge -l key -d "Key" -r +complete -c forge -l port -d "Port" -r +complete -c forge -l ip-address -d "IP address" -r +complete -c forge -l user -d "User" -r +complete -c forge -l script -d "Script" -r +complete -c forge -l servers -d "Servers" -r +complete -c forge -l domain -d "Domain" -r +complete -c forge -l password -d "Password" -r +complete -c forge -l credential-id -d "Credential ID" -r +complete -c forge -l region -d "Region" -r +complete -c forge -l size -d "Size" -r +complete -c forge -l project-type -d "Project type" -r +complete -c forge -l directory -d "Directory" -r `; /** @@ -656,12 +656,12 @@ function getCompletionPath(shell: string): string { switch (shell) { case "bash": - return join(home, ".local/share/bash-completion/completions/forge-cli"); + return join(home, ".local/share/bash-completion/completions/forge"); case "zsh": - return join(home, ".zfunc/_forge-cli"); + return join(home, ".zfunc/_forge"); case "fish": { const configHome = process.env["XDG_CONFIG_HOME"] ?? join(home, ".config"); - return join(configHome, "fish/completions/forge-cli.fish"); + return join(configHome, "fish/completions/forge.fish"); } default: throw new Error(`Unknown shell: ${shell}`); @@ -670,10 +670,10 @@ function getCompletionPath(shell: string): string { export function showCompletionHelp(): void { console.log(` -${colors.bold("forge-cli completion")} - Install shell completion +${colors.bold("forge completion")} - Install shell completion ${colors.bold("USAGE:")} - forge-cli completion [--print] + forge completion [--print] ${colors.bold("SHELLS:")} bash Install Bash completion @@ -689,27 +689,27 @@ ${colors.bold("INSTALLATION:")} shell to activate completions. ${colors.bold("Bash:")} - forge-cli completion bash - # Installs to: ~/.local/share/bash-completion/completions/forge-cli + forge completion bash + # Installs to: ~/.local/share/bash-completion/completions/forge # Then run: exec bash ${colors.bold("Zsh:")} - forge-cli completion zsh - # Installs to: ~/.zfunc/_forge-cli + forge completion zsh + # Installs to: ~/.zfunc/_forge # Ensure fpath includes ~/.zfunc (add to ~/.zshrc before compinit): # fpath=(~/.zfunc $fpath) # Then run: exec zsh ${colors.bold("Fish:")} - forge-cli completion fish - # Installs to: ~/.config/fish/completions/forge-cli.fish + forge completion fish + # Installs to: ~/.config/fish/completions/forge.fish # Completions are loaded automatically ${colors.bold("PRINT ONLY:")} Use --print to output the script without installing: - forge-cli completion bash --print > my-completion.sh - forge-cli completion zsh --print | less + forge completion bash --print > my-completion.sh + forge completion zsh --print | less `); } @@ -737,7 +737,7 @@ export function handleCompletionCommand( console.error( `${colors.red("✗")} Unknown shell: ${shell}. Supported shells: bash, zsh, fish`, ); - console.error(`Run ${colors.cyan("forge-cli completion --help")} for usage information.`); + console.error(`Run ${colors.cyan("forge completion --help")} for usage information.`); process.exit(1); return; } diff --git a/packages/cli/src/commands/config.test.ts b/packages/cli/src/commands/config.test.ts index d5816ca..0cd4dd2 100644 --- a/packages/cli/src/commands/config.test.ts +++ b/packages/cli/src/commands/config.test.ts @@ -17,7 +17,7 @@ describe("showConfigHelp", () => { it("should print help text", () => { const spy = vi.spyOn(console, "log").mockImplementation(() => {}); showConfigHelp(); - expect(spy).toHaveBeenCalledWith(expect.stringContaining("forge-cli config")); + expect(spy).toHaveBeenCalledWith(expect.stringContaining("forge config")); spy.mockRestore(); }); }); @@ -105,7 +105,7 @@ describe("handleConfigCommand", () => { describe("unknown subcommand", () => { it("should show help for unknown subcommand", () => { handleConfigCommand("unknown", [], {}); - expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge-cli config")); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge config")); }); }); }); diff --git a/packages/cli/src/commands/config.ts b/packages/cli/src/commands/config.ts index 09a75bd..2b74f62 100644 --- a/packages/cli/src/commands/config.ts +++ b/packages/cli/src/commands/config.ts @@ -1,5 +1,5 @@ /** - * Config command — manage forge-cli configuration + * Config command — manage forge configuration */ import { createConfigStore, setToken, deleteToken, getToken } from "../config.ts"; @@ -8,10 +8,10 @@ import { colors } from "../utils/colors.ts"; export function showConfigHelp(): void { console.log(` -${colors.bold("forge-cli config")} - Manage CLI configuration +${colors.bold("forge config")} - Manage CLI configuration ${colors.bold("USAGE:")} - forge-cli config [options] + forge config [options] ${colors.bold("SUBCOMMANDS:")} set Save API token to config file @@ -19,9 +19,9 @@ ${colors.bold("SUBCOMMANDS:")} delete Delete stored API token ${colors.bold("EXAMPLES:")} - forge-cli config set YOUR_FORGE_TOKEN - forge-cli config get - forge-cli config delete + forge config set YOUR_FORGE_TOKEN + forge config get + forge config delete `); } @@ -42,7 +42,7 @@ export function handleConfigCommand( case "set": { const [token] = args; if (!token) { - formatter.error("Token is required. Usage: forge-cli config set "); + formatter.error("Token is required. Usage: forge config set "); process.exit(1); return; } @@ -55,7 +55,7 @@ export function handleConfigCommand( const token = getToken(store); if (!token) { formatter.warning("No API token configured."); - formatter.info("Run: forge-cli config set "); + formatter.info("Run: forge config set "); } else { // Mask the token for security const masked = diff --git a/packages/cli/src/commands/daemons/handlers.ts b/packages/cli/src/commands/daemons/handlers.ts index 8ccef80..681f610 100644 --- a/packages/cli/src/commands/daemons/handlers.ts +++ b/packages/cli/src/commands/daemons/handlers.ts @@ -9,11 +9,7 @@ export async function daemonsList(ctx: CommandContext): Promise { const server = String(ctx.options.server ?? ""); if (!server) { - exitWithValidationError( - "server_id", - "forge-cli daemons list --server ", - ctx.formatter, - ); + exitWithValidationError("server_id", "forge daemons list --server ", ctx.formatter); } await runCommand(async () => { @@ -37,7 +33,7 @@ export async function daemonsGet(args: string[], ctx: CommandContext): Promise --server ", + "forge daemons get --server ", ctx.formatter, ); } @@ -45,7 +41,7 @@ export async function daemonsGet(args: string[], ctx: CommandContext): Promise --server ", + "forge daemons get --server ", ctx.formatter, ); } @@ -74,7 +70,7 @@ export async function daemonsRestart(args: string[], ctx: CommandContext): Promi if (!id) { exitWithValidationError( "daemon_id", - "forge-cli daemons restart --server ", + "forge daemons restart --server ", ctx.formatter, ); } @@ -82,7 +78,7 @@ export async function daemonsRestart(args: string[], ctx: CommandContext): Promi if (!server) { exitWithValidationError( "server_id", - "forge-cli daemons restart --server ", + "forge daemons restart --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/daemons/help.ts b/packages/cli/src/commands/daemons/help.ts index c6992d0..42b8fc6 100644 --- a/packages/cli/src/commands/daemons/help.ts +++ b/packages/cli/src/commands/daemons/help.ts @@ -3,31 +3,31 @@ import { colors } from "../../utils/colors.ts"; export function showDaemonsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli daemons list")} - List daemons on a server +${colors.bold("forge daemons list")} - List daemons on a server ${colors.bold("USAGE:")} - forge-cli daemons list --server [options] + forge daemons list --server [options] `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli daemons get")} - Get daemon details +${colors.bold("forge daemons get")} - Get daemon details ${colors.bold("USAGE:")} - forge-cli daemons get --server + forge daemons get --server `); } else if (subcommand === "restart") { console.log(` -${colors.bold("forge-cli daemons restart")} - Restart a daemon +${colors.bold("forge daemons restart")} - Restart a daemon ${colors.bold("USAGE:")} - forge-cli daemons restart --server + forge daemons restart --server `); } else { console.log(` -${colors.bold("forge-cli daemons")} - Manage daemons +${colors.bold("forge daemons")} - Manage daemons ${colors.bold("USAGE:")} - forge-cli daemons [options] + forge daemons [options] ${colors.bold("SUBCOMMANDS:")} list, ls List daemons @@ -38,7 +38,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli daemons --help")} for details. +Run ${colors.cyan("forge daemons --help")} for details. `); } } diff --git a/packages/cli/src/commands/database-users/handlers.ts b/packages/cli/src/commands/database-users/handlers.ts index 8e28b87..9ddfc5d 100644 --- a/packages/cli/src/commands/database-users/handlers.ts +++ b/packages/cli/src/commands/database-users/handlers.ts @@ -16,7 +16,7 @@ export async function databaseUsersList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli database-users list --server ", + "forge database-users list --server ", ctx.formatter, ); } @@ -42,7 +42,7 @@ export async function databaseUsersGet(args: string[], ctx: CommandContext): Pro if (!id) { exitWithValidationError( "user_id", - "forge-cli database-users get --server ", + "forge database-users get --server ", ctx.formatter, ); } @@ -50,7 +50,7 @@ export async function databaseUsersGet(args: string[], ctx: CommandContext): Pro if (!server) { exitWithValidationError( "server_id", - "forge-cli database-users get --server ", + "forge database-users get --server ", ctx.formatter, ); } @@ -78,7 +78,7 @@ export async function databaseUsersCreate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli database-users create --server --name --password ", + "forge database-users create --server --name --password ", ctx.formatter, ); } @@ -86,7 +86,7 @@ export async function databaseUsersCreate(ctx: CommandContext): Promise { if (!name) { exitWithValidationError( "name", - "forge-cli database-users create --server --name --password ", + "forge database-users create --server --name --password ", ctx.formatter, ); } @@ -94,7 +94,7 @@ export async function databaseUsersCreate(ctx: CommandContext): Promise { if (!password) { exitWithValidationError( "password", - "forge-cli database-users create --server --name --password ", + "forge database-users create --server --name --password ", ctx.formatter, ); } @@ -118,7 +118,7 @@ export async function databaseUsersDelete(args: string[], ctx: CommandContext): if (!id) { exitWithValidationError( "user_id", - "forge-cli database-users delete --server ", + "forge database-users delete --server ", ctx.formatter, ); } @@ -126,7 +126,7 @@ export async function databaseUsersDelete(args: string[], ctx: CommandContext): if (!server) { exitWithValidationError( "server_id", - "forge-cli database-users delete --server ", + "forge database-users delete --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/database-users/help.ts b/packages/cli/src/commands/database-users/help.ts index e4fb83e..1504450 100644 --- a/packages/cli/src/commands/database-users/help.ts +++ b/packages/cli/src/commands/database-users/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showDatabaseUsersHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli database-users list")} - List database users on a server +${colors.bold("forge database-users list")} - List database users on a server ${colors.bold("USAGE:")} - forge-cli database-users list --server [options] + forge database-users list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,17 +14,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli database-users get")} - Get database user details +${colors.bold("forge database-users get")} - Get database user details ${colors.bold("USAGE:")} - forge-cli database-users get --server [options] + forge database-users get --server [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli database-users create")} - Create a new database user +${colors.bold("forge database-users create")} - Create a new database user ${colors.bold("USAGE:")} - forge-cli database-users create --server --name --password [options] + forge database-users create --server --name --password [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -35,17 +35,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli database-users delete")} - Delete a database user +${colors.bold("forge database-users delete")} - Delete a database user ${colors.bold("USAGE:")} - forge-cli database-users delete --server [options] + forge database-users delete --server [options] `); } else { console.log(` -${colors.bold("forge-cli database-users")} - Manage database users +${colors.bold("forge database-users")} - Manage database users ${colors.bold("USAGE:")} - forge-cli database-users [options] + forge database-users [options] ${colors.bold("SUBCOMMANDS:")} list, ls List database users @@ -57,7 +57,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli database-users --help")} for details. +Run ${colors.cyan("forge database-users --help")} for details. `); } } diff --git a/packages/cli/src/commands/databases/handlers.ts b/packages/cli/src/commands/databases/handlers.ts index 6ea7c92..eb00622 100644 --- a/packages/cli/src/commands/databases/handlers.ts +++ b/packages/cli/src/commands/databases/handlers.ts @@ -11,7 +11,7 @@ export async function databasesList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli databases list --server ", + "forge databases list --server ", ctx.formatter, ); } @@ -37,7 +37,7 @@ export async function databasesGet(args: string[], ctx: CommandContext): Promise if (!id) { exitWithValidationError( "database_id", - "forge-cli databases get --server ", + "forge databases get --server ", ctx.formatter, ); } @@ -45,7 +45,7 @@ export async function databasesGet(args: string[], ctx: CommandContext): Promise if (!server) { exitWithValidationError( "server_id", - "forge-cli databases get --server ", + "forge databases get --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/databases/help.ts b/packages/cli/src/commands/databases/help.ts index 62088c2..62cd83b 100644 --- a/packages/cli/src/commands/databases/help.ts +++ b/packages/cli/src/commands/databases/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showDatabasesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli databases list")} - List databases on a server +${colors.bold("forge databases list")} - List databases on a server ${colors.bold("USAGE:")} - forge-cli databases list --server [options] + forge databases list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,20 +14,20 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli databases get")} - Get database details +${colors.bold("forge databases get")} - Get database details ${colors.bold("USAGE:")} - forge-cli databases get --server [options] + forge databases get --server [options] `); } else { console.log(` -${colors.bold("forge-cli databases")} - Manage databases +${colors.bold("forge databases")} - Manage databases ${colors.bold("USAGE:")} - forge-cli databases [options] + forge databases [options] ${colors.bold("ALIASES:")} - forge-cli db + forge db ${colors.bold("SUBCOMMANDS:")} list, ls List databases @@ -37,7 +37,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli databases --help")} for details. +Run ${colors.cyan("forge databases --help")} for details. `); } } diff --git a/packages/cli/src/commands/deployments/handlers.ts b/packages/cli/src/commands/deployments/handlers.ts index 717eef4..3c10238 100644 --- a/packages/cli/src/commands/deployments/handlers.ts +++ b/packages/cli/src/commands/deployments/handlers.ts @@ -12,7 +12,7 @@ export async function deploymentsList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli deployments list --server --site ", + "forge deployments list --server --site ", ctx.formatter, ); } @@ -20,7 +20,7 @@ export async function deploymentsList(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli deployments list --server --site ", + "forge deployments list --server --site ", ctx.formatter, ); } @@ -48,7 +48,7 @@ export async function deploymentsDeploy(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli deployments deploy --server --site ", + "forge deployments deploy --server --site ", ctx.formatter, ); } @@ -56,7 +56,7 @@ export async function deploymentsDeploy(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli deployments deploy --server --site ", + "forge deployments deploy --server --site ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/deployments/help.ts b/packages/cli/src/commands/deployments/help.ts index 295a2ae..9296061 100644 --- a/packages/cli/src/commands/deployments/help.ts +++ b/packages/cli/src/commands/deployments/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showDeploymentsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli deployments list")} - List deployments for a site +${colors.bold("forge deployments list")} - List deployments for a site ${colors.bold("USAGE:")} - forge-cli deployments list --server --site [options] + forge deployments list --server --site [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -15,20 +15,20 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "deploy") { console.log(` -${colors.bold("forge-cli deployments deploy")} - Trigger a deployment +${colors.bold("forge deployments deploy")} - Trigger a deployment ${colors.bold("USAGE:")} - forge-cli deployments deploy --server --site + forge deployments deploy --server --site `); } else { console.log(` -${colors.bold("forge-cli deployments")} - Manage deployments +${colors.bold("forge deployments")} - Manage deployments ${colors.bold("USAGE:")} - forge-cli deployments [options] + forge deployments [options] ${colors.bold("ALIASES:")} - forge-cli d + forge d ${colors.bold("SUBCOMMANDS:")} list, ls List deployments for a site @@ -39,7 +39,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli deployments --help")} for details. +Run ${colors.cyan("forge deployments --help")} for details. `); } } diff --git a/packages/cli/src/commands/env/handlers.ts b/packages/cli/src/commands/env/handlers.ts index f4bd7cb..9885c10 100644 --- a/packages/cli/src/commands/env/handlers.ts +++ b/packages/cli/src/commands/env/handlers.ts @@ -12,7 +12,7 @@ export async function envGet(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli env get --server --site ", + "forge env get --server --site ", ctx.formatter, ); } @@ -20,7 +20,7 @@ export async function envGet(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli env get --server --site ", + "forge env get --server --site ", ctx.formatter, ); } @@ -47,7 +47,7 @@ export async function envUpdate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli env update --server --site --content ", + "forge env update --server --site --content ", ctx.formatter, ); } @@ -55,7 +55,7 @@ export async function envUpdate(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli env update --server --site --content ", + "forge env update --server --site --content ", ctx.formatter, ); } @@ -63,7 +63,7 @@ export async function envUpdate(ctx: CommandContext): Promise { if (!content) { exitWithValidationError( "content", - "forge-cli env update --server --site --content ", + "forge env update --server --site --content ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/env/help.ts b/packages/cli/src/commands/env/help.ts index ecb4661..60de6a0 100644 --- a/packages/cli/src/commands/env/help.ts +++ b/packages/cli/src/commands/env/help.ts @@ -3,24 +3,24 @@ import { colors } from "../../utils/colors.ts"; export function showEnvHelp(subcommand?: string): void { if (subcommand === "get") { console.log(` -${colors.bold("forge-cli env get")} - Get environment variables +${colors.bold("forge env get")} - Get environment variables ${colors.bold("USAGE:")} - forge-cli env get --server --site + forge env get --server --site `); } else if (subcommand === "update") { console.log(` -${colors.bold("forge-cli env update")} - Update environment variables +${colors.bold("forge env update")} - Update environment variables ${colors.bold("USAGE:")} - forge-cli env update --server --site --content + forge env update --server --site --content `); } else { console.log(` -${colors.bold("forge-cli env")} - Manage environment variables +${colors.bold("forge env")} - Manage environment variables ${colors.bold("USAGE:")} - forge-cli env [options] + forge env [options] ${colors.bold("SUBCOMMANDS:")} get Get environment variables @@ -32,7 +32,7 @@ ${colors.bold("OPTIONS:")} --content New env content (for update) -f, --format Output format: json, human -Run ${colors.cyan("forge-cli env --help")} for details. +Run ${colors.cyan("forge env --help")} for details. `); } } diff --git a/packages/cli/src/commands/firewall-rules/handlers.ts b/packages/cli/src/commands/firewall-rules/handlers.ts index db2a0a9..ea9a9eb 100644 --- a/packages/cli/src/commands/firewall-rules/handlers.ts +++ b/packages/cli/src/commands/firewall-rules/handlers.ts @@ -11,7 +11,7 @@ export async function firewallRulesList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli firewall-rules list --server ", + "forge firewall-rules list --server ", ctx.formatter, ); } @@ -38,7 +38,7 @@ export async function firewallRulesGet(args: string[], ctx: CommandContext): Pro if (!id) { exitWithValidationError( "firewall_rule_id", - "forge-cli firewall-rules get --server ", + "forge firewall-rules get --server ", ctx.formatter, ); } @@ -46,7 +46,7 @@ export async function firewallRulesGet(args: string[], ctx: CommandContext): Pro if (!server) { exitWithValidationError( "server_id", - "forge-cli firewall-rules get --server ", + "forge firewall-rules get --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/firewall-rules/help.ts b/packages/cli/src/commands/firewall-rules/help.ts index 4632392..611044e 100644 --- a/packages/cli/src/commands/firewall-rules/help.ts +++ b/packages/cli/src/commands/firewall-rules/help.ts @@ -3,27 +3,27 @@ import { colors } from "../../utils/colors.ts"; export function showFirewallRulesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli firewall-rules list")} - List firewall rules on a server +${colors.bold("forge firewall-rules list")} - List firewall rules on a server ${colors.bold("USAGE:")} - forge-cli firewall-rules list --server [options] + forge firewall-rules list --server [options] `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli firewall-rules get")} - Get firewall rule details +${colors.bold("forge firewall-rules get")} - Get firewall rule details ${colors.bold("USAGE:")} - forge-cli firewall-rules get --server + forge firewall-rules get --server `); } else { console.log(` -${colors.bold("forge-cli firewall-rules")} - Manage firewall rules +${colors.bold("forge firewall-rules")} - Manage firewall rules ${colors.bold("USAGE:")} - forge-cli firewall-rules [options] + forge firewall-rules [options] ${colors.bold("ALIASES:")} - forge-cli fw + forge fw ${colors.bold("SUBCOMMANDS:")} list, ls List firewall rules @@ -33,7 +33,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli firewall-rules --help")} for details. +Run ${colors.cyan("forge firewall-rules --help")} for details. `); } } diff --git a/packages/cli/src/commands/monitors/handlers.ts b/packages/cli/src/commands/monitors/handlers.ts index b06aa4b..7d5944a 100644 --- a/packages/cli/src/commands/monitors/handlers.ts +++ b/packages/cli/src/commands/monitors/handlers.ts @@ -9,11 +9,7 @@ export async function monitorsList(ctx: CommandContext): Promise { const server = String(ctx.options.server ?? ""); if (!server) { - exitWithValidationError( - "server_id", - "forge-cli monitors list --server ", - ctx.formatter, - ); + exitWithValidationError("server_id", "forge monitors list --server ", ctx.formatter); } await runCommand(async () => { @@ -38,7 +34,7 @@ export async function monitorsGet(args: string[], ctx: CommandContext): Promise< if (!id) { exitWithValidationError( "monitor_id", - "forge-cli monitors get --server ", + "forge monitors get --server ", ctx.formatter, ); } @@ -46,7 +42,7 @@ export async function monitorsGet(args: string[], ctx: CommandContext): Promise< if (!server) { exitWithValidationError( "server_id", - "forge-cli monitors get --server ", + "forge monitors get --server ", ctx.formatter, ); } @@ -78,7 +74,7 @@ export async function monitorsCreate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli monitors create --server --type --operator --threshold --minutes ", + "forge monitors create --server --type --operator --threshold --minutes ", ctx.formatter, ); } @@ -86,7 +82,7 @@ export async function monitorsCreate(ctx: CommandContext): Promise { if (!type) { exitWithValidationError( "type", - "forge-cli monitors create --server --type --operator --threshold --minutes ", + "forge monitors create --server --type --operator --threshold --minutes ", ctx.formatter, ); } @@ -94,7 +90,7 @@ export async function monitorsCreate(ctx: CommandContext): Promise { if (!operator) { exitWithValidationError( "operator", - "forge-cli monitors create --server --type --operator --threshold --minutes ", + "forge monitors create --server --type --operator --threshold --minutes ", ctx.formatter, ); } @@ -122,7 +118,7 @@ export async function monitorsDelete(args: string[], ctx: CommandContext): Promi if (!id) { exitWithValidationError( "monitor_id", - "forge-cli monitors delete --server ", + "forge monitors delete --server ", ctx.formatter, ); } @@ -130,7 +126,7 @@ export async function monitorsDelete(args: string[], ctx: CommandContext): Promi if (!server) { exitWithValidationError( "server_id", - "forge-cli monitors delete --server ", + "forge monitors delete --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/monitors/help.ts b/packages/cli/src/commands/monitors/help.ts index 2b959f9..6f1942c 100644 --- a/packages/cli/src/commands/monitors/help.ts +++ b/packages/cli/src/commands/monitors/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showMonitorsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli monitors list")} - List monitors on a server +${colors.bold("forge monitors list")} - List monitors on a server ${colors.bold("USAGE:")} - forge-cli monitors list --server [options] + forge monitors list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,17 +14,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli monitors get")} - Get monitor details +${colors.bold("forge monitors get")} - Get monitor details ${colors.bold("USAGE:")} - forge-cli monitors get --server [options] + forge monitors get --server [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli monitors create")} - Create a new monitor +${colors.bold("forge monitors create")} - Create a new monitor ${colors.bold("USAGE:")} - forge-cli monitors create --server --type --operator --threshold --minutes [options] + forge monitors create --server --type --operator --threshold --minutes [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -36,17 +36,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli monitors delete")} - Delete a monitor +${colors.bold("forge monitors delete")} - Delete a monitor ${colors.bold("USAGE:")} - forge-cli monitors delete --server [options] + forge monitors delete --server [options] `); } else { console.log(` -${colors.bold("forge-cli monitors")} - Manage server monitors +${colors.bold("forge monitors")} - Manage server monitors ${colors.bold("USAGE:")} - forge-cli monitors [options] + forge monitors [options] ${colors.bold("SUBCOMMANDS:")} list, ls List monitors @@ -58,7 +58,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli monitors --help")} for details. +Run ${colors.cyan("forge monitors --help")} for details. `); } } diff --git a/packages/cli/src/commands/nginx-templates/handlers.ts b/packages/cli/src/commands/nginx-templates/handlers.ts index 2a99a61..841e14e 100644 --- a/packages/cli/src/commands/nginx-templates/handlers.ts +++ b/packages/cli/src/commands/nginx-templates/handlers.ts @@ -17,7 +17,7 @@ export async function nginxTemplatesList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx-templates list --server ", + "forge nginx-templates list --server ", ctx.formatter, ); } @@ -43,7 +43,7 @@ export async function nginxTemplatesGet(args: string[], ctx: CommandContext): Pr if (!id) { exitWithValidationError( "template_id", - "forge-cli nginx-templates get --server ", + "forge nginx-templates get --server ", ctx.formatter, ); } @@ -51,7 +51,7 @@ export async function nginxTemplatesGet(args: string[], ctx: CommandContext): Pr if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx-templates get --server ", + "forge nginx-templates get --server ", ctx.formatter, ); } @@ -73,7 +73,7 @@ export async function nginxTemplatesCreate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx-templates create --server --name --content ", + "forge nginx-templates create --server --name --content ", ctx.formatter, ); } @@ -81,7 +81,7 @@ export async function nginxTemplatesCreate(ctx: CommandContext): Promise { if (!name) { exitWithValidationError( "name", - "forge-cli nginx-templates create --server --name --content ", + "forge nginx-templates create --server --name --content ", ctx.formatter, ); } @@ -89,7 +89,7 @@ export async function nginxTemplatesCreate(ctx: CommandContext): Promise { if (!content) { exitWithValidationError( "content", - "forge-cli nginx-templates create --server --name --content ", + "forge nginx-templates create --server --name --content ", ctx.formatter, ); } @@ -110,7 +110,7 @@ export async function nginxTemplatesUpdate(args: string[], ctx: CommandContext): if (!id) { exitWithValidationError( "template_id", - "forge-cli nginx-templates update --server ", + "forge nginx-templates update --server ", ctx.formatter, ); } @@ -118,7 +118,7 @@ export async function nginxTemplatesUpdate(args: string[], ctx: CommandContext): if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx-templates update --server ", + "forge nginx-templates update --server ", ctx.formatter, ); } @@ -141,7 +141,7 @@ export async function nginxTemplatesDelete(args: string[], ctx: CommandContext): if (!id) { exitWithValidationError( "template_id", - "forge-cli nginx-templates delete --server ", + "forge nginx-templates delete --server ", ctx.formatter, ); } @@ -149,7 +149,7 @@ export async function nginxTemplatesDelete(args: string[], ctx: CommandContext): if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx-templates delete --server ", + "forge nginx-templates delete --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/nginx-templates/help.ts b/packages/cli/src/commands/nginx-templates/help.ts index 4cf5046..ac26a15 100644 --- a/packages/cli/src/commands/nginx-templates/help.ts +++ b/packages/cli/src/commands/nginx-templates/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showNginxTemplatesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli nginx-templates list")} - List Nginx templates on a server +${colors.bold("forge nginx-templates list")} - List Nginx templates on a server ${colors.bold("USAGE:")} - forge-cli nginx-templates list --server [options] + forge nginx-templates list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,17 +14,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli nginx-templates get")} - Get Nginx template details +${colors.bold("forge nginx-templates get")} - Get Nginx template details ${colors.bold("USAGE:")} - forge-cli nginx-templates get --server [options] + forge nginx-templates get --server [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli nginx-templates create")} - Create a new Nginx template +${colors.bold("forge nginx-templates create")} - Create a new Nginx template ${colors.bold("USAGE:")} - forge-cli nginx-templates create --server --name --content [options] + forge nginx-templates create --server --name --content [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -34,10 +34,10 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "update") { console.log(` -${colors.bold("forge-cli nginx-templates update")} - Update an Nginx template +${colors.bold("forge nginx-templates update")} - Update an Nginx template ${colors.bold("USAGE:")} - forge-cli nginx-templates update --server [options] + forge nginx-templates update --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -47,17 +47,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli nginx-templates delete")} - Delete an Nginx template +${colors.bold("forge nginx-templates delete")} - Delete an Nginx template ${colors.bold("USAGE:")} - forge-cli nginx-templates delete --server [options] + forge nginx-templates delete --server [options] `); } else { console.log(` -${colors.bold("forge-cli nginx-templates")} - Manage Nginx templates +${colors.bold("forge nginx-templates")} - Manage Nginx templates ${colors.bold("USAGE:")} - forge-cli nginx-templates [options] + forge nginx-templates [options] ${colors.bold("SUBCOMMANDS:")} list, ls List Nginx templates @@ -70,7 +70,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli nginx-templates --help")} for details. +Run ${colors.cyan("forge nginx-templates --help")} for details. `); } } diff --git a/packages/cli/src/commands/nginx/handlers.ts b/packages/cli/src/commands/nginx/handlers.ts index 8dd7ef8..c444fa8 100644 --- a/packages/cli/src/commands/nginx/handlers.ts +++ b/packages/cli/src/commands/nginx/handlers.ts @@ -12,7 +12,7 @@ export async function nginxGet(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx get --server --site ", + "forge nginx get --server --site ", ctx.formatter, ); } @@ -20,7 +20,7 @@ export async function nginxGet(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli nginx get --server --site ", + "forge nginx get --server --site ", ctx.formatter, ); } @@ -47,7 +47,7 @@ export async function nginxUpdate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli nginx update --server --site --content ", + "forge nginx update --server --site --content ", ctx.formatter, ); } @@ -55,7 +55,7 @@ export async function nginxUpdate(ctx: CommandContext): Promise { if (!site) { exitWithValidationError( "site_id", - "forge-cli nginx update --server --site --content ", + "forge nginx update --server --site --content ", ctx.formatter, ); } @@ -63,7 +63,7 @@ export async function nginxUpdate(ctx: CommandContext): Promise { if (!content) { exitWithValidationError( "content", - "forge-cli nginx update --server --site --content ", + "forge nginx update --server --site --content ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/nginx/help.ts b/packages/cli/src/commands/nginx/help.ts index d106717..fce8af7 100644 --- a/packages/cli/src/commands/nginx/help.ts +++ b/packages/cli/src/commands/nginx/help.ts @@ -3,24 +3,24 @@ import { colors } from "../../utils/colors.ts"; export function showNginxHelp(subcommand?: string): void { if (subcommand === "get") { console.log(` -${colors.bold("forge-cli nginx get")} - Get nginx configuration +${colors.bold("forge nginx get")} - Get nginx configuration ${colors.bold("USAGE:")} - forge-cli nginx get --server --site + forge nginx get --server --site `); } else if (subcommand === "update") { console.log(` -${colors.bold("forge-cli nginx update")} - Update nginx configuration +${colors.bold("forge nginx update")} - Update nginx configuration ${colors.bold("USAGE:")} - forge-cli nginx update --server --site --content + forge nginx update --server --site --content `); } else { console.log(` -${colors.bold("forge-cli nginx")} - Manage nginx configuration +${colors.bold("forge nginx")} - Manage nginx configuration ${colors.bold("USAGE:")} - forge-cli nginx [options] + forge nginx [options] ${colors.bold("SUBCOMMANDS:")} get Get nginx configuration @@ -31,7 +31,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) --content New nginx config (for update) -Run ${colors.cyan("forge-cli nginx --help")} for details. +Run ${colors.cyan("forge nginx --help")} for details. `); } } diff --git a/packages/cli/src/commands/recipes/handlers.ts b/packages/cli/src/commands/recipes/handlers.ts index 146c285..d4e1221 100644 --- a/packages/cli/src/commands/recipes/handlers.ts +++ b/packages/cli/src/commands/recipes/handlers.ts @@ -22,7 +22,7 @@ export async function recipesGet(args: string[], ctx: CommandContext): Promise", ctx.formatter); + exitWithValidationError("id", "forge recipes get ", ctx.formatter); } await runCommand(async () => { @@ -38,17 +38,13 @@ export async function recipesRun(args: string[], ctx: CommandContext): Promise --servers ", - ctx.formatter, - ); + exitWithValidationError("id", "forge recipes run --servers ", ctx.formatter); } if (!serversRaw) { exitWithValidationError( "servers", - "forge-cli recipes run --servers ", + "forge recipes run --servers ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/recipes/help.ts b/packages/cli/src/commands/recipes/help.ts index e9fed3c..8dfc50a 100644 --- a/packages/cli/src/commands/recipes/help.ts +++ b/packages/cli/src/commands/recipes/help.ts @@ -3,34 +3,34 @@ import { colors } from "../../utils/colors.ts"; export function showRecipesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli recipes list")} - List all recipes +${colors.bold("forge recipes list")} - List all recipes ${colors.bold("USAGE:")} - forge-cli recipes list [options] + forge recipes list [options] `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli recipes get")} - Get recipe details +${colors.bold("forge recipes get")} - Get recipe details ${colors.bold("USAGE:")} - forge-cli recipes get + forge recipes get `); } else if (subcommand === "run") { console.log(` -${colors.bold("forge-cli recipes run")} - Run a recipe on servers +${colors.bold("forge recipes run")} - Run a recipe on servers ${colors.bold("USAGE:")} - forge-cli recipes run --servers + forge recipes run --servers ${colors.bold("OPTIONS:")} --servers Comma-separated server IDs to run recipe on `); } else { console.log(` -${colors.bold("forge-cli recipes")} - Manage recipes +${colors.bold("forge recipes")} - Manage recipes ${colors.bold("USAGE:")} - forge-cli recipes [options] + forge recipes [options] ${colors.bold("SUBCOMMANDS:")} list, ls List all recipes @@ -40,7 +40,7 @@ ${colors.bold("SUBCOMMANDS:")} ${colors.bold("OPTIONS:")} -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli recipes --help")} for details. +Run ${colors.cyan("forge recipes --help")} for details. `); } } diff --git a/packages/cli/src/commands/redirect-rules/handlers.ts b/packages/cli/src/commands/redirect-rules/handlers.ts index 1df96c0..81154e7 100644 --- a/packages/cli/src/commands/redirect-rules/handlers.ts +++ b/packages/cli/src/commands/redirect-rules/handlers.ts @@ -28,7 +28,7 @@ function requireServerAndSiteRaw( } export async function redirectRulesList(ctx: CommandContext): Promise { - const usage = "forge-cli redirect-rules list --server --site "; + const usage = "forge redirect-rules list --server --site "; const { server, site } = requireServerAndSiteRaw(ctx, usage); await runCommand(async () => { @@ -48,7 +48,7 @@ export async function redirectRulesList(ctx: CommandContext): Promise { export async function redirectRulesGet(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli redirect-rules get --server --site "; + const usage = "forge redirect-rules get --server --site "; if (!id) { exitWithValidationError("rule_id", usage, ctx.formatter); @@ -68,7 +68,7 @@ export async function redirectRulesGet(args: string[], ctx: CommandContext): Pro export async function redirectRulesCreate(ctx: CommandContext): Promise { const usage = - "forge-cli redirect-rules create --server --site --from --to "; + "forge redirect-rules create --server --site --from --to "; const { server, site } = requireServerAndSiteRaw(ctx, usage); const from = String(ctx.options.from ?? ""); const to = String(ctx.options.to ?? ""); @@ -93,7 +93,7 @@ export async function redirectRulesCreate(ctx: CommandContext): Promise { export async function redirectRulesDelete(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli redirect-rules delete --server --site "; + const usage = "forge redirect-rules delete --server --site "; if (!id) { exitWithValidationError("rule_id", usage, ctx.formatter); diff --git a/packages/cli/src/commands/redirect-rules/help.ts b/packages/cli/src/commands/redirect-rules/help.ts index 4e921af..6e70461 100644 --- a/packages/cli/src/commands/redirect-rules/help.ts +++ b/packages/cli/src/commands/redirect-rules/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showRedirectRulesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli redirect-rules list")} - List redirect rules for a site +${colors.bold("forge redirect-rules list")} - List redirect rules for a site ${colors.bold("USAGE:")} - forge-cli redirect-rules list --server --site [options] + forge redirect-rules list --server --site [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -15,17 +15,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli redirect-rules get")} - Get redirect rule details +${colors.bold("forge redirect-rules get")} - Get redirect rule details ${colors.bold("USAGE:")} - forge-cli redirect-rules get --server --site [options] + forge redirect-rules get --server --site [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli redirect-rules create")} - Create a new redirect rule +${colors.bold("forge redirect-rules create")} - Create a new redirect rule ${colors.bold("USAGE:")} - forge-cli redirect-rules create --server --site --from --to [options] + forge redirect-rules create --server --site --from --to [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -36,17 +36,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli redirect-rules delete")} - Delete a redirect rule +${colors.bold("forge redirect-rules delete")} - Delete a redirect rule ${colors.bold("USAGE:")} - forge-cli redirect-rules delete --server --site [options] + forge redirect-rules delete --server --site [options] `); } else { console.log(` -${colors.bold("forge-cli redirect-rules")} - Manage site redirect rules +${colors.bold("forge redirect-rules")} - Manage site redirect rules ${colors.bold("USAGE:")} - forge-cli redirect-rules [options] + forge redirect-rules [options] ${colors.bold("SUBCOMMANDS:")} list, ls List redirect rules @@ -59,7 +59,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli redirect-rules --help")} for details. +Run ${colors.cyan("forge redirect-rules --help")} for details. `); } } diff --git a/packages/cli/src/commands/scheduled-jobs/handlers.ts b/packages/cli/src/commands/scheduled-jobs/handlers.ts index d026bd5..4837f95 100644 --- a/packages/cli/src/commands/scheduled-jobs/handlers.ts +++ b/packages/cli/src/commands/scheduled-jobs/handlers.ts @@ -16,7 +16,7 @@ export async function scheduledJobsList(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli scheduled-jobs list --server ", + "forge scheduled-jobs list --server ", ctx.formatter, ); } @@ -43,7 +43,7 @@ export async function scheduledJobsGet(args: string[], ctx: CommandContext): Pro if (!id) { exitWithValidationError( "job_id", - "forge-cli scheduled-jobs get --server ", + "forge scheduled-jobs get --server ", ctx.formatter, ); } @@ -51,7 +51,7 @@ export async function scheduledJobsGet(args: string[], ctx: CommandContext): Pro if (!server) { exitWithValidationError( "server_id", - "forge-cli scheduled-jobs get --server ", + "forge scheduled-jobs get --server ", ctx.formatter, ); } @@ -80,7 +80,7 @@ export async function scheduledJobsCreate(ctx: CommandContext): Promise { if (!server) { exitWithValidationError( "server_id", - "forge-cli scheduled-jobs create --server --command ", + "forge scheduled-jobs create --server --command ", ctx.formatter, ); } @@ -88,7 +88,7 @@ export async function scheduledJobsCreate(ctx: CommandContext): Promise { if (!command) { exitWithValidationError( "command", - "forge-cli scheduled-jobs create --server --command ", + "forge scheduled-jobs create --server --command ", ctx.formatter, ); } @@ -117,7 +117,7 @@ export async function scheduledJobsDelete(args: string[], ctx: CommandContext): if (!id) { exitWithValidationError( "job_id", - "forge-cli scheduled-jobs delete --server ", + "forge scheduled-jobs delete --server ", ctx.formatter, ); } @@ -125,7 +125,7 @@ export async function scheduledJobsDelete(args: string[], ctx: CommandContext): if (!server) { exitWithValidationError( "server_id", - "forge-cli scheduled-jobs delete --server ", + "forge scheduled-jobs delete --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/scheduled-jobs/help.ts b/packages/cli/src/commands/scheduled-jobs/help.ts index d41268d..254f67a 100644 --- a/packages/cli/src/commands/scheduled-jobs/help.ts +++ b/packages/cli/src/commands/scheduled-jobs/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showScheduledJobsHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli scheduled-jobs list")} - List scheduled jobs on a server +${colors.bold("forge scheduled-jobs list")} - List scheduled jobs on a server ${colors.bold("USAGE:")} - forge-cli scheduled-jobs list --server [options] + forge scheduled-jobs list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -14,17 +14,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli scheduled-jobs get")} - Get scheduled job details +${colors.bold("forge scheduled-jobs get")} - Get scheduled job details ${colors.bold("USAGE:")} - forge-cli scheduled-jobs get --server [options] + forge scheduled-jobs get --server [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli scheduled-jobs create")} - Create a new scheduled job +${colors.bold("forge scheduled-jobs create")} - Create a new scheduled job ${colors.bold("USAGE:")} - forge-cli scheduled-jobs create --server --command [options] + forge scheduled-jobs create --server --command [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -33,17 +33,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli scheduled-jobs delete")} - Delete a scheduled job +${colors.bold("forge scheduled-jobs delete")} - Delete a scheduled job ${colors.bold("USAGE:")} - forge-cli scheduled-jobs delete --server [options] + forge scheduled-jobs delete --server [options] `); } else { console.log(` -${colors.bold("forge-cli scheduled-jobs")} - Manage scheduled jobs (cron) +${colors.bold("forge scheduled-jobs")} - Manage scheduled jobs (cron) ${colors.bold("USAGE:")} - forge-cli scheduled-jobs [options] + forge scheduled-jobs [options] ${colors.bold("SUBCOMMANDS:")} list, ls List scheduled jobs @@ -55,7 +55,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli scheduled-jobs --help")} for details. +Run ${colors.cyan("forge scheduled-jobs --help")} for details. `); } } diff --git a/packages/cli/src/commands/security-rules/handlers.ts b/packages/cli/src/commands/security-rules/handlers.ts index 2118269..b18f313 100644 --- a/packages/cli/src/commands/security-rules/handlers.ts +++ b/packages/cli/src/commands/security-rules/handlers.ts @@ -28,7 +28,7 @@ function requireServerAndSiteRaw( } export async function securityRulesList(ctx: CommandContext): Promise { - const usage = "forge-cli security-rules list --server --site "; + const usage = "forge security-rules list --server --site "; const { server, site } = requireServerAndSiteRaw(ctx, usage); await runCommand(async () => { @@ -48,7 +48,7 @@ export async function securityRulesList(ctx: CommandContext): Promise { export async function securityRulesGet(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli security-rules get --server --site "; + const usage = "forge security-rules get --server --site "; if (!id) { exitWithValidationError("rule_id", usage, ctx.formatter); @@ -67,8 +67,7 @@ export async function securityRulesGet(args: string[], ctx: CommandContext): Pro } export async function securityRulesCreate(ctx: CommandContext): Promise { - const usage = - "forge-cli security-rules create --server --site --name "; + const usage = "forge security-rules create --server --site --name "; const { server, site } = requireServerAndSiteRaw(ctx, usage); const name = String(ctx.options.name ?? ""); @@ -88,7 +87,7 @@ export async function securityRulesCreate(ctx: CommandContext): Promise { export async function securityRulesDelete(args: string[], ctx: CommandContext): Promise { const [id] = args; - const usage = "forge-cli security-rules delete --server --site "; + const usage = "forge security-rules delete --server --site "; if (!id) { exitWithValidationError("rule_id", usage, ctx.formatter); diff --git a/packages/cli/src/commands/security-rules/help.ts b/packages/cli/src/commands/security-rules/help.ts index e034482..f1eace7 100644 --- a/packages/cli/src/commands/security-rules/help.ts +++ b/packages/cli/src/commands/security-rules/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showSecurityRulesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli security-rules list")} - List security rules for a site +${colors.bold("forge security-rules list")} - List security rules for a site ${colors.bold("USAGE:")} - forge-cli security-rules list --server --site [options] + forge security-rules list --server --site [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -15,17 +15,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli security-rules get")} - Get security rule details +${colors.bold("forge security-rules get")} - Get security rule details ${colors.bold("USAGE:")} - forge-cli security-rules get --server --site [options] + forge security-rules get --server --site [options] `); } else if (subcommand === "create") { console.log(` -${colors.bold("forge-cli security-rules create")} - Create a new security rule +${colors.bold("forge security-rules create")} - Create a new security rule ${colors.bold("USAGE:")} - forge-cli security-rules create --server --site --name [options] + forge security-rules create --server --site --name [options] ${colors.bold("OPTIONS:")} --server Server ID (required) @@ -35,17 +35,17 @@ ${colors.bold("OPTIONS:")} `); } else if (subcommand === "delete") { console.log(` -${colors.bold("forge-cli security-rules delete")} - Delete a security rule +${colors.bold("forge security-rules delete")} - Delete a security rule ${colors.bold("USAGE:")} - forge-cli security-rules delete --server --site [options] + forge security-rules delete --server --site [options] `); } else { console.log(` -${colors.bold("forge-cli security-rules")} - Manage site security rules +${colors.bold("forge security-rules")} - Manage site security rules ${colors.bold("USAGE:")} - forge-cli security-rules [options] + forge security-rules [options] ${colors.bold("SUBCOMMANDS:")} list, ls List security rules @@ -58,7 +58,7 @@ ${colors.bold("OPTIONS:")} --site Site ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli security-rules --help")} for details. +Run ${colors.cyan("forge security-rules --help")} for details. `); } } diff --git a/packages/cli/src/commands/servers/handlers.ts b/packages/cli/src/commands/servers/handlers.ts index 62e65a3..de8e38c 100644 --- a/packages/cli/src/commands/servers/handlers.ts +++ b/packages/cli/src/commands/servers/handlers.ts @@ -44,7 +44,7 @@ export async function serversGet(args: string[], ctx: CommandContext): Promise", ctx.formatter); + exitWithValidationError("server_id", "forge servers get ", ctx.formatter); } await runCommand(async () => { @@ -63,7 +63,7 @@ export async function serversReboot(args: string[], ctx: CommandContext): Promis const [server] = args; if (!server) { - exitWithValidationError("server_id", "forge-cli servers reboot ", ctx.formatter); + exitWithValidationError("server_id", "forge servers reboot ", ctx.formatter); } await runCommand(async () => { diff --git a/packages/cli/src/commands/servers/help.test.ts b/packages/cli/src/commands/servers/help.test.ts index efdbd5a..f297bac 100644 --- a/packages/cli/src/commands/servers/help.test.ts +++ b/packages/cli/src/commands/servers/help.test.ts @@ -15,7 +15,7 @@ describe("showServersHelp", () => { it("should show general help when no subcommand", () => { showServersHelp(); - expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge-cli servers")); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge servers")); expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("list")); }); diff --git a/packages/cli/src/commands/servers/help.ts b/packages/cli/src/commands/servers/help.ts index ec5ac6c..6db2475 100644 --- a/packages/cli/src/commands/servers/help.ts +++ b/packages/cli/src/commands/servers/help.ts @@ -3,10 +3,10 @@ import { colors } from "../../utils/colors.ts"; export function showServersHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli servers list")} - List all servers +${colors.bold("forge servers list")} - List all servers ${colors.bold("USAGE:")} - forge-cli servers list [options] + forge servers list [options] ${colors.bold("OPTIONS:")} --token Forge API token @@ -15,15 +15,15 @@ ${colors.bold("OPTIONS:")} -h, --help Show this help ${colors.bold("EXAMPLES:")} - forge-cli servers list - forge-cli servers list --format json + forge servers list + forge servers list --format json `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli servers get")} - Get server details +${colors.bold("forge servers get")} - Get server details ${colors.bold("USAGE:")} - forge-cli servers get [options] + forge servers get [options] ${colors.bold("ARGUMENTS:")} Server ID (required) @@ -32,31 +32,31 @@ ${colors.bold("OPTIONS:")} -f, --format Output format: json, human, table ${colors.bold("EXAMPLES:")} - forge-cli servers get 123 - forge-cli servers get 123 --format json + forge servers get 123 + forge servers get 123 --format json `); } else if (subcommand === "reboot") { console.log(` -${colors.bold("forge-cli servers reboot")} - Reboot a server +${colors.bold("forge servers reboot")} - Reboot a server ${colors.bold("USAGE:")} - forge-cli servers reboot [options] + forge servers reboot [options] ${colors.bold("ARGUMENTS:")} Server ID (required) ${colors.bold("EXAMPLES:")} - forge-cli servers reboot 123 + forge servers reboot 123 `); } else { console.log(` -${colors.bold("forge-cli servers")} - Manage servers +${colors.bold("forge servers")} - Manage servers ${colors.bold("USAGE:")} - forge-cli servers [options] + forge servers [options] ${colors.bold("ALIASES:")} - forge-cli s + forge s ${colors.bold("SUBCOMMANDS:")} list, ls List all servers @@ -68,10 +68,10 @@ ${colors.bold("OPTIONS:")} -h, --help Show help for a subcommand ${colors.bold("EXAMPLES:")} - forge-cli servers list - forge-cli servers get 123 + forge servers list + forge servers get 123 -Run ${colors.cyan("forge-cli servers --help")} for subcommand details. +Run ${colors.cyan("forge servers --help")} for subcommand details. `); } } diff --git a/packages/cli/src/commands/sites/handlers.ts b/packages/cli/src/commands/sites/handlers.ts index 630adf3..d78a2b4 100644 --- a/packages/cli/src/commands/sites/handlers.ts +++ b/packages/cli/src/commands/sites/handlers.ts @@ -9,11 +9,7 @@ export async function sitesList(ctx: CommandContext): Promise { const server = String(ctx.options.server ?? ""); if (!server) { - exitWithValidationError( - "server_id", - "forge-cli sites list --server ", - ctx.formatter, - ); + exitWithValidationError("server_id", "forge sites list --server ", ctx.formatter); } await runCommand(async () => { @@ -38,7 +34,7 @@ export async function sitesGet(args: string[], ctx: CommandContext): Promise --server ", + "forge sites get --server ", ctx.formatter, ); } @@ -46,7 +42,7 @@ export async function sitesGet(args: string[], ctx: CommandContext): Promise --server ", + "forge sites get --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/sites/help.test.ts b/packages/cli/src/commands/sites/help.test.ts index db54229..e559467 100644 --- a/packages/cli/src/commands/sites/help.test.ts +++ b/packages/cli/src/commands/sites/help.test.ts @@ -15,7 +15,7 @@ describe("showSitesHelp", () => { it("should show general help when no subcommand", () => { showSitesHelp(); - expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge-cli sites")); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("forge sites")); }); it("should show list help", () => { diff --git a/packages/cli/src/commands/sites/help.ts b/packages/cli/src/commands/sites/help.ts index 250c725..f9d7c34 100644 --- a/packages/cli/src/commands/sites/help.ts +++ b/packages/cli/src/commands/sites/help.ts @@ -3,25 +3,25 @@ import { colors } from "../../utils/colors.ts"; export function showSitesHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli sites list")} - List sites on a server +${colors.bold("forge sites list")} - List sites on a server ${colors.bold("USAGE:")} - forge-cli sites list --server [options] + forge sites list --server [options] ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table ${colors.bold("EXAMPLES:")} - forge-cli sites list --server 123 - forge-cli sites list --server 123 --format json + forge sites list --server 123 + forge sites list --server 123 --format json `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli sites get")} - Get site details +${colors.bold("forge sites get")} - Get site details ${colors.bold("USAGE:")} - forge-cli sites get --server [options] + forge sites get --server [options] ${colors.bold("ARGUMENTS:")} Site ID (required) @@ -32,10 +32,10 @@ ${colors.bold("OPTIONS:")} `); } else { console.log(` -${colors.bold("forge-cli sites")} - Manage sites +${colors.bold("forge sites")} - Manage sites ${colors.bold("USAGE:")} - forge-cli sites [options] + forge sites [options] ${colors.bold("SUBCOMMANDS:")} list, ls List sites on a server @@ -47,10 +47,10 @@ ${colors.bold("OPTIONS:")} -h, --help Show help for a subcommand ${colors.bold("EXAMPLES:")} - forge-cli sites list --server 123 - forge-cli sites get 456 --server 123 + forge sites list --server 123 + forge sites get 456 --server 123 -Run ${colors.cyan("forge-cli sites --help")} for subcommand details. +Run ${colors.cyan("forge sites --help")} for subcommand details. `); } } diff --git a/packages/cli/src/commands/ssh-keys/handlers.ts b/packages/cli/src/commands/ssh-keys/handlers.ts index 7144aab..4d32eda 100644 --- a/packages/cli/src/commands/ssh-keys/handlers.ts +++ b/packages/cli/src/commands/ssh-keys/handlers.ts @@ -9,11 +9,7 @@ export async function sshKeysList(ctx: CommandContext): Promise { const server = String(ctx.options.server ?? ""); if (!server) { - exitWithValidationError( - "server_id", - "forge-cli ssh-keys list --server ", - ctx.formatter, - ); + exitWithValidationError("server_id", "forge ssh-keys list --server ", ctx.formatter); } await runCommand(async () => { @@ -37,7 +33,7 @@ export async function sshKeysGet(args: string[], ctx: CommandContext): Promise --server ", + "forge ssh-keys get --server ", ctx.formatter, ); } @@ -45,7 +41,7 @@ export async function sshKeysGet(args: string[], ctx: CommandContext): Promise --server ", + "forge ssh-keys get --server ", ctx.formatter, ); } diff --git a/packages/cli/src/commands/ssh-keys/help.ts b/packages/cli/src/commands/ssh-keys/help.ts index b923932..d13c2cb 100644 --- a/packages/cli/src/commands/ssh-keys/help.ts +++ b/packages/cli/src/commands/ssh-keys/help.ts @@ -3,24 +3,24 @@ import { colors } from "../../utils/colors.ts"; export function showSshKeysHelp(subcommand?: string): void { if (subcommand === "list" || subcommand === "ls") { console.log(` -${colors.bold("forge-cli ssh-keys list")} - List SSH keys on a server +${colors.bold("forge ssh-keys list")} - List SSH keys on a server ${colors.bold("USAGE:")} - forge-cli ssh-keys list --server [options] + forge ssh-keys list --server [options] `); } else if (subcommand === "get") { console.log(` -${colors.bold("forge-cli ssh-keys get")} - Get SSH key details +${colors.bold("forge ssh-keys get")} - Get SSH key details ${colors.bold("USAGE:")} - forge-cli ssh-keys get --server + forge ssh-keys get --server `); } else { console.log(` -${colors.bold("forge-cli ssh-keys")} - Manage SSH keys +${colors.bold("forge ssh-keys")} - Manage SSH keys ${colors.bold("USAGE:")} - forge-cli ssh-keys [options] + forge ssh-keys [options] ${colors.bold("SUBCOMMANDS:")} list, ls List SSH keys @@ -30,7 +30,7 @@ ${colors.bold("OPTIONS:")} --server Server ID (required) -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli ssh-keys --help")} for details. +Run ${colors.cyan("forge ssh-keys --help")} for details. `); } } diff --git a/packages/cli/src/commands/user/help.ts b/packages/cli/src/commands/user/help.ts index 52606a9..9e44f1f 100644 --- a/packages/cli/src/commands/user/help.ts +++ b/packages/cli/src/commands/user/help.ts @@ -3,20 +3,20 @@ import { colors } from "../../utils/colors.ts"; export function showUserHelp(subcommand?: string): void { if (subcommand === "get") { console.log(` -${colors.bold("forge-cli user get")} - Get the authenticated user profile +${colors.bold("forge user get")} - Get the authenticated user profile ${colors.bold("USAGE:")} - forge-cli user get [options] + forge user get [options] ${colors.bold("OPTIONS:")} -f, --format Output format: json, human, table `); } else { console.log(` -${colors.bold("forge-cli user")} - Display authenticated user profile +${colors.bold("forge user")} - Display authenticated user profile ${colors.bold("USAGE:")} - forge-cli user [subcommand] [options] + forge user [subcommand] [options] ${colors.bold("SUBCOMMANDS:")} get Get the authenticated user profile @@ -24,7 +24,7 @@ ${colors.bold("SUBCOMMANDS:")} ${colors.bold("OPTIONS:")} -f, --format Output format: json, human, table -Run ${colors.cyan("forge-cli user --help")} for details. +Run ${colors.cyan("forge user --help")} for details. `); } } diff --git a/packages/cli/src/config.ts b/packages/cli/src/config.ts index 6dbfba0..3a851af 100644 --- a/packages/cli/src/config.ts +++ b/packages/cli/src/config.ts @@ -1,5 +1,5 @@ /** - * Config loading for forge-cli. + * Config loading for forge. * * Resolution priority (highest to lowest): * 1. CLI arguments (--token) diff --git a/packages/cli/src/error-handler.test.ts b/packages/cli/src/error-handler.test.ts index 1490301..793ddc5 100644 --- a/packages/cli/src/error-handler.test.ts +++ b/packages/cli/src/error-handler.test.ts @@ -134,7 +134,7 @@ describe("exitWithValidationError", () => { it("should call process.exit with VALIDATION_ERROR code", () => { const formatter = new OutputFormatter("human", true); try { - exitWithValidationError("server_id", "forge-cli servers get ", formatter); + exitWithValidationError("server_id", "forge servers get ", formatter); } catch { // process.exit is mocked so exitWithValidationError throws } diff --git a/packages/cli/src/error-handler.ts b/packages/cli/src/error-handler.ts index 9b6e7eb..f6169cb 100644 --- a/packages/cli/src/error-handler.ts +++ b/packages/cli/src/error-handler.ts @@ -1,5 +1,5 @@ /** - * Centralized error handling for forge-cli. + * Centralized error handling for forge. */ import type { OutputFormatter } from "./output.ts"; diff --git a/packages/cli/src/errors.test.ts b/packages/cli/src/errors.test.ts index dfc3f96..7946fcc 100644 --- a/packages/cli/src/errors.test.ts +++ b/packages/cli/src/errors.test.ts @@ -59,10 +59,10 @@ describe("ValidationError", () => { }); it("should include field in JSON", () => { - const err = ValidationError.required("site_id", ["Usage: forge-cli sites get "]); + const err = ValidationError.required("site_id", ["Usage: forge sites get "]); const json = err.toJSON(); expect(json.field).toBe("site_id"); - expect(json.hints).toContain("Usage: forge-cli sites get "); + expect(json.hints).toContain("Usage: forge sites get "); }); it("should create without hints", () => { diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index c3c0d14..445aeb7 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -1,5 +1,5 @@ /** - * Error types for forge-cli. + * Error types for forge. * * Provides specific error types for different failure scenarios with * recovery hints for both humans and AI agents. @@ -53,7 +53,7 @@ export class ConfigError extends CliError { return new ConfigError("API token not configured", [ "Set via CLI flag: --token ", "Set via environment: export FORGE_API_TOKEN=", - "Set via config: forge-cli config set YOUR_TOKEN", + "Set via config: forge config set YOUR_TOKEN", ]); } } diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index ed7f7eb..fbf21d5 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -1,4 +1,4 @@ -// CLI-specific types for forge-cli +// CLI-specific types for forge export type OutputFormat = "json" | "human" | "table";