<< All versions
Skill v1.0.1
currentAutomated scan100/100gentleman-programming/gentleman-skills/architecture
1 files
──Details
PublishedSeptember 30, 2026 at 08:24 AM
Content Hashsha256:79e529bafa8ce400...
Git SHAc8036a378936
Bump Typepatch
──Files
Files (1 file, 3.2 KB)
SKILL.md3.2 KBactive
SKILL.md · 149 lines · 3.2 KB
version: "1.0.1" name: angular-architecture description: > Angular architecture: Scope Rule, project structure, file naming, style guide. Trigger: When structuring Angular projects or deciding where to place components. metadata: author: gentleman-programming version: "1.0"
The Scope Rule (REQUIRED)
"Scope determines structure" - Where a component lives depends on its usage.
| Usage | Placement | |
|---|---|---|
| Used by 1 feature | features/[feature]/components/ | |
| Used by 2+ features | features/shared/components/ |
Example
features/shopping-cart/shopping-cart.ts # Main component = feature namecomponents/cart-item.ts # Used ONLY by shopping-cartcart-summary.ts # Used ONLY by shopping-cartcheckout/checkout.tscomponents/payment-form.ts # Used ONLY by checkoutshared/components/button.ts # Used by shopping-cart AND checkoutmodal.ts # Used by multiple features
Project Structure
src/app/features/[feature-name]/[feature-name].ts # Main component (same name as folder)components/ # Feature-specific componentsservices/ # Feature-specific servicesmodels/ # Feature-specific typesshared/ # ONLY for 2+ feature usagecomponents/services/pipes/core/ # App-wide singletonsservices/interceptors/guards/app.tsapp.config.tsroutes.tsmain.ts
File Naming (REQUIRED)
No .component, .service, .model suffixes. The folder tells you what it is.
✅ user-profile.ts❌ user-profile.component.ts✅ cart.ts❌ cart.service.ts✅ user.ts❌ user.model.ts
Style Guide
What We Follow (from official docs)
inject()over constructor injectionclassandstylebindings overngClass/ngStyleprotectedfor template-only membersreadonlyfor inputs, outputs, queries- Name handlers for action (
saveUser) not event (handleClick) - Keep lifecycle hooks simple - delegate to well-named methods
- One concept per file
typescript
@Component({...})export class UserProfileComponent {// 1. Injected dependenciesprivate readonly userService = inject(UserService);// 2. Inputs/Outputsreadonly userId = input.required<string>();readonly userSaved = output<User>();// 3. Internal stateprivate readonly _loading = signal(false);readonly loading = this._loading.asReadonly();// 4. Computedprotected readonly displayName = computed(() => ...);// 5. Methodssave(): void { ... }}
What We Override
| Official Says | We Do | Why | |
|---|---|---|---|
user-profile.component.ts | user-profile.ts | Redundant - folder tells context | |
user.service.ts | user.ts | Same |
Commands
bash
# New projectng new my-app --style=scss --ssr=false# Component in featureng g c features/products/components/product-card --flat# Service in featureng g s features/products/services/product --flat# Guard in coreng g g core/guards/auth --functional
Resources
- https://angular.dev/style-guide