---
name: create-plugin
description: Scaffold a new datadog-ci plugin end-to-end using repository conventions.
---

# Create Plugin

Scaffold a new datadog-ci plugin end-to-end. Walk the user through each step, confirming the scope name and whether the plugin should be built-in or separately installable.

## Workflow

1. **Ask** for the scope name (kebab-case) and whether this is a built-in or separately installable plugin.

2. **Run `yarn plugin:create <scope>`** to scaffold `packages/plugin-<scope>/`.

3. **Create the base command** in `packages/base/src/commands/<scope>/<command>.ts`:
   - Extend `BaseCommand` from `@datadog/datadog-ci-base`
   - Use `Command.Usage()` for description
   - Use `Option.*` from clipanion for arguments/flags
   - `execute()` should call `return executePluginCommand(this)`
   - Export the command class

4. **Create `packages/base/src/commands/<scope>/cli.ts`** exporting a `commands` array containing the command class.

5. **Create the plugin implementation** in `packages/plugin-<scope>/src/commands/<command>.ts`:
   - Import and extend the base command
   - Implement the actual `execute()` logic
   - Return `0` for success

6. **Update project files** per the CONTRIBUTING.md checklist:
   - Add to `.github/CODEOWNERS` under the correct product
   - Add scope to the Usage section in root `README.md`
   - If new product: create a GitHub label, update `pr-required-labels.yml`, `advanced-issue-labeler.yml`, and `release.yml` changelog config

## Notes

- The commands map in `packages/base/src/cli.ts` is auto-generated by `bin/lint-packages.ts` -- do not edit it manually. Run `yarn lint:packages` to verify.
- Use `getRequestBuilder()` or `httpRequest()` from base helpers for HTTP, not raw fetch or axios.
