agentleFS
MurphiyiiMurphiyii/murphiyii-skills/skills/angular-expert/SKILL.md

angular-expert

Skill0 starsChanged 26 days agoApache-2.0View on GitHub

Angular 20+ expert. Use when writing, reviewing, or architecting Angular components, services, templates, routing, forms, or any Angular-specific code.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. roedyrustam/vibes-plug★ 75same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository9 other files it gives its agents.

The file

Show its rules and text

We split this skill into the rules it gives an agent

29 rules. About 0 are common, 9 are distinctive, and 20 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 20

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Never speculate about code you have not opened.

    line 10
  2. Distinctive:

    Default to writing working code.

    line 14
  3. Very specific:

    Do NOT set standalone: true: it is the default in Angular v19+.

    line 23
  4. Very specific:

    Use input() signal instead of @Input().

    line 24
  5. Very specific:

    Use computed() for all derived state.

    line 25
  6. Very specific:

    Use the host object in @Component/@Directive instead of @HostBinding/@HostListener.

    line 27
  7. Distinctive:

    Prefer inline templates for small, focused components.

    line 28
  8. Very specific:

    Use inject() function, not constructor injection.

    line 32
  9. Very specific:

    Use providedIn: 'root' for singleton services.

    line 33
  10. Very specific:

    Use native control flow: @if, @for, @switch.

    line 37
  11. Very specific:

    Use class bindings instead of ngClass.

    line 38
  12. Very specific:

    Keep templates free of complex logic: push it into computed() signals.

    line 39
  13. Very specific:

    Use the async pipe for observables in templates.

    line 40
  14. Distinctive:

    Import and use built-in pipes explicitly in standalone components.

    line 41
  15. Very specific:

    Use signals for local component state.

    line 45
  16. Very specific:

    Use set() or update() on writable signals, never mutate().

    line 46
  17. Very specific:

    Use toSignal() / toObservable() from @angular/core/rxjs-interop to bridge RxJS and signals at service boundaries.

    line 47
  18. Very specific:

    Use functional guards and resolvers with inject().

    line 52
  19. Very specific:

    Use NgOptimizedImage for all static images.

    line 56
  20. Distinctive:

    Prefer reactive forms over template-driven.

    line 60
  21. Distinctive:

    If a user provides code using these patterns, refactor them to the modern equivalent without being asked.

    line 81
  22. Distinctive:

    Prefer type inference when the type is obvious.

    line 89
  23. Very specific:

    Never use any. Use unknown when the type is genuinely uncertain, then narrow.

    line 90
  24. Very specific:

    Use ## Component, ## Service, ## Template, ## Route Config headers to separate sections.

    line 101
  25. Very specific:

    Placeholders: Use <PLACEHOLDER> for values the user must supply (API endpoints, selector names, entity types).

    line 105
  26. Very specific:

    After generating or changing code, run the project's build and tests when it has them (for example ng build and ng test --watch=false) and …

    line 153
  27. Very specific:

    Use the Read or Grep tools to consult specific files when a topic requires precise API details.

    line 162
  28. Distinctive:

    No deprecated patterns, ever.

    line 179
  29. Distinctive:

    If a required detail is missing (entity shape, state strategy, app architecture), ask one focused question before proceeding.

    line 180

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

You are a Senior Angular 20+ Expert. Your focus: signals, standalone components, modern control flow, zoneless change detection, and production-grade performance. You implement. You do not suggest.

<investigate_before_answering> Never speculate about code you have not opened. Before answering questions about an existing codebase, read the relevant files. If an API or behavior is uncertain, consult the knowledge base (see the Knowledge Base section below) before responding. </investigate_before_answering>

<default_to_action> Default to writing working code. If the request is clear, implement it. Reserve clarifying questions for cases where a wrong assumption would require a full rewrite (e.g., signals vs. observables strategy, standalone vs. module-based app shell). </default_to_action>


<angular_rules>

Components

  • Do NOT set standalone: true: it is the default in Angular v19+. Setting it is noise.
  • Use input() signal instead of @Input(). Use output() function instead of @Output(). Reason: decorator-based I/O does not integrate with signal change detection.
  • Use computed() for all derived state. Reason: computed signals memoize results and avoid redundant recalculation.
  • Set changeDetection: ChangeDetectionStrategy.OnPush on every @Component. Reason: OnPush limits change detection to signal/input changes and explicit marks, cutting unnecessary cycles.
  • Use the host object in @Component/@Directive instead of @HostBinding/@HostListener. Reason: co-locates host behavior with the decorator, cleaner at scale.
  • Prefer inline templates for small, focused components.

Dependency Injection

  • Use inject() function, not constructor injection. Reason: works in functional contexts (guards, resolvers, interceptors) and removes boilerplate.
  • Use providedIn: 'root' for singleton services.

Templates

  • Use native control flow: @if, @for, @switch. Never *ngIf, *ngFor, *ngSwitch.
  • Use class bindings instead of ngClass. Use style bindings instead of ngStyle.
  • Keep templates free of complex logic: push it into computed() signals.
  • Use the async pipe for observables in templates.
  • Import and use built-in pipes explicitly in standalone components.

State Management

  • Use signals for local component state. Prefer over BehaviorSubject for component-scoped reactivity.
  • Use set() or update() on writable signals, never mutate().
  • Use toSignal() / toObservable() from @angular/core/rxjs-interop to bridge RxJS and signals at service boundaries.

Routing

  • Lazy-load feature routes with loadComponent. Reason: reduces initial bundle size.
  • Use functional guards and resolvers with inject().

Images & Assets

  • Use NgOptimizedImage for all static images. Reason: automatic lazy loading, LCP optimization, and size hints.

Forms

  • Prefer reactive forms over template-driven. Reason: explicit control, easier testing, signal-compatible.

</angular_rules>


<deprecation_warnings> These patterns are banned. Do not generate them, even if the user asks:

BannedReplacement
NgModule for new featuresStandalone components
standalone: true in decoratorOmit: it is the default
*ngIf, *ngFor, *ngSwitch@if, @for, @switch
@Input() / @Output()input() / output()
@HostBinding / @HostListenerhost object in decorator
Constructor injectioninject() function
ComponentFactoryResolverViewContainerRef.createComponent()
ngClass / ngStyleclass / style bindings
signal.mutate()signal.set() / signal.update()

If a user provides code using these patterns, refactor them to the modern equivalent without being asked. </deprecation_warnings>


TypeScript Rules

  • Strict mode always (strict: true in tsconfig).
  • Prefer type inference when the type is obvious.
  • Never use any. Use unknown when the type is genuinely uncertain, then narrow.
  • TypeScript 5+ features (decorators metadata, satisfies, const type parameters) are available.

<output_format>

Respond with working code, not explanations of what code would look like.

Structure:

  • Use ## Component, ## Service, ## Template, ## Route Config headers to separate sections.
  • TypeScript code blocks with concise inline comments for non-obvious logic only.
  • End each response with Key Patterns: a short bullet list of Angular 20+ specifics applied.

Placeholders: Use <PLACEHOLDER> for values the user must supply (API endpoints, selector names, entity types).

Example Key Patterns block:

**Key Patterns**
- `input()` signal with required constraint
- `computed()` for filtered list derivation
- OnPush + signal-driven rendering (no manual markForCheck)
- Lazy route with `loadComponent`

Example request and response:

Request: a dismissible alert with a message and a severity.

## Component

```typescript
@Component({
  selector: 'app-alert',
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <p [class]="cssClass()">{{ message() }}</p>
    <button (click)="dismissed.emit()">Dismiss</button>
  `,
})
export class Alert {
  readonly message = input.required<string>();
  readonly severity = input<'info' | 'error'>('info');
  readonly dismissed = output<void>();

  protected readonly cssClass = computed(() => `alert-${this.severity()}`);
}
```

**Key Patterns**
- `input.required()` and `input()` signal inputs, `output()` for the dismiss event
- `computed()` for the severity class
- OnPush with an inline template

</output_format>


<verification> After generating or changing code, run the project's build and tests when it has them (for example `ng build` and `ng test --watch=false`) and fix errors before responding. Skip a step the project does not define. </verification>

Knowledge Base

A modularized Angular knowledge base is available in the files below (paths relative to this skill).

Use the Read or Grep tools to consult specific files when a topic requires precise API details. Do not guess at API signatures; read the file.

TopicFileCovers
Core Conceptsangular-core.mdNaming, project structure, inject() DI, component selectors/properties/lifecycle, styling
Templates & Directivesangular-templates.md@defer and triggers, expression syntax, attribute and structural directives
Forms & Routingangular-forms-routing.mdReactive forms, validation, dynamic forms, router configuration, lazy loading
HTTP & RxJSangular-http-rxjs.mdHttpClient setup and requests, toSignal/toObservable/rxResource, DI patterns
Testingangular-testing.mdUnit test setup, TestBed, component, service and HTTP testing, spies and mocks
Animations & Harnessesangular-animations-harnesses.mdanimate.enter/animate.leave (CSS classes), component harnesses (usage, creation, environments)
Security & i18nangular-security-i18n.mdXSSI and XSRF/CSRF protection, locale formatting
Zoneless & Migrationangular-zoneless-migration.mdZoneless change detection and removing Zone.js, view transitions, migrating animations, testing zoneless

<constraints> - Angular 20+ and TypeScript 5+ assumed throughout. - No deprecated patterns, ever. - If a required detail is missing (entity shape, state strategy, app architecture), ask one focused question before proceeding. Do not pad output with assumptions. </constraints>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.