CLI Extensions

SkillCloud & infra

Helps your agent write custom Webiny CLI commands like migration scripts, code generators, and deployment tasks.

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the CLI Extensions skill

About this skill

Adding custom commands to the Webiny CLI using CliCommandFactory. Use this skill when the developer wants to create a custom CLI command, add a data migration script, build a code generator, create deployment scripts, export CMS content, or add health check commands. Covers CliCommandFactory.Interfa

What this skill tells your AI

The instructions your AI receives, as published by webiny/webiny-js in skills/user-skills/cli-extensions/SKILL.md and read by ahel’s review.

TL;DR

Add custom commands to the Webiny CLI using the CliCommandFactory pattern. Define a class implementing CliCommandFactory.Interface<TParams>, specify command name, description, params, and handler, then export with CliCommandFactory.createImplementation(). Register in webiny.config.tsx via <Cli.Command>.

The CliCommandFactory Pattern

// extensions/MyCustomCommand.ts
import { Ui } from "webiny/cli";
import { CliCommandFactory } from "webiny/cli/command";

export interface IMyCustomCommandParams {
  name: string;
}

class MyCustomCommandImpl implements CliCommandFactory.Interface<IMyCustomCommandParams> {
  constructor(private ui: Ui.Interface) {}

  execute(): CliCommandFactory.CommandDefinition<IMyCustomCommandParams> {
    return {
      name: "my-custom-command",
      description: "This is my custom command",
      examples: ["$0 my-custom-command test1", "$0 my-custom-command test2"],
      params: [
        {
          name: "name",
          description: "Your name",
          type: "string"
        }
      ],
      handler: async params => {
        this.ui.info("Starting my custom command...");
        this.ui.emptyLine();
        this.ui.success(`Hello, ${params.name}! This is my custom command.`);
      }
    };
  }
}

export default CliCommandFactory.createImplementation({
  implementation: MyCustomCommandImpl,
  dependencies: [Ui]
});

Register in webiny.config.tsx (YOU MUST include the .ts file extension in the src prop — omitting it will cause a build failure):

<Cli.Command src={"/extensions/MyCustomCommand.ts"} />

Run it:

yarn webiny my-custom-command "World"

Command Definition Properties

PropertyTypeDescription
namestringThe command name used on the CLI (e.g., "my-custom-command")
descriptionstringHelp text shown when listing commands
examplesstring[]Usage examples ($0 is replaced with the CLI binary name)
paramsParamDefinition[]Positional parameters and options
handler(params: TParams) => Promise<void>The function that executes the command

Parameter Definition

Each param in the params array:

PropertyTypeDescription
namestringParameter name (matches the key in your TParams interface)
descriptionstringHelp text for this parameter
type"string" | "number" | "boolean"Parameter value type

The Ui Service

Inject Ui for formatted terminal output:

import { Ui } from "webiny/cli";
MethodDescription
this.ui.info("message")Print an info message (blue)
this.ui.success("message")Print a success message (green)
this.ui.warning("message")Print a warning message (yellow)
this.ui.error("message")Print an error message (red)
this.ui.emptyLine()Print a blank line for spacing

Use Cases

  • Data migrations -- Scripts to migrate or seed CMS data
  • Code generators -- Generate boilerplate extension files
  • Deployment scripts -- Custom deployment workflows
  • Data exports -- Export CMS content to files
  • Health checks -- Verify infrastructure or API status

Quick Reference

Import:          import { CliCommandFactory } from "webiny/cli/command";
Ui import:       import { Ui } from "webiny/cli";
Interface:       CliCommandFactory.Interface<TParams>
Definition:      CliCommandFactory.CommandDefinition<TParams>
Export:          CliCommandFactory.createImplementation({ implementation, dependencies })
Register:        <Cli.Command src={"/extensions/MyCommand.ts"} />
Run:             yarn webiny <command-name> [args]

Related Skills

  • webiny-dependency-injection -- The createImplementation pattern and available injectable services
  • webiny-project-structure -- How to register CLI commands in webiny.config.tsx
  • webiny-full-stack-architect -- Full-stack extensions that may include CLI commands alongside API and Admin

Signals

GitHub stars
8k
Forks
679
Last commit
Sep 2026
Advanced
Item type
skill
Key
webiny-cli-extensions
Source
github.com/webiny/webiny-js