bittlinkm/claude-setup/angular-webapp-conventions
Claude Code and agent skill by bittlinkm/claude-setup
- community
Checking that the SKILL.md file is still in the repository.
Use whenever writing, reviewing, or extending Angular code in the angular-webapp-template project — recognizable by provideZonelessChangeDetection() in src/app/app.config.ts, a Supabase-backed data layer, and a features/<feature>/ vertical-slice folder structure. Make sure to use this whenever the task touches new components, services, state, routing, forms, i18n, or SCSS in that codebase — even if the user doesn't explicitly ask for "conventions". Covers the actual conventions this codebase follows (feature-slice project layout, inject()-only DI, signal-based stores, the data-access token pattern, @if/@for templates, Reactive Forms without FormBuilder, Transloco usage, BEM-style SCSS naming) and explicitly calls out where the codebase is inconsistent, so generated code matches sibling files instead of generic Angular/CSS idioms. Do not use for other Angular projects or generic Angular questions — this documents one specific repo's actual, sometimes non-standard conventions, not general best practice.
Install
npx vskill@latest install bittlinkm/claude-setup/angular-webapp-conventionsSKILL.md
Frontend conventions for angular-webapp-template
Applicability check: this skill documents one specific codebase, not Angular in general. Before applying anything below, confirm you're actually in it — look for provideZonelessChangeDetection() in src/app/app.config.ts and a Supabase client service (e.g. supabase-client.service.ts). If those aren't present, this skill doesn't apply — don't carry these patterns into an unrelated Angular project.
Stack: Angular, zoneless change detection (provideZonelessChangeDetection() in src/app/app.config.ts), standalone-only (no NgModules anywhere), Angular Material + CDK, Transloco for i18n, Supabase as the backend, no NgRx. Karma/Jasmine is configured but zero `.spec.ts` files exist — see references/testing.md. Check package.json for the exact installed versions if version-specific behavior matters — don't assume a fixed version from this skill.
There is no stylelint config and only a handful of custom ESLint rules — consistency comes from matching the sibling file you're extending, not from a linter catching drift. Read the closest existing file before inventing a new pattern.
The shared ESLint/Prettier/TS-codestyle baseline (Prettier options, import ordering, security-lint subset, etc.) lives in the separate `web-tech-conventions` skill, not here — use both together; references/naming-and-linting.md below covers only what's specific to this Angular project on top of that baseline.
Read the reference file(s) relevant to the task before writing code:
- [references/architecture.md](references/architecture.md) — Vertical Slice project structure (
core/features/shared), component conventions (standalone,OnPushsplit,inject(), signals vs RxJS,@if/@for), services and the data-access token pattern, signal-based state management, routing and functional guards. - [references/styling.md](references/styling.md) — BEM-via-Sass naming,
is-*state classes, design tokens (--mat-sys-*,--border-radius-default),:host/::ng-deep/globalstyles.scssoverlay duplication. - [references/cross-cutting.md](references/cross-cutting.md) — RxJS conventions (
takeUntilDestroyed,toSignal), Reactive Forms withoutFormBuilder, Transloco i18n usage. - [references/naming-and-linting.md](references/naming-and-linting.md) — file/class naming, known repo inconsistencies (don't "fix" these unasked), and the ESLint/Prettier/tsconfig rules actually enforced.
- [references/testing.md](references/testing.md) — there is no existing spec convention; what to default to if tests are requested.
Non-negotiable architecture (most commonly violated)
- Vertical Slice Architecture (org-wide principle, see
web-tech-conventions): a feature's UI, state, data-access, models, and routes all live together underfeatures/<feature>/, not spread across layer-based top-level folders. Full detail inreferences/architecture.md. - Every component:
standalone: trueexplicit;ChangeDetectionStrategy.OnPushonly onshared/components/**, omitted on feature pages. - DI is
inject()only, field-initialized — never constructor injection. - Templates use
@if/@for/@switchexclusively — never*ngIf/*ngFor. - State = a
providedIn: 'root'service with a privatesignal()exposed.asReadonly()/computed()— no NgRx, noBehaviorSubject(one legacy exception, don't copy it). - New feature CRUD follows the three-piece data-access token pattern (
InjectionToken+ interface, Supabase implementation, binding inapp.config.ts) — seereferences/architecture.md. - Reactive Forms only, built with
new FormGroup()/new FormControl()—FormBuilderis never used. - No barrel files (
index.ts) anywhere — always import the concrete file path.
Quick recipe: building a new feature or component
- New feature page →
features/<feature>/pages/<name>/<name>.component.{ts,html,scss}; new feature CRUD → the three-piece data-access token pattern plus a signal-based store service (references/architecture.md). standalone: trueexplicit;OnPushonly if it's ashared/components/**reusable component, otherwise omitchangeDetection.inject()for all DI, field-initialized; only write aconstructor()if you need to run logic (e.g.effect()).- Template control flow:
@if/@for/@switch, never*ngIf/*ngFor. - Forms: hand-built
new FormGroup({...})/new FormControl(...), composeddefaultValidator(...)calls, bridgestatusChangesto a signal rather than readingform.validin the template (references/cross-cutting.md). - Any user-facing string goes through Transloco —
TranslocoPipein templates,inject(TranslocoService).translate(...)in TS when building data structures (references/cross-cutting.md). - CSS:
:host { display: block; }first, one root block class per visual region,&__element/&--modifiernesting,is-*for state toggles,--mat-sys-*for color, mirror anymat-menu/mat-dialogclass intosrc/styles.scsstoo (references/styling.md). - No barrel files, no
FormBuilder, no NgRx, no manualSubscription.unsubscribe()— usetakeUntilDestroyed(inject(DestroyRef))instead.
Full rationale, code shapes, and known inconsistencies for every point above are in references/.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/angular-webapp-conventions/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/bittlinkm/claude-setup/angular-webapp-conventions)