angular-knowledge-patch
Angular v19-v21 features: linkedSignal, resource/httpResource, signal forms, route-level SSR render modes, incremental hydration, zoneless change detection, Vitest migration, and Angular Aria components.
What this skill does
# Angular Knowledge Patch (v19–v21)
**Baseline**: Angular through v18.x (signals basics, new control flow, standalone components, zoneless experimental, SSR hydration basics, esbuild builder).
This patch covers features from Angular v19 through v21 (2024-11 to 2025-11).
## Index
| Topic | File | Key APIs |
|-------|------|----------|
| Signals & Reactivity | [references/signals-and-reactivity.md](references/signals-and-reactivity.md) | `linkedSignal`, `resource`, `httpResource` |
| Signal Forms | [references/signal-forms.md](references/signal-forms.md) | `form()`, `FormField`, validators |
| SSR & Hydration | [references/ssr-and-hydration.md](references/ssr-and-hydration.md) | `RenderMode`, `ServerRoute`, incremental hydration |
| Zoneless & Testing | [references/zoneless-and-testing.md](references/zoneless-and-testing.md) | `provideZonelessChangeDetection`, Vitest |
| Components & Templates | [references/components-and-templates.md](references/components-and-templates.md) | Angular Aria, regex in templates, `@defer` viewport |
---
## Quick Reference
### Signal APIs at a glance
| API | Status | Import | Purpose |
|-----|--------|--------|---------|
| `linkedSignal` | Stable (v20) | `@angular/core` | Writable signal that resets when source changes |
| `resource` | Experimental | `@angular/core` | Signal-based async data loading |
| `httpResource` | Experimental | `@angular/common/http` | Signal-based HTTP fetching (reads only) |
| `form()` | Experimental (v21+) | `@angular/forms/signals` | Signal-based forms with schema validation |
### linkedSignal — short form
```typescript
const selected = linkedSignal(() => options()[0]);
selected.set(options()[2]); // writable
// Resets to options()[0] when options() changes
```
### resource — basic pattern
```typescript
import { resource, Signal } from '@angular/core';
const userId: Signal<string> = getUserId();
const userResource = resource({
params: () => ({ id: userId() }),
loader: ({ params, abortSignal }) =>
fetch(`/users/${params.id}`, { signal: abortSignal }),
});
// userResource.value(), .isLoading(), .error(), .hasValue()
// IMPORTANT: .value() throws in error state — guard with .hasValue()
```
### httpResource — basic pattern
```typescript
import { httpResource } from '@angular/common/http';
// Reactive URL — re-fetches when userId() changes
const user = httpResource<User>(() => `/api/user/${userId()}`);
// user.value(), .isLoading(), .error(), .hasValue(), .headers()
// Only for reads — use HttpClient directly for mutations
```
### Zoneless Angular (stable v20.2, default v21)
```typescript
bootstrapApplication(AppComponent, {
providers: [
provideZonelessChangeDetection(),
provideBrowserGlobalErrorListeners(),
],
});
// Remove zone.js polyfill from angular.json
```
### Vitest (default in v21)
```bash
# Migrate existing Jasmine tests
ng g @schematics/angular:refactor-jasmine-vitest
```
### Route-level render mode
```typescript
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRouteConfig: ServerRoute[] = [
{ path: '/login', mode: RenderMode.Server },
{ path: '/dashboard', mode: RenderMode.Client },
{
path: '/product/:id',
mode: RenderMode.Prerender,
async getPrerenderPaths() {
return (await inject(ProductService).getIds()).map((id) => ({ id }));
},
},
{ path: '/**', mode: RenderMode.Prerender },
];
```
### Incremental hydration
```typescript
provideClientHydration(withIncrementalHydration())
// Template
@defer (hydrate on viewport) {
<shopping-cart/>
}
```
### Signal Forms — minimal example
```typescript
import { form, FormField, required, email, submit } from '@angular/forms/signals';
loginModel = signal({ email: '', password: '' });
loginForm = form(this.loginModel, (schema) => {
required(schema.email, { message: 'Email is required' });
email(schema.email, { message: 'Invalid email' });
required(schema.password, { message: 'Password is required' });
});
```
Template: `<input [formField]="loginForm.email" />`, access state via `loginForm.email()` → `.value()`, `.touched()`, `.valid()`, `.errors()`, `.dirty()`, `.pending()`.
### linkedSignal — long form (preserve selection across source changes)
```typescript
const selected = linkedSignal<ShippingMethod[], ShippingMethod>({
source: shippingOptions,
computation: (newOptions, previous) =>
newOptions.find(o => o.id === previous?.value.id) ?? newOptions[0],
});
```
### httpResource — advanced request + Zod validation
```typescript
const user = httpResource(() => ({
url: `/api/user/${userId()}`,
method: 'GET',
headers: { 'X-Special': 'true' },
params: { fast: 'yes' },
}));
// Response type variants
httpResource.text(() => url);
httpResource.blob(() => url);
// Zod validation
const res = httpResource(() => `/api/people/${id()}`, {
parse: starWarsPersonSchema.parse,
});
```
### Angular Aria (developer preview, v21)
Headless accessible components: `npm i @angular/aria`. Patterns: Accordion, Combobox, Grid, Listbox, Menu, Tabs, Toolbar, Tree. Unstyled — you provide all CSS.
Related in Image & Video
watch
IncludedWatch a video (URL or local path). Downloads with yt-dlp, extracts auto-scaled frames with ffmpeg, pulls the transcript from captions (or Whisper API fallback), and hands the result to Claude so it can answer questions about what's in the video.
physical-ai-defect-image-generation
IncludedUse when the user wants to orchestrate defect image generation, run associated setup, or handle outputs on OSMO. The Day 0 path handles cold-start with USD-to-ROI, image-edit augmentation, and AnomalyGen to create initial PCBA datasets. The Day 1 path performs inference and labeling on real images. This skill helps with first-time asset setup, creation of finetuning checkpoints, and configuring deployment. Trigger keywords: defect image generation, dig workflow, dig pipeline, defect image detection workflow, aoi pipeline, aoi anomalygen, usd2roi anomalygen, day 0 pcba, day 1 pcba, day 1 real-photo alignment, day 1 manual roi, metal surface anomaly, glass defect, anomalygen finetune, setup_pcb, setup_metal, setup_glass, setup_pretrained, dig setup, dig datasets, dig pretrained checkpoint, dig image-edit endpoint.
accelint-react-best-practices
IncludedReact performance optimization and best practices. ALWAYS use this skill when working with any React code - writing components, hooks, JSX; refactoring; optimizing re-renders, memoization, state management; reviewing for performance; fixing hydration mismatches; debugging infinite re-renders, stale closures, input focus loss, animations restarting; preventing remounting; implementing transitions, lazy initialization, effect dependencies. Even simple React tasks benefit from these patterns. Covers React 19+ (useEffectEvent, Activity, ref props). Triggers - useEffect, useState, useMemo, useCallback, memo, inline components, nested components, components inside components, re-render, performance, hydration, SSR, Next.js, useDeferredValue, combined hooks.
elevenlabs-agents
IncludedBuild conversational AI voice agents with ElevenLabs Platform using React, JavaScript, React Native, or Swift SDKs. Configure agents, tools (client/server/MCP), RAG knowledge bases, multi-voice, and Scribe real-time STT. Use when: building voice chat interfaces, implementing AI phone agents with Twilio, configuring agent workflows or tools, adding RAG knowledge bases, testing with CLI "agents as code", or troubleshooting deprecated @11labs packages, Android audio cutoff, CSP violations, dynamic variables, or WebRTC config. Keywords: ElevenLabs Agents, ElevenLabs voice agents, AI voice agents, conversational AI, @elevenlabs/react, @elevenlabs/client, @elevenlabs/react-native, @elevenlabs/elevenlabs-js, @elevenlabs/agents-cli, elevenlabs SDK, voice AI, TTS, text-to-speech, ASR, speech recognition, turn-taking model, WebRTC voice, WebSocket voice, ElevenLabs conversation, agent system prompt, agent tools, agent knowledge base, RAG voice agents, multi-voice agents, pronunciation dictionary, voice speed control, elevenlabs scribe, @11labs deprecated, Android audio cutoff, CSP violation elevenlabs, dynamic variables elevenlabs, case-sensitive tool names, webhook authentication
humanizer
IncludedHumanize AI-generated text by detecting and removing patterns typical of LLM output. Rewrites text to sound natural, specific, and human. Uses 28 pattern detectors, 560+ AI vocabulary terms across 3 tiers, and statistical analysis (burstiness, type-token ratio, readability) for comprehensive detection. Use when asked to humanize text, de-AI writing, make content sound more natural/human, review writing for AI patterns, score text for AI detection, or improve AI-generated drafts. Covers content, language, style, communication, and filler categories.
generating-mermaid-diagrams
IncludedSalesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says "diagram", "visualize", "ERD", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user wants PNG/SVG image output (use generating-visual-diagrams), or asks about non-Salesforce systems.