원클릭으로
best-practices
// Audit existing code against project conventions and Angular 21+ best practices
// Audit existing code against project conventions and Angular 21+ best practices
Audit a component for WCAG AA accessibility compliance
Adopt breaking changes from fundamental-styles into Angular components
Build a reactive form with @fundamental-ngx/platform form components, FormGroup wiring, validation, and error states
Build a page layout using fd-dynamic-page or fdp-dynamic-page — collapsing header, subheader, content area, footer, and optional tabs
Build a @fundamental-ngx/platform data table with FdpTableDataSource, sorting, filtering, pagination, and row selection
Generate or update unit tests for a component following project testing conventions
| name | best-practices |
| description | Audit existing code against project conventions and Angular 21+ best practices |
| argument-hint | ["component-path-or-folder"] |
| context | fork |
| agent | general-purpose |
| allowed-tools | Read, Grep, Glob, Bash(nx *), Bash(wc *) |
If $ARGUMENTS is empty, ask the user for a component path or folder before proceeding.
Audit the code at $ARGUMENTS against the project's conventions. Unlike /review-pr which checks diffs, this audits existing code as-is.
input() / output() / model() / linkedSignal(). Existing @Input() / @Output() decorators are acceptable.host: {} in decorator — no @HostBinding() / @HostListener()@if / @for / @switch — no *ngIf / *ngFor / *ngSwitchstandalone: true (default since Angular 19)allowSignalWrites option in effect() (the option no longer exists)DestroyRef + takeUntilDestroyed() — no custom DestroyedServicecomputed() + host: { '[class]': } — no CssClassBuilder / @applyCssClassngClass / ngStyle (use direct bindings)signal() only when reactive consumer existsmarkForCheck() after signal updatesBehaviorSubject only for async streams, not local stateeffect() for signal side effects — no Subject<void> for trigger-only patternseffect() used for state derivation — use computed() or linkedSignal insteadlinkedSignal used for mutable derived state (e.g., editable fields that reset on input change)signal.set() with same reference — always create new referenceseffect() / computed() — tracked signals read before conditional logicInjectionToken for contextual defaults — not @ContentChild assigning to signal inputs{ optional: true }FD_ prefix for component identity tokensChangeDetectionStrategy.OnPushfd- selector prefixcomputed() not inlineconsole.log / console.warn (except intentional deprecation warnings)any types (use proper generics or unknown)fixture.componentRef.setInput() for signal inputs*Module classes<h2 fd-title> not <fd-title>)<fd-card> not <div fd-card>)fdLayoutGridCol directive value used for small breakpoint (there is no colSm — the default/small breakpoint is set via the fdLayoutGridCol input itself)[fd-card-title], [fd-card-subtitle] are attribute directives before using them as elements## Best Practices Audit: [component name]
**Overall Score:** X / 8 sections passing
### Section Scores
| Section | Status | Issues |
|--------------------|--------|--------|
| Angular Patterns | PASS | 0 |
| State Management | WARN | 2 |
| DI Patterns | PASS | 0 |
| Component Structure| FAIL | 3 |
| Code Quality | PASS | 0 |
| Testing | WARN | 1 |
| Documentation | FAIL | 2 |
| Selector Usage | PASS | 0 |
### Findings (by severity)
**Blocking**
- [file:line] Issue — convention reference
**Suggestions**
- [file:line] Issue — convention reference
**Nits**
- [file:line] Issue — convention reference
### Migration Items
Items that require `/migrate` to fix:
- [file] 5 @Input decorators → input()
- [file] 3 *ngIf → @if