Learn-skills.dev capabilitys-layer
Patterns for implementing features under src/app/capabilitys, including presentation/application/domain/integration boundaries, NgRx Signals stores, event-driven communication, and Angular 20 template rules; use when adding or changing a capability.
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/7spade/black-tortoise/capabilitys-layer" ~/.claude/skills/neversight-learn-skills-dev-capabilitys-layer && rm -rf "$T"
manifest:
data/skills-md/7spade/black-tortoise/capabilitys-layer/SKILL.mdsource content
Capabilitys Layer
Intent
Deliver independent capabilities as bounded contexts that interact only via events and the workspace context.
Structure Rules
- Keep each capability cohesive: UI + application orchestration + domain model (if needed).
- Do not create cross-capability imports for business logic; communicate via events.
State Management
- Use
stores as the source of truth for capability state.@ngrx/signals - Derive view state via computed signals; avoid mutable arrays/objects and avoid
..push() - Async side effects run through
+rxMethod
with explicit operator choice.tapResponse
Event-Driven Interactions
- Publish domain/application events after persistence (append-before-publish).
- Subscribe to events in application stores/effects, not in presentation components.
UI Rules
- Standalone, zone-less components.
- Templates bind to signals only and use Angular control flow (
,@if
,@for
,@switch
).@defer - Material Design 3 token usage only; no hardcoded colors.
Data Boundaries
- Infrastructure returns Observables/Promises; convert to signals before templates.
- Do not leak Firebase/DataConnect DTOs outside integration/infrastructure.
Testing Expectations
- Cover critical flows with unit tests for store transitions and Playwright for happy paths.
- Use stable selectors (
, roles/labels).data-testid