con un clic
create-component
// Create a new Fx component using the modern def/fx/impl pattern (NOT legacy)
// Create a new Fx component using the modern def/fx/impl pattern (NOT legacy)
Generate the Agent Supply Chain newsletter by researching team activity on GitHub and Confluence, then creating a Confluence draft and Gmail draft
Explains a lading.yaml config file from the regression test suite, using the lading Rust source as ground truth for field meanings and defaults.
Review and triage PR review comments on the current branch — groups threads by file, separates bots from humans, walks through unresolved comments interactively
Give your AI agents something more useful than a prompt. Velocity through clarity.
Create a pull request for the current branch with proper labels and description
Add a new configuration field to the Datadog Agent (datadog.yaml)
| name | create-component |
| description | Create a new Fx component using the modern def/fx/impl pattern (NOT legacy) |
| allowed-tools | Bash, Read, Write, Edit, Glob, Grep |
| argument-hint | <bundle>/<component-name> [--team team-name] [--with-params] [--with-lifecycle] [--with-mock] |
Create a new Fx component following the modern (new-style) pattern with separate def/, fx/, and impl/ sub-packages.
IMPORTANT: NEVER use the legacy pattern (single-directory with fx.Provide directly). Always use the new-style pattern described below.
Parse $ARGUMENTS to determine:
<bundle>/<component-name>: e.g., core/remoteflags means bundle=core, component=remoteflags--team <team-name>: optional team ownership tag (default: ask the user)--with-params: include a Params struct in the def package--with-lifecycle: include compdef.Lifecycle in the Requires struct--with-mock: also generate a mock/ sub-packageAsk the user (if not provided via arguments):
// team: comment)Read reference examples before writing any code. Find a recent component under comp/ using the def/fx/impl pattern (e.g. comp/core/remoteagentregistry/). Read:
def/component.go — interface definition with // team: commentfx/fx.go — Module() with fxutil.ProvideComponentConstructorimpl/<name>.go — Requires/Provides structs, NewComponent constructorCreate the directory structure under comp/<bundle>/<component>/:
comp/<bundle>/<component>/
├── def/
│ ├── go.mod
│ ├── component.go # Interface definition + team tag
│ └── params.go # (optional) Params struct
├── fx/
│ ├── go.mod
│ └── fx.go # Module() function
└── impl/
├── go.mod
└── <component>.go # Requires, Provides, NewComponent()
Create each file following the patterns from the reference. Key rules:
def/component.go: Package name = component name, include // team: comment, only interfacesfx/fx.go: Use fxutil.ProvideComponentConstructor (NEVER raw fx.Provide), returns fxutil.Moduleimpl/<component>.go: Plain Go constructor func NewComponent(deps Requires) (Provides, error), no fx.In/fx.Out/compdef.In/compdef.Out embedding in Requires/Provides, unexported implementation typego.mod files: Use v0.0.0 for inter-module dependencies, match Go version from root go.modRegister the modules in modules.yml — add entries for def, fx, and impl (use default or used_by_otel: true).
Run dda inv create-module --path=comp/<bundle>/<component>/def (and for fx, impl) or manually add to modules.yml and run dda inv tidy.
Wire into a bundle if appropriate — add the component's Module() to the relevant comp/<bundle>/bundle.go.
Validate:
dda inv lint-components lint-fxutil-oneshot-test github.lint-codeowner
Fix any errors and re-run until clean.
DO: def/fx/impl sub-packages, fxutil.ProvideComponentConstructor, plain Go constructor, plain Requires/Provides structs, thin def package.
DON'T: Single directory, fx.Provide(newComponent), fx.In/fx.Out embedding, implementation in def package.
/create-component core/myfeature --team agent-runtimes --with-lifecycle/create-component metadata/hostinfo --team agent-metrics --with-params