@smartsoft001-mobilems/claude-plugins 2.85.0 → 2.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.claude-plugin/marketplace.json +2 -6
  2. package/package.json +2 -2
  3. package/plugins/mobilems/.claude-plugin/README.md +30 -0
  4. package/plugins/mobilems/.claude-plugin/plugin.json +5 -0
  5. package/plugins/mobilems/scripts/refresh-mobilems-api-spec.sh +372 -0
  6. package/plugins/mobilems/skills/mobilems-articles/SKILL.md +84 -0
  7. package/plugins/mobilems/skills/mobilems-articles/references/lib-contents.md +164 -0
  8. package/plugins/mobilems/skills/mobilems-articles/references/module-and-routes.md +146 -0
  9. package/plugins/mobilems/skills/mobilems-articles/references/shared-components.md +56 -0
  10. package/plugins/mobilems/skills/mobilems-articles/scripts/detect-init.sh +29 -0
  11. package/plugins/mobilems/skills/mobilems-articles/scripts/verify-module.sh +61 -0
  12. package/plugins/mobilems/skills/mobilems-docs-reader/SKILL.md +116 -0
  13. package/plugins/mobilems/skills/mobilems-events/SKILL.md +65 -0
  14. package/plugins/mobilems/skills/mobilems-events/references/lib-contents.md +212 -0
  15. package/plugins/mobilems/skills/mobilems-events/references/module-and-routes.md +113 -0
  16. package/plugins/mobilems/skills/mobilems-events/scripts/detect-init.sh +29 -0
  17. package/plugins/mobilems/skills/mobilems-events/scripts/verify-module.sh +59 -0
  18. package/plugins/mobilems/skills/mobilems-object-collections/SKILL.md +52 -0
  19. package/plugins/mobilems/skills/mobilems-object-collections/references/lib-contents.md +76 -0
  20. package/plugins/mobilems/skills/mobilems-object-collections/references/module-and-routes.md +116 -0
  21. package/plugins/mobilems/skills/mobilems-object-collections/references/shared-components.md +61 -0
  22. package/plugins/mobilems/skills/mobilems-object-collections/scripts/detect-init.sh +29 -0
  23. package/plugins/mobilems/skills/mobilems-object-collections/scripts/verify-module.sh +44 -0
  24. package/plugins/mobilems/skills/mobilems-objects/SKILL.md +52 -0
  25. package/plugins/mobilems/skills/mobilems-objects/references/lib-contents.md +68 -0
  26. package/plugins/mobilems/skills/mobilems-objects/references/module-and-routes.md +108 -0
  27. package/plugins/mobilems/skills/mobilems-objects/references/shared-components.md +69 -0
  28. package/plugins/mobilems/skills/mobilems-objects/scripts/detect-init.sh +29 -0
  29. package/plugins/mobilems/skills/mobilems-objects/scripts/verify-module.sh +51 -0
  30. package/plugins/mobilems/skills/mobilems-partners/SKILL.md +65 -0
  31. package/plugins/mobilems/skills/mobilems-partners/references/lib-contents.md +160 -0
  32. package/plugins/mobilems/skills/mobilems-partners/references/module-and-routes.md +125 -0
  33. package/plugins/mobilems/skills/mobilems-partners/scripts/detect-init.sh +29 -0
  34. package/plugins/mobilems/skills/mobilems-partners/scripts/verify-module.sh +59 -0
  35. package/plugins/mobilems/skills/mobilems-project-init/SKILL.md +134 -0
  36. package/plugins/mobilems/skills/mobilems-project-init/references/app-shell.md +107 -0
  37. package/plugins/mobilems/skills/mobilems-project-init/references/claude-config.md +44 -0
  38. package/plugins/mobilems/skills/mobilems-project-init/references/config-providers.md +203 -0
  39. package/plugins/mobilems/skills/mobilems-project-init/references/npm-deps.md +66 -0
  40. package/plugins/mobilems/skills/mobilems-project-init/references/server-env.md +89 -0
  41. package/plugins/mobilems/skills/mobilems-project-init/references/shared-lib.md +125 -0
  42. package/plugins/mobilems/skills/mobilems-project-init/references/tailwind-styles.md +106 -0
  43. package/plugins/mobilems/skills/mobilems-project-init/scripts/classify-shared-components.py +114 -0
  44. package/plugins/mobilems/skills/mobilems-project-init/scripts/detect-base.sh +49 -0
  45. package/plugins/mobilems/skills/mobilems-project-init/scripts/verify-init.sh +73 -0
  46. package/plugins/mobilems/skills/mobilems-thematic-publications/SKILL.md +60 -0
  47. package/plugins/mobilems/skills/mobilems-thematic-publications/references/lib-contents.md +134 -0
  48. package/plugins/mobilems/skills/mobilems-thematic-publications/references/module-and-routes.md +107 -0
  49. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/detect-init.sh +29 -0
  50. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/verify-module.sh +56 -0
  51. package/plugins/flow/.claude-plugin/README.md +0 -91
  52. package/plugins/flow/.claude-plugin/merge-permissions.js +0 -97
  53. package/plugins/flow/.claude-plugin/plugin.json +0 -5
  54. package/plugins/flow/.claude-plugin/settings.template.json +0 -86
  55. package/plugins/flow/agents/angular-component-scaffolder.md +0 -175
  56. package/plugins/flow/agents/angular-directive-builder.md +0 -153
  57. package/plugins/flow/agents/angular-guard-builder.md +0 -243
  58. package/plugins/flow/agents/angular-jest-test-writer.md +0 -474
  59. package/plugins/flow/agents/angular-pipe-builder.md +0 -169
  60. package/plugins/flow/agents/angular-resolver-builder.md +0 -286
  61. package/plugins/flow/agents/angular-service-builder.md +0 -161
  62. package/plugins/flow/agents/angular-signal-state-builder.md +0 -339
  63. package/plugins/flow/agents/angular-test-diagnostician.md +0 -279
  64. package/plugins/flow/agents/angular-testbed-configurator.md +0 -315
  65. package/plugins/flow/agents/arch-scaffolder.md +0 -278
  66. package/plugins/flow/agents/e2e-data-testid-injector.md +0 -197
  67. package/plugins/flow/agents/e2e-project-scaffolder.md +0 -194
  68. package/plugins/flow/agents/e2e-test-writer.md +0 -350
  69. package/plugins/flow/agents/shared-agent-evolver.md +0 -294
  70. package/plugins/flow/agents/shared-build-verifier.md +0 -160
  71. package/plugins/flow/agents/shared-config-updater.md +0 -310
  72. package/plugins/flow/agents/shared-coverage-enforcer.md +0 -184
  73. package/plugins/flow/agents/shared-error-handler.md +0 -217
  74. package/plugins/flow/agents/shared-file-creator.md +0 -344
  75. package/plugins/flow/agents/shared-impl-orchestrator.md +0 -312
  76. package/plugins/flow/agents/shared-impl-reporter.md +0 -368
  77. package/plugins/flow/agents/shared-impl-teammate.md +0 -201
  78. package/plugins/flow/agents/shared-linear-subtask-iterator.md +0 -337
  79. package/plugins/flow/agents/shared-logic-implementer.md +0 -243
  80. package/plugins/flow/agents/shared-maia-api.md +0 -26
  81. package/plugins/flow/agents/shared-parallelization-analyzer.md +0 -343
  82. package/plugins/flow/agents/shared-performance-validator.md +0 -168
  83. package/plugins/flow/agents/shared-plan-perspective.md +0 -269
  84. package/plugins/flow/agents/shared-project-standardizer.md +0 -205
  85. package/plugins/flow/agents/shared-report-synthesizer.md +0 -188
  86. package/plugins/flow/agents/shared-review-teammate.md +0 -189
  87. package/plugins/flow/agents/shared-security-scanner.md +0 -186
  88. package/plugins/flow/agents/shared-style-enforcer.md +0 -230
  89. package/plugins/flow/agents/shared-subtask-dependency-analyzer.md +0 -188
  90. package/plugins/flow/agents/shared-tdd-developer.md +0 -350
  91. package/plugins/flow/agents/shared-team-coordinator.md +0 -189
  92. package/plugins/flow/agents/shared-test-fixer.md +0 -186
  93. package/plugins/flow/agents/shared-test-runner.md +0 -191
  94. package/plugins/flow/agents/shared-ui-classifier.md +0 -263
  95. package/plugins/flow/agents/shared-verification-orchestrator.md +0 -194
  96. package/plugins/flow/agents/shared-verification-runner.md +0 -140
  97. package/plugins/flow/agents/ui-a11y-validator.md +0 -305
  98. package/plugins/flow/agents/ui-screenshot-reporter.md +0 -329
  99. package/plugins/flow/agents/ui-web-designer.md +0 -214
  100. package/plugins/flow/scripts/compute-session-tokens.sh +0 -39
  101. package/plugins/flow/skills/a11y-audit/SKILL.md +0 -214
  102. package/plugins/flow/skills/angular-patterns/SKILL.md +0 -191
  103. package/plugins/flow/skills/browser-capture/SKILL.md +0 -238
  104. package/plugins/flow/skills/commit/SKILL.md +0 -259
  105. package/plugins/flow/skills/debug-helper/SKILL.md +0 -375
  106. package/plugins/flow/skills/impl/SKILL.md +0 -992
  107. package/plugins/flow/skills/linear-suggestion/SKILL.md +0 -132
  108. package/plugins/flow/skills/maia-files-delete/SKILL.md +0 -59
  109. package/plugins/flow/skills/maia-files-upload/SKILL.md +0 -57
  110. package/plugins/flow/skills/nx-conventions/SKILL.md +0 -326
  111. package/plugins/flow/skills/plan/SKILL.md +0 -1033
  112. package/plugins/flow/skills/push/SKILL.md +0 -759
  113. package/plugins/flow/skills/review/SKILL.md +0 -443
  114. package/plugins/flow/skills/test-e2e/SKILL.md +0 -161
  115. package/plugins/flow/skills/test-unit/SKILL.md +0 -456
  116. package/plugins/flow-external/.claude-plugin/README.md +0 -152
  117. package/plugins/flow-external/.claude-plugin/merge-permissions.js +0 -80
  118. package/plugins/flow-external/.claude-plugin/plugin.json +0 -5
  119. package/plugins/flow-external/.claude-plugin/settings.template.json +0 -78
  120. package/plugins/flow-external/agents/angular-component-scaffolder.md +0 -269
  121. package/plugins/flow-external/agents/angular-directive-builder.md +0 -130
  122. package/plugins/flow-external/agents/angular-guard-builder.md +0 -70
  123. package/plugins/flow-external/agents/angular-pipe-builder.md +0 -82
  124. package/plugins/flow-external/agents/angular-resolver-builder.md +0 -74
  125. package/plugins/flow-external/agents/angular-service-builder.md +0 -160
  126. package/plugins/flow-external/agents/angular-state-builder.md +0 -254
  127. package/plugins/flow-external/agents/shared-build-verifier.md +0 -67
  128. package/plugins/flow-external/agents/shared-impl-orchestrator.md +0 -88
  129. package/plugins/flow-external/agents/shared-impl-reporter.md +0 -135
  130. package/plugins/flow-external/agents/shared-linear-subtask-iterator.md +0 -70
  131. package/plugins/flow-external/agents/shared-ui-classifier.md +0 -38
  132. package/plugins/flow-external/agents/ui-web-designer.md +0 -179
  133. package/plugins/flow-external/scripts/compute-session-tokens.sh +0 -39
  134. package/plugins/flow-external/skills/a11y-audit/SKILL.md +0 -96
  135. package/plugins/flow-external/skills/angular-cli-conventions/SKILL.md +0 -267
  136. package/plugins/flow-external/skills/angular-patterns/SKILL.md +0 -170
  137. package/plugins/flow-external/skills/browser-capture/SKILL.md +0 -68
  138. package/plugins/flow-external/skills/commit/SKILL.md +0 -114
  139. package/plugins/flow-external/skills/debug-helper/SKILL.md +0 -131
  140. package/plugins/flow-external/skills/impl/SKILL.md +0 -217
  141. package/plugins/flow-external/skills/linear-suggestion/SKILL.md +0 -62
  142. package/plugins/flow-external/skills/maia-files-delete/SKILL.md +0 -34
  143. package/plugins/flow-external/skills/maia-files-upload/SKILL.md +0 -41
  144. package/plugins/flow-external/skills/plan/SKILL.md +0 -334
  145. package/plugins/flow-external/skills/push/SKILL.md +0 -232
  146. package/plugins/flow-legacy/.claude-plugin/README.md +0 -143
  147. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +0 -94
  148. package/plugins/flow-legacy/.claude-plugin/plugin.json +0 -5
  149. package/plugins/flow-legacy/.claude-plugin/settings.template.json +0 -79
  150. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +0 -323
  151. package/plugins/flow-legacy/agents/angular-directive-builder.md +0 -258
  152. package/plugins/flow-legacy/agents/angular-guard-builder.md +0 -322
  153. package/plugins/flow-legacy/agents/angular-pipe-builder.md +0 -227
  154. package/plugins/flow-legacy/agents/angular-resolver-builder.md +0 -332
  155. package/plugins/flow-legacy/agents/angular-service-builder.md +0 -271
  156. package/plugins/flow-legacy/agents/angular-state-builder.md +0 -479
  157. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +0 -174
  158. package/plugins/flow-legacy/agents/shared-impl-reporter.md +0 -232
  159. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +0 -187
  160. package/plugins/flow-legacy/agents/shared-tdd-developer.md +0 -306
  161. package/plugins/flow-legacy/agents/shared-test-runner.md +0 -131
  162. package/plugins/flow-legacy/agents/shared-ui-classifier.md +0 -145
  163. package/plugins/flow-legacy/scripts/compute-session-tokens.sh +0 -39
  164. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +0 -214
  165. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +0 -346
  166. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +0 -238
  167. package/plugins/flow-legacy/skills/commit/SKILL.md +0 -215
  168. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +0 -395
  169. package/plugins/flow-legacy/skills/impl/SKILL.md +0 -710
  170. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +0 -132
  171. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +0 -59
  172. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +0 -57
  173. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +0 -368
  174. package/plugins/flow-legacy/skills/plan/SKILL.md +0 -742
  175. package/plugins/flow-legacy/skills/push/SKILL.md +0 -645
  176. package/plugins/flow-legacy/skills/test-unit/SKILL.md +0 -500
@@ -1,271 +0,0 @@
1
- ---
2
- name: angular-service-builder
3
- description: Create Angular 14 injectable services with BehaviorSubject and constructor DI. Use when building services for data management and business logic in legacy projects.
4
- tools: Read, Write, Glob, Grep
5
- model: sonnet
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular 14 services following legacy best practices.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular services using Angular 14 patterns including `BehaviorSubject` for reactive state and constructor injection for dependency injection.
14
-
15
- ## When to Use
16
-
17
- - Creating new Angular services in legacy projects (Angular 14)
18
- - Building data access services
19
- - Implementing state management with BehaviorSubject/Observable
20
-
21
- ## CRITICAL: Angular 14 Patterns (MANDATORY)
22
-
23
- **NEVER use modern Angular 20+ patterns. ALWAYS use these legacy patterns:**
24
-
25
- | Feature | ✅ CORRECT (Angular 14) | ❌ WRONG (Angular 20+) |
26
- |---------|------------------------|----------------------|
27
- | DI | Constructor injection | `inject()` |
28
- | Reactive state | `BehaviorSubject` | `signal()` |
29
- | Public state | `.asObservable()` | `.asReadonly()` |
30
- | Derived state | `pipe(map())` or getter | `computed()` |
31
- | Side effects | `subscribe()` | `effect()` |
32
-
33
- ## Project-Specific Patterns
34
-
35
- This project uses:
36
-
37
- - **`@Injectable({ providedIn: 'root' })`** for root-level services
38
- - **`@Injectable()`** (without providedIn) for module-scoped services
39
- - **`BehaviorSubject`** for reactive state
40
- - **`.asObservable()`** to expose state publicly
41
- - **Constructor injection** for DI (NOT `inject()`)
42
-
43
- ## Service Templates
44
-
45
- ### Root-Level Service with BehaviorSubject
46
-
47
- ```typescript
48
- import { Injectable } from '@angular/core';
49
- import { BehaviorSubject, Observable } from 'rxjs';
50
-
51
- export interface ModalConfig {
52
- title?: string;
53
- message: string;
54
- confirmText?: string;
55
- cancelText?: string;
56
- }
57
-
58
- @Injectable({
59
- providedIn: 'root',
60
- })
61
- export class ModalService {
62
- // Private BehaviorSubjects (NOT signals)
63
- private readonly _isOpen$ = new BehaviorSubject<boolean>(false);
64
- private readonly _config$ = new BehaviorSubject<ModalConfig | null>(null);
65
-
66
- // Public Observables (NOT readonly signals)
67
- readonly isOpen$: Observable<boolean> = this._isOpen$.asObservable();
68
- readonly config$: Observable<ModalConfig | null> = this._config$.asObservable();
69
-
70
- // Synchronous getters for current value (when needed)
71
- get isOpen(): boolean {
72
- return this._isOpen$.getValue();
73
- }
74
-
75
- get config(): ModalConfig | null {
76
- return this._config$.getValue();
77
- }
78
-
79
- open(config: ModalConfig): void {
80
- this._config$.next(config);
81
- this._isOpen$.next(true);
82
- }
83
-
84
- close(): void {
85
- this._isOpen$.next(false);
86
- this._config$.next(null);
87
- }
88
- }
89
- ```
90
-
91
- ### Service with Constructor Injection
92
-
93
- ```typescript
94
- import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
95
- import { isPlatformBrowser } from '@angular/common';
96
- import { TranslateService } from '@ngx-translate/core';
97
-
98
- @Injectable({ providedIn: 'root' })
99
- export class LocalStorageService {
100
- // Constructor injection (NOT inject())
101
- constructor(
102
- private readonly translateService: TranslateService,
103
- @Inject(PLATFORM_ID) private readonly platformId: Object
104
- ) {}
105
-
106
- initLang(forceLang?: string): void {
107
- if (isPlatformBrowser(this.platformId)) {
108
- const savedLang = localStorage.getItem('LANGUAGE');
109
- const lang = forceLang ?? savedLang ?? 'pl';
110
- this.translateService.use(lang);
111
- }
112
- }
113
-
114
- saveLanguagePreference(lang: string): void {
115
- if (typeof localStorage !== 'undefined') {
116
- localStorage.setItem('LANGUAGE', lang);
117
- }
118
- }
119
- }
120
- ```
121
-
122
- ### Data Service with HTTP
123
-
124
- ```typescript
125
- import { Injectable } from '@angular/core';
126
- import { HttpClient } from '@angular/common/http';
127
- import { BehaviorSubject, Observable } from 'rxjs';
128
- import { map, tap, catchError } from 'rxjs/operators';
129
-
130
- import { environment } from '@env/environment';
131
-
132
- export interface Item {
133
- id: string;
134
- name: string;
135
- }
136
-
137
- @Injectable({
138
- providedIn: 'root',
139
- })
140
- export class ItemService {
141
- private readonly _items$ = new BehaviorSubject<Item[]>([]);
142
- private readonly _isLoading$ = new BehaviorSubject<boolean>(false);
143
- private readonly _error$ = new BehaviorSubject<string | null>(null);
144
-
145
- readonly items$: Observable<Item[]> = this._items$.asObservable();
146
- readonly isLoading$: Observable<boolean> = this._isLoading$.asObservable();
147
- readonly error$: Observable<string | null> = this._error$.asObservable();
148
-
149
- // Derived Observable (NOT computed())
150
- readonly itemCount$: Observable<number> = this._items$.pipe(
151
- map(items => items.length)
152
- );
153
-
154
- readonly hasItems$: Observable<boolean> = this._items$.pipe(
155
- map(items => items.length > 0)
156
- );
157
-
158
- constructor(private readonly http: HttpClient) {}
159
-
160
- loadItems(): Observable<Item[]> {
161
- this._isLoading$.next(true);
162
- this._error$.next(null);
163
-
164
- return this.http.get<Item[]>(`${environment.apiUrl}/items`).pipe(
165
- tap(items => {
166
- this._items$.next(items);
167
- this._isLoading$.next(false);
168
- }),
169
- catchError(error => {
170
- this._error$.next(error.message);
171
- this._isLoading$.next(false);
172
- throw error;
173
- })
174
- );
175
- }
176
-
177
- addItem(item: Item): void {
178
- const current = this._items$.getValue();
179
- this._items$.next([...current, item]);
180
- }
181
-
182
- removeItem(id: string): void {
183
- const current = this._items$.getValue();
184
- this._items$.next(current.filter(item => item.id !== id));
185
- }
186
-
187
- updateItem(id: string, updates: Partial<Item>): void {
188
- const current = this._items$.getValue();
189
- this._items$.next(
190
- current.map(item =>
191
- item.id === id ? { ...item, ...updates } : item
192
- )
193
- );
194
- }
195
- }
196
- ```
197
-
198
- ### Data Service Extending Base
199
-
200
- ```typescript
201
- import { Injectable } from '@angular/core';
202
- import { CrudBaseService } from '@smartsoft001-mobilems/angular';
203
- import { firstValueFrom } from 'rxjs';
204
-
205
- import { environment } from '@env/environment';
206
- import { FeatureModel } from '../models/feature.model';
207
-
208
- @Injectable()
209
- export class FeatureService extends CrudBaseService<FeatureModel> {
210
- getUrlNameForDetails(): string {
211
- return 'feature';
212
- }
213
-
214
- protected override getBaseListUrl(
215
- page: number,
216
- filter: { limit: number; searchText?: string }
217
- ): string {
218
- let url = `${this.config.apiUrl}feature/search/page/${page}?maxPerPage=${filter.limit}`;
219
- if (filter.searchText) {
220
- url += `&q=${encodeURIComponent(filter.searchText)}`;
221
- }
222
- return url;
223
- }
224
-
225
- getUrlNameForList(): string {
226
- return '';
227
- }
228
- }
229
- ```
230
-
231
- ## Checklist
232
-
233
- - [ ] Uses `@Injectable({ providedIn: 'root' })` for root services
234
- - [ ] Uses constructor injection (NOT `inject()`)
235
- - [ ] Uses `BehaviorSubject` for reactive state (NOT signals)
236
- - [ ] Uses `.asObservable()` for public state (NOT `.asReadonly()`)
237
- - [ ] Private subjects prefixed with `_` and suffixed with `$`
238
- - [ ] Public observables suffixed with `$`
239
- - [ ] SSR-safe (checks `isPlatformBrowser` for browser APIs)
240
- - [ ] Uses `@Inject()` decorator for injection tokens
241
-
242
- ## Output Format
243
-
244
- ```markdown
245
- ## Service Created
246
-
247
- ### File
248
-
249
- `feature.service.ts`
250
-
251
- ### API
252
-
253
- | Method | Parameters | Returns | Description |
254
- | ------- | --------------------- | ------------------- | ------------ |
255
- | `open` | `config: ModalConfig` | `void` | Opens modal |
256
- | `close` | - | `void` | Closes modal |
257
-
258
- ### Observables
259
-
260
- | Observable | Type | Description |
261
- | ---------- | ----------------------------------- | ---------------- |
262
- | `isOpen$` | `Observable<boolean>` | Modal open state |
263
- | `config$` | `Observable<ModalConfig \| null>` | Current config |
264
-
265
- ### Angular 14 Patterns Used
266
-
267
- - ✅ Constructor injection
268
- - ✅ BehaviorSubject for state
269
- - ✅ .asObservable() for public state
270
- - ✅ pipe(map()) for derived values
271
- ```