Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<T>`, `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

Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
94 changes: 47 additions & 47 deletions packages/cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand All @@ -37,7 +37,7 @@ forge-cli config delete
## Commands

```
forge-cli <command> [subcommand] [options]
forge <command> [subcommand] [options]
```

| Command | Alias | Description |
Expand Down Expand Up @@ -65,25 +65,25 @@ forge-cli <command> [subcommand] [options]
| `user` | | Get the authenticated user's profile |
| `completion` | | Install shell completion (bash, zsh, fish) |

Run `forge-cli <command> --help` for detailed usage of each command.
Run `forge <command> --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
Expand All @@ -97,110 +97,110 @@ 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

### `config` — Manage configuration

```bash
forge-cli config set <token> # Save API token to config file
forge-cli config get # Show current token (masked)
forge-cli config delete # Delete stored token
forge config set <token> # 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 <id> # Get server details
forge-cli servers reboot <id> # Reboot a server
forge servers list # List all servers
forge servers get <id> # Get server details
forge servers reboot <id> # Reboot a server
```

### `sites` — Manage sites

```bash
forge-cli sites list --server <id> # List sites on a server
forge-cli sites get <site_id> --server <id> # Get site details
forge sites list --server <id> # List sites on a server
forge sites get <site_id> --server <id> # Get site details
```

### `deployments` (`d`) — Manage deployments

```bash
forge-cli deployments list --server <id> --site <id> # List deployments
forge-cli deployments deploy --server <id> --site <id> # Trigger a deployment
forge deployments list --server <id> --site <id> # List deployments
forge deployments deploy --server <id> --site <id> # Trigger a deployment
```

The `deploy` command waits for deployment to complete, showing live progress. On completion it prints the deployment log and elapsed time.

### `databases` (`db`) — Manage databases

```bash
forge-cli databases list --server <id> # List databases
forge-cli databases get <db_id> --server <id> # Get database details
forge databases list --server <id> # List databases
forge databases get <db_id> --server <id> # Get database details
```

### `daemons` — Manage background processes

```bash
forge-cli daemons list --server <id> # List daemons
forge-cli daemons get <daemon_id> --server <id> # Get daemon details
forge-cli daemons restart <daemon_id> --server <id> # Restart a daemon
forge daemons list --server <id> # List daemons
forge daemons get <daemon_id> --server <id> # Get daemon details
forge daemons restart <daemon_id> --server <id> # Restart a daemon
```

### `env` — Manage environment variables

```bash
forge-cli env get --server <id> --site <id> # Get .env content
forge-cli env update --server <id> --site <id> --content "KEY=value" # Update .env
forge env get --server <id> --site <id> # Get .env content
forge env update --server <id> --site <id> --content "KEY=value" # Update .env
```

### `nginx` — Manage Nginx configuration

```bash
forge-cli nginx get --server <id> --site <id> # Get Nginx config
forge-cli nginx update --server <id> --site <id> --content "server { ... }" # Update Nginx config
forge nginx get --server <id> --site <id> # Get Nginx config
forge nginx update --server <id> --site <id> --content "server { ... }" # Update Nginx config
```

### `certificates` (`certs`) — Manage SSL certificates

```bash
forge-cli certificates list --server <id> --site <id> # List certificates
forge-cli certificates get <cert_id> --server <id> --site <id> # Get certificate details
forge-cli certificates activate <cert_id> --server <id> --site <id> # Activate a certificate
forge certificates list --server <id> --site <id> # List certificates
forge certificates get <cert_id> --server <id> --site <id> # Get certificate details
forge certificates activate <cert_id> --server <id> --site <id> # Activate a certificate
```

### `firewall-rules` (`fw`) — Manage firewall rules

```bash
forge-cli firewall-rules list --server <id> # List firewall rules
forge-cli firewall-rules get <rule_id> --server <id> # Get rule details
forge firewall-rules list --server <id> # List firewall rules
forge firewall-rules get <rule_id> --server <id> # Get rule details
```

### `ssh-keys` — Manage SSH keys

```bash
forge-cli ssh-keys list --server <id> # List SSH keys
forge-cli ssh-keys get <key_id> --server <id> # Get SSH key details
forge ssh-keys list --server <id> # List SSH keys
forge ssh-keys get <key_id> --server <id> # Get SSH key details
```

### `recipes` — Manage recipes

```bash
forge-cli recipes list # List all recipes
forge-cli recipes get <id> # Get recipe details
forge-cli recipes run <id> --servers 123,456 # Run recipe on servers
forge recipes list # List all recipes
forge recipes get <id> # Get recipe details
forge recipes run <id> --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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"directory": "packages/cli"
},
"bin": {
"forge-cli": "./dist/cli.js"
"forge": "./dist/cli.js"
},
"files": [
"dist"
Expand Down
18 changes: 9 additions & 9 deletions packages/cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 <command> [subcommand] [options]
forge <command> [subcommand] [options]

${colors.bold("COMMANDS:")}
config Manage CLI configuration
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -497,7 +497,7 @@ async function main(): Promise<void> {

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) {
Expand Down
20 changes: 8 additions & 12 deletions packages/cli/src/commands/backups/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ export async function backupsList(ctx: CommandContext): Promise<void> {
const server = String(ctx.options.server ?? "");

if (!server) {
exitWithValidationError(
"server_id",
"forge-cli backups list --server <server_id>",
ctx.formatter,
);
exitWithValidationError("server_id", "forge backups list --server <server_id>", ctx.formatter);
}

await runCommand(async () => {
Expand All @@ -43,15 +39,15 @@ export async function backupsGet(args: string[], ctx: CommandContext): Promise<v
if (!id) {
exitWithValidationError(
"backup_id",
"forge-cli backups get <backup_id> --server <server_id>",
"forge backups get <backup_id> --server <server_id>",
ctx.formatter,
);
}

if (!server) {
exitWithValidationError(
"server_id",
"forge-cli backups get <backup_id> --server <server_id>",
"forge backups get <backup_id> --server <server_id>",
ctx.formatter,
);
}
Expand Down Expand Up @@ -87,23 +83,23 @@ export async function backupsCreate(ctx: CommandContext): Promise<void> {
if (!server) {
exitWithValidationError(
"server_id",
"forge-cli backups create --server <server_id> --provider <provider> --frequency <frequency>",
"forge backups create --server <server_id> --provider <provider> --frequency <frequency>",
ctx.formatter,
);
}

if (!provider) {
exitWithValidationError(
"provider",
"forge-cli backups create --server <server_id> --provider <provider> --frequency <frequency>",
"forge backups create --server <server_id> --provider <provider> --frequency <frequency>",
ctx.formatter,
);
}

if (!frequency) {
exitWithValidationError(
"frequency",
"forge-cli backups create --server <server_id> --provider <provider> --frequency <frequency>",
"forge backups create --server <server_id> --provider <provider> --frequency <frequency>",
ctx.formatter,
);
}
Expand Down Expand Up @@ -134,15 +130,15 @@ export async function backupsDelete(args: string[], ctx: CommandContext): Promis
if (!id) {
exitWithValidationError(
"backup_id",
"forge-cli backups delete <backup_id> --server <server_id>",
"forge backups delete <backup_id> --server <server_id>",
ctx.formatter,
);
}

if (!server) {
exitWithValidationError(
"server_id",
"forge-cli backups delete <backup_id> --server <server_id>",
"forge backups delete <backup_id> --server <server_id>",
ctx.formatter,
);
}
Expand Down
Loading