skills/angular-frontend-clean-architecture/SKILL.md
Angular 21 standalone frontend with Clean Architecture, vertical slice (pages by feature), signals, OnPush, and ng-zorro. Use when creating or refactoring Angular apps, adding pages, components, services, directives, pipes, or when the user mentions Angular frontend, standalone components, or signals.
npx skillsauth add luismpenholato/maurao-skills angular-frontend-clean-architectureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guide for creating and maintaining Angular frontends with features structure (vertical slice), standalone components, signals, and ng-zorro-antd.
pages/ with listing, form, service, models).shared/components/, directive in shared/directives/, pipe in shared/pipes/.app.routes.ts.| Technology | Usage |
|---|---|
| Angular 21 | Standalone, signals, @if / @for |
| ng-zorro-antd 21 | UI (tables, forms, layout) |
| RxJS 7 | HTTP and streams |
| TypeScript 5.9 | Typing |
| Vitest 4 | Tests via ng test |
src/
├── app/
│ ├── app.ts # Root (layout + overlays)
│ ├── app.config.ts # provideRouter, provideHttpClient, …
│ ├── app.routes.ts # Routes and guards
│ ├── layout/
│ │ └── main-layout/
│ ├── pages/ # Features (vertical slice)
│ │ └── products/
│ │ ├── product.model.ts
│ │ ├── product.service.ts
│ │ ├── products-list/
│ │ └── product-form/
│ └── shared/
│ ├── components/ # page-header, loading, …
│ ├── directives/ # autofocus, currency-mask, …
│ ├── guards/ # authGuard (CanActivateFn)
│ ├── interceptors/
│ ├── pipes/
│ ├── services/ # loading, layout, confirmation
│ └── utils/
├── environments/ # apiBaseUrl per environment
└── styles/ # _tokens.scss, _ng-zorro-overrides.scss
Rule: pages/ = one folder per domain; inside it model, service, and one subfolder per screen. shared/ = only what is reusable across features.
Model and service
pages/orders/order.model.ts: interfaces (Order, OrderCreateRequest, …).pages/orders/order.service.ts: @Injectable({ providedIn: 'root' }), inject(HttpClient), Observable methods. Base: `${environment.apiBaseUrl}/api/orders`.Screens
orders-list/, order-form/) with *.component.ts/html/scss/spec.ChangeDetectionStrategy.OnPush, host: { class: 'app-orders-list' }, signals/computed.@if / @for with track; no ngClass/ngStyle.Routes
app.routes.ts: feature routes; canActivate: [authGuard] when needed.Shared (only if reusable)
shared/ only when used in more than one feature.Standalone component (Angular 21 pattern — no standalone: true)
@Component({
selector: 'app-page-header',
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'app-page-header' },
imports: [RouterLink, NzBreadCrumbModule],
templateUrl: './page-header.component.html',
styleUrl: './page-header.component.scss'
})
export class PageHeaderComponent {
title = input.required<string>();
}
Service with HttpClient
@Injectable({ providedIn: 'root' })
export class ProductService {
private readonly http = inject(HttpClient);
private readonly baseUrl = `${environment.apiBaseUrl}/api/products`;
list(): Observable<Product[]> {
return this.http.get<Product[]>(this.baseUrl);
}
}
Guard
export const authGuard: CanActivateFn = () => true; // replace with real auth
host: { class: 'app-<name>' }, input()/output() with signals.@if, @for, @switch; stable track in @for.inject(); providedIn: 'root' for globals.app.routes.ts; guards in shared/guards/. UI path segments in English (products, new, edit); API at /api/products.src/environments/ — never hardcode API URL in components.src/styles/_tokens.scss + _ng-zorro-overrides.scss; toggle via LayoutService (body.theme-dark).nzWrapClassName="app-drawer", *nzDrawerContent, CSS .app-drawer .drawer-menu (portaled to body).title + data.description on routes; AppTitleStrategy; noindex in index.html (admin app).app prefix on selectors.catchError, finalize, timeout; feedback via NzMessageService.LoadingService / global overlay in shared/services/.shared/interceptors/.development
React 19 + Next.js 16 App Router, TypeScript, Ant Design, TanStack Query, Axios, React Hook Form, Zod — Clean Architecture frontend with vertical slice by feature. Use when creating or refactoring Next.js apps, admin panels, SaaS frontends, CRUDs, forms, layouts and frontend architecture.
development
Clean Architecture + CQRS (MediatR) for .NET 10 backend APIs. Builds and maintains APIs with vertical slice (Features), Commands/Queries, handlers, validators, repositories, FluentMigrator, Refit integrations. Use when creating or refactoring .NET APIs, adding endpoints, commands, queries, entities, or when the user mentions Clean Architecture, CQRS, or MediatR.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.