
Angular Architect
Guide your agent to scaffold and refactor Angular apps with standalone components, signal-based state, and OnPush change detection.
Overview
Angular Architect is an agent skill for the Build phase that teaches standalone Angular components, signals, and OnPush patterns for maintainable frontend code.
Install
npx skills add https://github.com/jeffallan/claude-skills --skill angular-architectWhat is this skill?
- Standalone component pattern with explicit imports instead of NgModules
- Signal, computed, and effect APIs for reactive local state
- Signal inputs, outputs, and model() for modern parent–child binding
- OnPush change detection guidance for performance-minded components
- Copy-paste TypeScript examples for user profile and search-box patterns
Adoption & trust: 2.8k installs on skills.sh; 9.7k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your agent keeps generating NgModule-era Angular or mutable state patterns that fight Angular 17+ standalone and signals APIs.
Who is it for?
Solo builders on Angular 17+ who want agent-generated UI code to match current standalone and signals conventions.
Skip if: Teams on legacy-only NgModule stacks with no migration intent, or non-Angular frameworks where these patterns do not apply.
When should I use this skill?
Scaffolding or refactoring Angular UI with standalone components, signals, or OnPush in agent-assisted coding sessions.
What do I get? / Deliverables
New and refactored components follow standalone imports, signal state, and documented input/output patterns ready for your app’s routes and tests.
- Standalone component implementations
- Signal-based state and IO wiring in feature code
Recommended Skills
Journey fit
How it compares
Use as an Angular-specific architecture cheat sheet instead of generic React or Vue frontend skills.
Common Questions / FAQ
Who is angular-architect for?
Indie and solo developers building or refactoring Angular frontends who want agents to output modern standalone and signal-based components.
When should I use angular-architect?
During the Build phase when creating components, wiring signal inputs/outputs, or enforcing OnPush—especially after greenfield features or NgModule migrations.
Is angular-architect safe to install?
It is procedural documentation only; review the Security Audits panel on this Prism page before adding any third-party skill repo to your agent.
SKILL.md
READMESKILL.md - Angular Architect
# Standalone Components & Signals ## Standalone Component Pattern ```typescript import { Component, signal, computed, effect } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; @Component({ selector: 'app-user-profile', standalone: true, imports: [CommonModule, FormsModule], templateUrl: './user-profile.component.html', styleUrl: './user-profile.component.scss', changeDetection: ChangeDetectionStrategy.OnPush }) export class UserProfileComponent { // Signal-based state count = signal(0); doubleCount = computed(() => this.count() * 2); constructor() { // Side effects effect(() => { console.log(`Count is: ${this.count()}`); }); } increment() { this.count.update(value => value + 1); } } ``` ## Input/Output with Signals ```typescript import { Component, input, output, model } from '@angular/core'; @Component({ selector: 'app-search-box', standalone: true, template: ` <input [value]="query()" (input)="onQueryChange($event)" [placeholder]="placeholder()" /> ` }) export class SearchBoxComponent { // Signal inputs (Angular 17.1+) placeholder = input<string>('Search...'); initialQuery = input<string>(''); // Signal outputs queryChange = output<string>(); // Two-way binding with model signal query = model<string>(''); onQueryChange(event: Event) { const value = (event.target as HTMLInputElement).value; this.query.set(value); this.queryChange.emit(value); } } // Parent usage @Component({ template: ` <app-search-box [(query)]="searchQuery" [placeholder]="'Find users...'" (queryChange)="onSearch($event)" /> ` }) export class ParentComponent { searchQuery = signal(''); onSearch(query: string) { console.log('Searching:', query); } } ``` ## Smart vs Dumb Components ```typescript // Smart Component (Container) @Component({ selector: 'app-users-container', standalone: true, imports: [UserListComponent], template: ` <app-user-list [users]="users()" [loading]="loading()" (userSelected)="onUserSelected($event)" /> ` }) export class UsersContainerComponent { private usersService = inject(UsersService); users = signal<User[]>([]); loading = signal(true); constructor() { effect(() => { this.usersService.getUsers().subscribe({ next: users => { this.users.set(users); this.loading.set(false); }, error: err => console.error(err) }); }); } onUserSelected(user: User) { // Handle business logic } } // Dumb Component (Presentational) @Component({ selector: 'app-user-list', standalone: true, imports: [CommonModule], template: ` @if (loading()) { <div>Loading...</div> } @else { @for (user of users(); track user.id) { <div (click)="userSelected.emit(user)"> {{ user.name }} </div> } } `, changeDetection: ChangeDetectionStrategy.OnPush }) export class UserListComponent { users = input.required<User[]>(); loading = input<boolean>(false); userSelected = output<User>(); } ``` ## Content Projection ```typescript // Card component with multiple slots @Component({ selector: 'app-card', standalone: true, template: ` <div class="card"> <div class="card-header"> <ng-content select="[header]"></ng-content> </div> <div class="card-body"> <ng-content></ng-content> </div> <div class="card-footer"> <ng-content select="[footer]"></ng-content> </div> </div> ` }) export class CardComponent {} // Usage @Component({ template: ` <app-card> <h2 header>Card Title</h2> <p>Card content goes here</p> <button footer>Action</button> </app-card> ` }) export class ParentComponent {} ``` ## Dependency Injection ```typescript import { Component, inject } from '@angular/core';