Przejdź do głównej zawartości

Przepisy na Angulara dla agentów AI działają, gdy spełnione są trzy warunki: agent wie, że pisze w Angularze 22 (zoneless, domyślnie OnPush, stabilne Signal Forms), może odpytać serwer MCP Angular CLI zamiast zgadywać, a każda zmiana przechodzi ng build, ng test uruchamiany przez Vitest i test w Playwright.

Ta strona jest dla programistów, którzy oddają pisanie kodu Angular agentom Claude Code, Codex lub Cursor. Scenariusz jest znajomy: agent tworzy komponent, który się kompiluje, spec przechodzi, a widok nigdy się nie odświeża. Agent zmienił zwykłe pole klasy tak, jak pozwalał na to Angular z Zone.js, a w twojej aplikacji nie ma już Zone.js, który by to zauważył. Albo dostajesz serwisy na BehaviorSubject, *ngIf, @HostListener i test z fakeAsync, który nie ruszy pod Vitestem.

  • Konfigurację jednym poleceniem, która daje agentowi oficjalny plik dobrych praktyk Angulara i serwer MCP Angular CLI
  • Dziesięć promptów do wklejenia dla aktualnego Angulara: komponenty, serwisy, Signal Forms, interceptory, routing, NgRx SignalStore, SSR, migracja do zoneless, mikrofrontendy i dyrektywy
  • Tabelę bramek, które zatwierdzają zmianę w Angularze bez czytania każdej linii
  • Typowe dla Angulara sposoby, w jakie psuje się kod agenta, i wyjście z każdego z nich

Których domyślnych ustawień Angulara 22 agenci nie znają?

Dział zatytułowany „Których domyślnych ustawień Angulara 22 agenci nie znają?”

Agenci uczyli się na dekadzie kodu z NgModule, Zone.js i dekoratorami. Poniższe aktualne API i ustawienia domyślne są sprzeczne z większością tych danych:

Agent piszeCo robi Angular 22Zamiast tego
Zwykłe pole klasy zmieniane w handlerze, w nadziei, że widok się odświeżyNowe aplikacje z CLI są zoneless (opcja zoneless schematu aplikacji ma domyślnie true), a ChangeDetectionStrategy.OnPush jest strategią domyślnąsignal() lub computed() odczytywane w szablonie
changeDetection: ChangeDetectionStrategy.DefaultDefault jest przestarzałe na rzecz EagerPomiń; Eager dodawaj tylko z zapisanym uzasadnieniem
provideExperimentalZonelessChangeDetection()@angular/core 22.2.0 tego nie eksportujeprovideZonelessChangeDetection() albo nic w nowej aplikacji
FormGroup w nowym formularzuSignal Forms (@angular/forms/signals: form(), [formField]) są publicznym API od 22.0Signal Forms; typowane formularze reaktywne tylko w istniejących formularzach
fakeAsync i tick() w specachng test domyślnie uruchamia Vitest i ładuje zone.js/testing tylko wtedy, gdy polyfille aplikacji zawierają zone.jsSztuczne timery Vitesta (vi.useFakeTimers()) lub await fixture.whenStable()
provideClientHydration(withIncrementalHydration())Hydracja przyrostowa jest włączona domyślnie; withIncrementalHydration() jest przestarzałe od 22.0provideClientHydration(), ewentualnie z withEventReplay()
@HostListener, @HostBinding, ngClass, CommonModuleOficjalne instrukcje Angulara dla AI zakazują ich w nowym kodzieObiekt host w dekoratorze, wiązania class i style, importy pojedynczych dyrektyw

Następna sekcja wpisuje te reguły w kontekst agenta, żeby nie trzeba było ich powtarzać w każdym prompcie.

Angular CLI dostarcza dwie rzeczy napisane z myślą o agentach. Schemat ai-config zapisuje oficjalny plik instrukcji z dobrymi praktykami Angulara i konfigurację MCP dla twojego narzędzia. Polecenie ng mcp uruchamia serwer MCP Angular CLI, którego domyślne narzędzia to między innymi get_best_practices, search_documentation, list_projects, run_target (cele build i test), narzędzia do uruchamiania, zatrzymywania i oczekiwania na serwer deweloperski oraz onpush_zoneless_migration.

Wygeneruj CLAUDE.md i projektowy .mcp.json z katalogu głównego repozytorium:

Okno terminala
npx ng generate ai-config --tool=claude-code

Jeśli CLAUDE.md już istnieje, schemat (sprawdzone w @schematics/angular 22.2.0) zostawia go bez zmian i wypisuje ostrzeżenie, a do istniejącego .mcp.json dopisuje serwer angular-cli w mcpServers. Aby przenieść wskazówki Angulara do własnego pliku, tymczasowo przenieś CLAUDE.md w inne miejsce, uruchom polecenie i scal oba pliki ręcznie. Aby dodać tylko serwer MCP, w zakresie projektu, żeby korzystał z niego cały zespół:

Okno terminala
claude mcp add --scope project angular-cli -- npx -y @angular/cli mcp

Pod wygenerowanym blokiem dopisz fakty o projekcie, których schemat nie zna:

## This repository
- Angular 22.2, standalone only, zoneless. Tests: `npx ng test --watch=false` (Vitest). Lint: `npx ng lint`.
- State: signals in components; NgRx SignalStore (`@ngrx/signals` 22) for shared feature state.
- New forms use Signal Forms. Never add `zone.js`, `fakeAsync`, `@HostListener` or `CommonModule`.
- Before you finish: `npx ng build` and `npx ng test --watch=false` must both pass. Paste their last lines.

Najważniejsza jest linia z ng build. Build produkcyjny sprawdza typy w każdym szablonie, więc błędna nazwa inputu albo brakujący import wychodzi tam, a nie dopiero podczas code review. Uzasadnienie plików kontekstu projektu znajdziesz w tekście jak przygotować kod dla agenta.

Prompty nie zależą od narzędzia. Różni się to, jak każde z nich uruchamia pętlę weryfikacji.

Wklej prompt do sesji interaktywnej; od v2.1.283 (oba kanały wydań, stan na 2026-10-12) sesja startuje w trybie auto. Aby uruchomić przepis bez interakcji w skrypcie, zezwól tylko na potrzebne polecenia:

Okno terminala
claude -p "$(cat prompts/angular-product-card.txt)" \
--permission-mode acceptEdits \
--allowedTools "Bash(npx ng build *)" "Bash(npx ng test *)"

Każdy prompt w tej sekcji podaje plik, API sygnałów i dowód, którego oczekujesz. Styl nazw plików z 2025 roku (product-card.ts, nie product-card.component.ts) jest domyślny w CLI 22.x.

Czego to dowodzi: spec ustawia inputy przez setInput() i sprawdza wyrenderowany tekst, więc nie przejdzie, jeśli szablon czyta nieaktualne pole. Spec, który tylko wywołuje metody komponentu, nie mówi nic o wykrywaniu zmian.

Zastąp serwisy na BehaviorSubject sygnałami i httpResource

Dział zatytułowany „Zastąp serwisy na BehaviorSubject sygnałami i httpResource”

resource() i httpResource() są publicznym API od 22.0, a oficjalne wytyczne CLI zalecają inject() i dekorator @Service dla nowych singletonów. Zostaw RxJS tam, gdzie masz prawdziwe strumienie; stan przenieś do sygnałów.

Signal Forms zastępują okablowanie FormGroup modelem w sygnale, funkcją schematu i dyrektywą [formField]. Potrzebne walidatory (required, email, minLength, pattern, validate, validateAsync, validateHttp, applyWhen, hidden, disabled) eksportuje @angular/forms/signals w wersji 22.2.0.

Istniejącego formularza reaktywnego nie przepisuj w tej samej zmianie. Najpierw poproś o poprawki typowania z NonNullableFormBuilder, potem migruj jeden formularz na pull request, bez zmiany testów. Wtedy testy stają się wyrocznią dla migracji.

Test równoczesnych 401 wyłapuje prawdziwe błędy. Agenci piszą odświeżanie tokena, które działa dla jednego żądania, a przy dashboardzie z trzema widżetami odpala trzy odświeżenia naraz.

Ostatnia linia zamienia pytanie „czy to naprawdę ładuje się leniwie?” w dowód. Jeśli komponenty admina trafiają do chunków początkowych, prompt nie zadziałał, niezależnie od tego, jak wygląda diff.

Zarządzaj stanem modułu funkcji przez NgRx SignalStore

Dział zatytułowany „Zarządzaj stanem modułu funkcji przez NgRx SignalStore”

ng add @angular/ssr generuje serwer oparty na AngularNodeAppEngine i trasy serwerowe z RenderMode dla każdej ścieżki. Hydrację daje provideClientHydration(), które w 22.x samo włącza hydrację przyrostową i transfer cache dla HttpClient; dokładasz tylko opcję withEventReplay(). withIncrementalHydration() jest przestarzałe od 22.0, a dzięki transfer cache odpowiedzi pobrane podczas renderowania na serwerze są używane ponownie w przeglądarce. Nie proś więc agenta o ręczny kod TransferState dla zwykłych wywołań HttpClient.

W tym przepisie serwer MCP Angular CLI naprawdę się przydaje: jego narzędzie onpush_zoneless_migration analizuje plik pod kątem wzorców zależnych od Zone.js i zwraca plan migracji, który agent potem wykonuje. Migruj po jednym folderze funkcji.

Zamrożenie asercji sprawia, że wynik można przyjąć bez czytania każdej linii: istniejące testy są specyfikacją, a agentowi nie wolno ich ruszać. Ogólny wzorzec opisuje tekst chroń wyrocznię testów, a kolejność większej migracji — modernizacja starszego kodu.

Podziel aplikację-powłokę na mikrofrontendy z Native Federation

Dział zatytułowany „Podziel aplikację-powłokę na mikrofrontendy z Native Federation”

Domyślny builder application w CLI działa na esbuild. @angular-architects/module-federation celuje w webpack, więc aktualna aplikacja z domyślnym builderem używa zamiast niego @angular-architects/native-federation, który deleguje pracę do buildera aplikacji na esbuild.

Zanim podzielisz aplikację, upewnij się, że potrzebujesz niezależnych wdrożeń. Mikrofrontendy wymieniają prostotę buildu na autonomię zespołów, a kompromisy mikroserwisów dotyczą też frontendu.

Jak sprawdzić kod Angular od agenta bez czytania każdej linii

Dział zatytułowany „Jak sprawdzić kod Angular od agenta bez czytania każdej linii”

Każda bramka odpowiada na jedno pytanie, a razem zastępują czytanie kodu linia po linii. Build i testy agent uruchamia przed zakończeniem pracy; CI uruchamia wszystkie.

BramkaPolecenieCzego dowodzi
Build ze sprawdzaniem typów w szablonachnpx ng buildSzablony wiążą się z istniejącymi inputami i outputami, importy są kompletne, budżety się mieszczą (angular.json → budgets)
Testy jednostkowe i komponentównpx ng test --watch=falseZachowanie przez DOM, w Viteście, bez podpórki w postaci Zone.js
Lintnpx ng lint po npx ng add angular-eslintReguły TypeScript i szablonów specyficzne dla Angulara, w tym konfiguracja template-accessibility
End-to-endnpx playwright testPrawdziwy routing, leniwe chunki, hydracja i formularze w przeglądarce. Zobacz testy end-to-end z agentami i Playwright MCP
DostępnośćSprawdzenia Axe w pakiecie Playwright, po npm i -D @axe-core/playwright (4.13.0 na 2026-09-26)WCAG AA, którego wymagają oficjalne instrukcje Angulara dla AI. Zobacz testy dostępności

Dwie decyzje wciąż należą do ciebie: czy kryteria akceptacji w prompcie są właściwe i czy żadna asercja nie została osłabiona, żeby dojść do zielonego wyniku. Zmianę zatwierdza recenzent, który czyta diff specyfikacji i wynik bramek, a nie diff implementacji. Wyniki dołącz do pull requesta zgodnie z opisem pakietu dowodów.

ObjawPrzyczynaCo zrobić
Widok nie odświeża się po kliknięciu lub odpowiedzi HTTPZwykłe pole zmienione w aplikacji zoneless z OnPushPoproś agenta o przeniesienie stanu szablonu do sygnałów. Nie przywracaj zone.js, żeby to ukryć
fakeAsync rzuca „zone-testing.js is needed for the fakeAsync() test helper”Spec z czasów Zone.js uruchamiany pod Vitestem w aplikacji zonelessPrzepisz spec na vi.useFakeTimers() lub await fixture.whenStable()
ng build kończy się błędem „is not a known element”, „Can’t bind to … since it isn’t a known property” albo „No pipe found with name”W imports komponentu standalone brakuje komponentu, pipe’a albo dyrektywy użytej przez wiązanie właściwościKaż agentowi uruchomić ng build przed zakończeniem pracy i naprawić każdy błąd; ten przypadek nie przejdzie na zielono
Dyrektywa atrybutowa po cichu nic nie robi, a build nie zgłasza błęduDyrektywy brakuje w imports, a szablon używa jej tylko jako zwykłego atrybutu albo wiązania zdarzenia, np. (clickOutside), które Angular kompiluje jako zwykły atrybut lub listener DOMWymagaj specu, który sprawdza efekt dyrektywy (np. że output się emituje), i sprawdź tablicę imports w diffie
Dane z resolvera lub parametry trasy przychodzą jako inputy undefinedW provideRouter brakuje withComponentInputBinding()Dodaj je raz w app.config.ts
ReferenceError: window is not defined podczas SSRAPI przeglądarki odczytywane w konstruktorzePrzenieś kod do afterNextRender() albo do serwisu chronionego sprawdzeniem platformy
Agent instaluje @angular-architects/module-federation w aplikacji na esbuildDane treningowe z czasów webpackaPrzejdź na Native Federation albo świadomie zostań przy webpacku i zapisz to w pliku kontekstu
Pamięć rośnie przy długich sesjachsubscribe() bez takeUntilDestroyed() albo nigdy nierozłączony observerPrzeszukaj diff pod kątem subscribe( i wymagaj testu zniszczenia dla każdego trafienia

Jeśli agent uparcie powtarza ten sam błędny wzorzec, popraw plik kontekstu, a nie prompt: dopisz regułę do sekcji repozytorium w CLAUDE.md lub AGENTS.md albo do reguły w Cursorze, żeby kolejna sesja od razu zaczynała poprawnie.

Czy ten artykuł Ci pomógł?

Jedno kliknięcie, bez logowania.

wcale bardzo