reference-compiler-cli — Claude Code skill: Angular Compiler
A skill explaining how Angular Compiler (ngtsc) works internally: decorator compilation, the traits system, and code transformation. Use it when working with packages/compiler-cli.
npx skills add angular/angular --skill reference-compiler-cli -a claude-codeWhat reference-compiler-cli does
Angular Compiler CLI (ngtsc) wraps the TypeScript compiler to add Angular-specific features. Its job: convert decorators like @Component, @Directive, @Pipe into static class properties (Ivy instructions such as static ɵcmp = ...), perform template type checking, and compile ahead-of-time.
The compiler rests on three core ideas. First, the traits system: each class with an Angular decorator moves through states (Pending → Analyzed → Resolved → Skipped). Second, lazy analysis—processing only runs when diagnostics or emit are needed. Third, Output AST—an intermediate format that translates to TypeScript AST during emit.
Several subsystems work together. TraitCompiler manages trait lifecycles; DecoratorHandlers (ComponentDecoratorHandler, DirectiveDecoratorHandler, etc.) extract metadata and generate Ivy instructions. TemplateTypeChecker builds Type Check Blocks—TypeScript code that tsc can verify for errors. ComponentScopeReader figures out which directives and pipes a component can use. The whole pipeline runs through phases: Construction → Analysis → Resolution → Type Checking → Emit.
What it helps with
- understand Angular Compiler architecture when modifying
packages/compiler-cli - grasp the mental model of decorator compilation and code transformation
- trace how the traits system and dependency resolution work
- learn how Type Check Blocks are generated for template type checking
Example prompts for the agent
- Explain the architecture of `packages/compiler-cli` before I start editing ComponentDecoratorHandler
- Using reference-compiler-cli, walk me through how directives are resolved in a template
- Apply this skill to help me understand the traits system and compilation phases
How to install reference-compiler-cli
1Skills CLI (Vercel)
npx skills add angular/angular --skill reference-compiler-cli -a claude-code2Manually: put the files in place
~/.claude/skills/reference-compiler-cli/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/reference-compiler-cli/
1Skills CLI (Vercel)
npx skills add angular/angular --skill reference-compiler-cli -a codex2Manually: put the files in place
.agents/skills/reference-compiler-cli/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add angular/angular --skill reference-compiler-cli -a cursor2Manually: put the files in place
.cursor/skills/reference-compiler-cli/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install angular/angular reference-compiler-cli2Manually: put the files in place
.github/skills/reference-compiler-cli/SKILL.md1Skills CLI (Vercel)
npx skills add angular/angular --skill reference-compiler-cli -a gemini-cli2Platform CLI
gemini skills install https://github.com/angular/angular --path .agent/skills/reference-compiler-cliManually: put the files in place
.devin/skills/reference-compiler-cli/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add angular/angular --skill reference-compiler-cli -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set4
The whole set →Similar
Questions about reference-compiler-cli
How do I install reference-compiler-cli for Claude Code?
Run npx skills add angular/angular --skill reference-compiler-cli -a claude-code. The skill will be available at ~/.claude/skills/reference-compiler-cli/SKILL.md.
What does reference-compiler-cli do?
It explains the mental model and architecture of Angular Compiler (ngtsc): the traits system, decorator handlers, Ivy instruction generation, template type checking, and AST transformation. Use it before working on code in packages/compiler-cli.
What are the main subsystems in Angular Compiler?
Key subsystems include NgtscProgram (public API wrapping ts.Program), TraitCompiler (manages trait lifecycles), DecoratorHandlers (extract metadata for each decorator type), TemplateTypeChecker (creates Type Check Blocks), ComponentScopeReader (determines available directives and pipes), and ivyTransformFactory (transforms AST during emit).
Source text
SKILL.md · MIT
---
name: reference-compiler-cli
description: Explains the mental model and architecture of the code under `packages/compiler-cli`. You MUST use this skill any time you plan to work with code in `packages/compiler-cli`
---
# Angular Compiler CLI (`ngtsc`) Architecture
## Overview
The `packages/compiler-cli` package contains the Angular Compiler (Ivy), often referred to as `ngtsc`. It is a wrapper around the TypeScript compiler (`tsc`) that extends it with Angular-specific capabilities.
The core goal of `ngtsc` is to compile Angular decorators (like `@Component`, `@Directive`, `@Pipe`) into static properties on the class (Ivy instructions, e.g., `static ɵcmp = ...`). It also performs template type checking and ahead-of-time (AOT) compilation.
## Mental Model
The compiler is designed as a **lazy, incremental, and partial** compilation pipeline.
1. **Wrapper Pattern**: `NgtscProgram` wraps the standard `ts.Program`. It intercepts calls to act as a drop-in replacement for standard tooling.
2. **Traits System**: Every class with an Angular decorator is considered a "Trait". The compiler manages the state of these traits through a state machine:
- **Pending**: Detected but not processed.
- **Analyzed**: Metadata extracted, template parsed (but dependencies not yet linked).
- **Resolved**: Dependencies (directives/pipes in template) resolved, import cycles handled.
- **Skipped**: Not an Angular class.
3. **Lazy Analysis**: Analysis only happens when necessary (e.g., when diagnostics are requested or emit is prepared).
4. **Output AST**: The compiler generates an intermediate "Output AST" (`o.Expression`) for the generated code, which is then translated into TypeScript AST nodes during the emit phase.
## Key Subsystems
### 1. Core Orchestration (`ngtsc/core`)
- **`NgtscProgram`**: The public API implementing `api.Program`. It manages the `ts.Program` and the `NgCompiler`.
- **`NgCompiler`**: The brain of the compiler. It orchestrates the compilation phases (Analysis, Resolution, Type Checking, Emit). It holds the `TraitCompiler`.
### 2. Trait Compilation (`ngtsc/transform`)
- **`TraitCompiler`**: Manages the lifecycle of "Traits". It iterates over source files, identifies decorated classes, and delegates to the appropriate `DecoratorHandler`.
- **`Trait`**: A state container for a class, holding its handler, analysis results, and resolution results.
### 3. Decorator Handlers (`ngtsc/annotations`)
- **`DecoratorHandler`**: An interface for handling specific decorators.
- **`ComponentDecoratorHandler`**: The most complex handler. It:
- Extracts metadata (selector, inputs, outputs).
- Parses the template.
- Resolves used directives and pipes (`R3TargetBinder`).
- Generates the `ɵcmp` instruction.
- **`DirectiveDecoratorHandler`**, **`PipeDecoratorHandler`**, **`NgModuleDecoratorHandler`**: Handle their respective decorators.
### 4. Template Type Checking (`ngtsc/typecheck`)
- **`TemplateTypeChecker`**: Generates "Type Check Blocks" (TCBs). A TCB is a block of TypeScript code that represents the template's logic in a way `tsc` can understand and check for errors.
- **`generateTypeCheckBlock`** (from `@angular/compiler`, called by `TypeCheckFile` and `InlineTcbOp`): Generates TypeScript source for checking template bindings, events, directive usage, and host bindings.
### 5. Metadata & Scope (`ngtsc/metadata`, `ngtsc/scope`)
- **`MetadataReader`**: Reads Angular metadata from source files (using `LocalMetadataRegistry`) and `.d.ts` files (using `DtsMetadataReader`).
- **`ComponentScopeReader`**: Determines the "compilation scope" of a component (which directives/pipes are available to it), handling `NgModule` transitive exports and Standalone Component imports.
### 6. Emit & Transformation (`ngtsc/transform`)
- **`ivyTransformFactory`**: A TypeScript transformer factory.
- **`IvyCompilationVisitor`**: Visits classes, triggers compilation via `TraitCompiler`, and collects the Output AST.
- **`IvyTransformationVisitor`**: Translates the Output AST into TypeScript AST, injects the `static ɵ...` fields, and removes the original decorators.
## Compilation Phases
1. **Construction**: `NgtscProgram` creates `NgCompiler`, which sets up all registries and the `TraitCompiler`.
2. **Analysis** (`analyzeSync`):
- The `TraitCompiler` scans files.
- `DecoratorHandler`s extract metadata and parse templates.
- No cross-file resolution happens here (allowing for parallelism and caching).
3. **Resolution** (`resolve`):
- `TraitCompiler` resolves traits.
- Components link their templates to specific Directives and Pipes (found via `ComponentScopeReader`).
- Import cycles are detected and handled (e.g., via "remote scoping").
4. **Type Checking**:
- `TemplateTypeChecker` creates TCBs for all components.
- TypeScript diagnostics are retrieved for these TCBs.
5. **Emit** (`prepareEmit`):
- `ivyTransformFactory` is created.
- TS `emit` is called.
- The transformers run, injecting the compiled Ivy instructions into the JS/DTS output.
## Important File Locations
- `packages/compiler-cli/src/ngtsc/program.ts`: Entry point (`NgtscProgram`).
- `packages/compiler-cli/src/ngtsc/core/src/compiler.ts`: Core logic (`NgCompiler`).
- `packages/compiler-cli/src/ngtsc/transform/src/trait.ts`: Trait state machine.
- `packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts`: Component compilation logic.
- `packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts`: Type checking logic (`TemplateTypeCheckerImpl`).
- `packages/compiler-cli/src/ngtsc/transform/src/transform.ts`: AST transformation logic.
© angular · MIT · angular/angular